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

Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин 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-симлинков.

Что делать на проекте

  1. Считать «0 пакетов» красным флагом: если в образе есть ELF, а SBOM пуст — требовать объяснение, а не принимать отчёт.
  2. Проверять наличие базы пакетного менеджера; её отсутствие при наличии бинарей фиксировать как обфускацию.
  3. Распаковывать UPX (upx -d) перед анализом; высокую энтропию секций (readelf -S, ent) трактовать как сигнал упаковки.
  4. Сверять ldd/readelf -d динамические зависимости бинаря со списком компонентов SBOM — расхождение и есть скрытое.
  5. Запретить в политике сборки удаление баз пакетного менеджера и упаковщики в production-образах; держать факты сборки в отдельном артефакте.
  6. Сопоставлять заявленный SBOM с независимо собранным по слоям (см. honest SBOM): обфускация всплывает как разница множеств компонентов.

Связь