Пиков / КАПО
Как читать авторский курс и нормативные материалы

Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.

П22. ELF dynamic dependencies

Цель

Снять с готового ELF-бинаря список динамически слинкованных библиотек (записи DT_NEEDED) и смаппить каждую .so на установленный DEB-пакет с версией. Проверяемый результат: таблица «.so → DEB-пакет → версия → PURL pkg:deb/...», где для каждой динамической библиотеки заполнены все четыре колонки или явно отмечено unresolved.

Команда или действие

# 1. динамические зависимости из секции .dynamic (надёжнее ldd: не запускает бинарь)
readelf -d ./app | grep NEEDED

# 2. фактические пути, по которым резолвятся .so на этой системе
ldd ./app

# 3. маппинг конкретной .so на DEB-пакет
dpkg -S $(ldconfig -p | awk '/libssl.so.3/{print $NF; exit}')

# 4. версия пакета для PURL
dpkg-query -W -f='${Package} ${Version}\n' libssl3

readelf -d против ldd ldd показывает, что фактически подгрузится (с учётом RPATH/LD_LIBRARY_PATH), но для этого по сути запускает динамический загрузчик — на чужом бинаре это нежелательно. readelf -d ./app | grep NEEDED читает секцию .dynamic статически, ничего не исполняя. Для инвентаризации опирайтесь на readelf, ldd используйте для уточнения путей.

Что вы должны увидеть

readelf -d — записи NEEDED (фрагмент):

 0x0000000000000001 (NEEDED) Shared library: [libssl.so.3]
 0x0000000000000001 (NEEDED) Shared library: [libcrypto.so.3]
 0x0000000000000001 (NEEDED) Shared library: [libz.so.1]
 0x0000000000000001 (NEEDED) Shared library: [libc.so.6]

dpkg -S — путь → пакет:

libssl3:amd64: /usr/lib/x86_64-linux-gnu/libssl.so.3

Итоговая таблица (ориентир: число строк равно числу NEEDED за вычетом libc/libstdc++, которые учитываются как системный runtime):

.so DEB-пакет Версия PURL
libssl.so.3 libssl3 3.0.11-1~deb12u2 pkg:deb/debian/libssl3@3.0.11-1~deb12u2?arch=amd64
libz.so.1 zlib1g 1:1.2.13.dfsg-1 pkg:deb/debian/zlib1g@1.2.13.dfsg-1?arch=amd64

Чего здесь принципиально не видно В DT_NEEDED попадают только динамические библиотеки. Если OpenSSL вшит статически (.a), его в этом списке нет вообще — и это не ошибка снятия, а слепая зона: переходите к П23. Статическая линковка как слепая зона.

Если не получилось

Критерий зачёта

Показать преподавателю: вывод readelf -d ./app | grep NEEDED и заполненную таблицу «.so → DEB-пакет → версия → PURL» по всем динамическим библиотекам бинаря. Каждая .so, не смапленная на DEB-пакет, должна быть явно помечена unresolved с обоснованием.

Нормативная связка

Маппинг ELF → DEB даёт компонентам координаты (имя, версия, поставщик) — это базовые элементы SBOM по CISA Minimum Elements for SBOM и критерий полноты по BSI TR-03183-2 v2.1.0. Управляемость инвентаризации — ГОСТ Р 56939-2024; связка «SBOM → сторонние компоненты → уязвимости» — PW.4/RV.1 NIST SP 800-218 SSDF. Смежные практики модуля М09: П19. C C++ make build inventory, П23. Статическая линковка как слепая зона, П25. CPE alias worklist. Шаблон: Реестр unresolved libraries.