Как читать авторский курс и нормативные материалы
Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.
container image obfuscation
Почему это важно для SCA/OSA
Сканер контейнерного образа делает выводы по косвенным признакам: базе пакетного менеджера (/var/lib/dpkg/status, /var/lib/rpm), метаданным в бинарниках, расширениям файлов. Если эти признаки убрать или испортить — намеренно или «для уменьшения размера», — образ для сканера превращается в пустой. Для C/C++-поставки это удобный способ показать «0 уязвимостей»: достаточно стереть базу dpkg, упаковать бинарь UPX и собрать всё FROM scratch. Composition analysis обязан различать «образ действительно чистый» и «образ ослепил сканер», иначе «0 findings» становится не доказательством, а артефактом обфускации.
Как это проявляется
Самая частая «обфускация» — удаление базы пакетного менеджера ради экономии места. После этого syft/trivy не находят ни одного системного пакета, хотя libssl, zlib и прочее физически на месте.
# в Dockerfile «оптимизировали» размер:
RUN rm -rf /var/lib/dpkg /var/lib/apt/lists /var/lib/rpm
# результат для сканера:
syft myapp:slim -o table
# No packages discovered <-- не «чисто», а «ослеплено»
# но бинарь линкует системные .so:
ldd /usr/bin/myapp
# libssl.so.3 => /usr/lib/x86_64-linux-gnu/libssl.so.3
Другие приёмы: UPX-упаковка (upx --best myapp — сжатый бинарь теряет читаемые строки и секции, сканер не достаёт версию), стрип .note/build-id, сборка FROM scratch без какого-либо пакетного слоя, переименование .so так, чтобы не сработали сигнатуры.
Слепая зона или приём
«0 findings» неоднозначно Пустой отчёт сканера означает одно из двух: образ действительно не содержит известных компонентов, либо признаки, по которым сканер их опознаёт, удалены. Принимать «0» как «безопасно» без проверки — типичная ошибка приёмки.
Приём-индикаторы ослепления: наличие исполняемых ELF при нулевом списке пакетов; ldd показывает .so, которых нет в SBOM; энтропия секций бинаря близка к максимуму (признак UPX/упаковки); отсутствие /var/lib/dpkg/status при наличии dpkg-симлинков.
Что делать на проекте
- Считать «0 пакетов» красным флагом: если в образе есть ELF, а SBOM пуст — требовать объяснение, а не принимать отчёт.
- Проверять наличие базы пакетного менеджера; её отсутствие при наличии бинарей фиксировать как обфускацию.
- Распаковывать UPX (
upx -d) перед анализом; высокую энтропию секций (readelf -S,ent) трактовать как сигнал упаковки. - Сверять
ldd/readelf -dдинамические зависимости бинаря со списком компонентов SBOM — расхождение и есть скрытое. - Запретить в политике сборки удаление баз пакетного менеджера и упаковщики в production-образах; держать факты сборки в отдельном артефакте.
- Сопоставлять заявленный SBOM с независимо собранным по слоям (см. honest SBOM): обфускация всплывает как разница множеств компонентов.
Связь
- Модуль: М16. SBOM for AI и честный SBOM контейнерных образов.
- Практики: П38. Честный SBOM контейнерного образа, П37. Контейнерный образ слои секреты и удаленные файлы.
- Нормативка: CISA Minimum Elements, BSI TR-03183-2.
- Смежные заметки: container image layers, honest SBOM, stripped binaries, detection accuracy.