Как читать авторский курс и нормативные материалы
Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.
П04. Генерация SBOM через cdxgen для C/C++
Цель
Сгенерировать SBOM для C/C++ проекта режимом cdxgen -t cpp и убедиться на конкретных компонентах, что сырой C/C++ SBOM неполон: версии часто пусты, идентификаторы вырождаются в pkg:generic/..., динамические .so и их привязка к системным DEB-пакетам не восстанавливаются. Дополнительно показать дельту «без Conan» против «с Conan»: декларация пакетного менеджера превращает часть generic-компонентов в нормальные координаты с версией. Проверяемый результат — cdxgen-bom.json, в котором видны и заполненные, и «слепые» компоненты.
Команда или действие
На вход — учебный C/C++ проект (CMake/make). Прогон делаем дважды: на «голом» дереве и после того, как зависимости объявлены через Conan.
cdxgen --version
# 1) без Conan: cdxgen видит только то, что нашёл в дереве сборки
cdxgen -t cpp -o cdxgen-noconan.json .
# 2) с Conan: объявляем зависимости, затем повторный прогон
conan install . --output-folder=build --build=missing
cdxgen -t cpp -o cdxgen-conan.json .
# сравнить число компонентов и долю пустых версий
jq '.components | length' cdxgen-noconan.json cdxgen-conan.json
jq '[.components[] | select(.version == null or .version == "")] | length' cdxgen-conan.json
cdxgen — публичный генератор CycloneDX (https://github.com/cdxgen/cdxgen). Сырой cdxgen-bom.json затем уходит на обогащение в генератор фактов (enrichment-утилита), который дотягивает динамические .so через анализ ELF и привязывает их к DEB-пакетам, — это уже следующий шаг конвейера, не покрытый данной практикой.
Что вы должны увидеть
В cdxgen-noconan.json компонентов немного, и значительная часть из них без версии и с вырожденным PURL — это нормальное состояние C/C++ без дисциплины пакетного менеджера:
{
"type": "library",
"name": "zlib",
"version": "",
"purl": "pkg:generic/zlib"
}
После conan install часть таких записей в cdxgen-conan.json получает версию и осмысленный идентификатор:
{
"type": "library",
"name": "zlib",
"version": "1.3.1",
"purl": "pkg:conan/zlib@1.3.1"
}
Ориентир по числам: компонентов в обоих файлах единицы–десятки (а не сотни, как в npm-проекте из П03. Генерация SBOM через Syft); счётчик пустых версий в варианте без Conan заметно выше.
cdxgen для C/C++ даёт каркас, а не полный состав
#includeне несёт версии, а статически вшитая библиотека вообще исчезает из артефакта — поэтомуpkg:generic/...без версии здесь не баг инструмента, а граница метода. Не принимайте такой SBOM за полный: его обязательно дообогащают данными ELF/DEB. Эта неполнота — причина, по которой в конвейере Организации существует отдельный генератор фактов.
Если не получилось
cdxgenне запускается /command not found. Инструмент ставится через npm (npm install -g @cyclonedx/cdxgen) и требует Node.js. Проверьтеnode --versionиcdxgen --version.componentsпуст ([]илиlength= 0). cdxgen не нашёл артефактов сборки в каталоге: запуск был не из корня проекта, либо проект ни разу не конфигурировался (CMakeCache.txt/Makefileотсутствуют). Сконфигурируйте сборку и повторите.- Файлы «без Conan» и «с Conan» идентичны.
conan installне отработал (нетconanfile.txt/conanfile.py, или профиль не задан) — Conan-граф не появился, дельты нет. Проверьтеconan profile detectи наличие conanfile. - Все версии пусты даже после Conan. cdxgen прочитал дерево до установки зависимостей; запускайте генерацию строго после
conan installи из того же каталога.
Критерий зачёта
Показать преподавателю: cdxgen-noconan.json и cdxgen-conan.json, два числа из jq и счётчик пустых версий. Указать пальцем хотя бы один компонент, который в варианте без Conan был pkg:generic/... без версии, а с Conan получил версию и нормальный PURL. Сформулировать, какие данные о компонентах в этом SBOM всё ещё отсутствуют и где они добираются.
Нормативная связка
- Модуль: М09 C/C++ legacy без дисциплины пакетного менеджера
- Смежные практики (цепочка C/C++): П19. C C++ make build inventory · П21. Conan graph и package identity · П22. ELF dynamic dependencies · П23. Статическая линковка как слепая зона
- Критерии качества SBOM (полнота PURL, версий, зависимостей) — BSI TR-03183-2 v2.1.0; формат — CycloneDX ECMA-424; минимальный состав полей — NTIA Minimum Elements for SBOM; управляемость работ — ГОСТ Р 56939-2024.