Как читать авторский курс и нормативные материалы
Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.
М09. C и C++ legacy без дисциплины пакетного менеджера
Зачем этот модуль
В экосистемах npm, PyPI, Go, Cargo состав ПО декларирован: есть lock-файл, есть устойчивый ключ компонента (PURL), и SBOM почти полностью восстанавливается из манифеста. В C/C++ без Conan или vcpkg ничего этого нет. #include <openssl/ssl.h> не говорит, какая версия OpenSSL слинкована и слинкована ли вообще; зависимость может прийти из системного apt-пакета, из ручного каталога third_party/, из внутреннего форка с собственными патчами или быть «вшита» статически в бинарь. Этот модуль учит восстанавливать состав там, где сборочный процесс не отдаёт метаданных, и честно отмечать слепые зоны вместо того, чтобы выдавать неполный SBOM за полный.
Это самый сложный модуль курса: здесь сходятся бинарный анализ ELF, маппинг на DEB-пакеты, граф линковки и роль build-scan. Модуль опирается на инструменты из М05 и готовит к корпоративному кейсу обогащения фактов в М11.
Ключевые понятия
#include≠ зависимость: заголовок виден компилятору, но не задаёт версию и факт линковки.- Три разных слоя: исходная зависимость → динамическая линковка (
.so, видна черезldd/readelf -d/DT_NEEDED) → статическая линковка (.a, слепая зона: компонент исчезает из SBOM). - Маппинг ELF → DEB через
apt/dpkg -S: системная библиотека получает координаты (имя пакета, версия, дистрибутив). - Полнота достигается на этапе сборки (build scan, перехват вызовов компилятора), а не поздним сканом готового бинаря.
- Роль Conan/vcpkg, когда они есть:
conan graph infoдаёт идентичность пакета и устойчивый PURL.
Опорные заметки справочника: include ≠ зависимость · динамическая линковка · статическая линковка · ELF и DT_NEEDED · dpkg/apt metadata · stripped binaries · vendored source · unresolved libraries · кейс генератора фактов
Миникарта модуля
Нормативная опора
ГОСТ Р 56939-2024 · NIST SP 800-218 SSDF (PS.3.2, PW.4, RV.1) · BSI TR-03183-2 v2.1.0 · CERT C C++ · MISRA C C++
Материалы модуля
- 01 Конспект — почему SCA ломается в C/C++ и как обогащать SBOM бинарным анализом.
- 02 План занятия — 90 минут: теория, демо, практика.
- 03 Практическая работа — собрать проект, снять
ldd/readelf, сравнить динамику и статику. - 04 Контрольные вопросы — вопросы и кейс-задачи.
- 05 Что проверять на проекте — чек-лист аудитора по C/C++.
Связанные практики
П19. C C++ make build inventory · П20. CMake dependency graph · П21. Conan graph и package identity · П22. ELF dynamic dependencies · П23. Статическая линковка как слепая зона · П24. PURL нормализация и private qualifiers · П25. CPE alias worklist
Связь с другими модулями
- Назад: М05 — генераторы SBOM (cdxgen, syft), которые здесь упираются в C/C++.
- Вперёд: М10 — приёмка C/C++ компонентов от соисполнителей; М11 — обогащение фактов и сервис вердиктов как сквозной кейс.
Практический результат
Слушатель умеет: собрать тестовый C/C++ проект; снять ldd/readelf -d и отличить динамическую зависимость от статической; сгенерировать cdxgen SBOM и увидеть, чего в нём не хватает; смаппить .so на DEB-пакеты через apt; оформить список unresolved libraries для ручной доразметки.