Как читать авторский курс и нормативные материалы
Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.
vcpkg manifests
Почему это важно для SCA/OSA
vcpkg в режиме манифеста (vcpkg.json) — это попытка дать C/C++ воспроизводимость уровня lock-файла. Но ключевой нюанс для SCA в том, что версии в vcpkg.json сами по себе ничего не фиксируют: реальные версии определяет builtin-baseline — это git-commit реестра портов. Манифест без baseline означает плавающие версии: на разных машинах и в разное время один и тот же vcpkg.json соберёт разный состав. Поэтому для композиционного анализа vcpkg.json надо читать в паре с baseline и с vcpkg.json блоком overrides, который пинит конкретные версии.
Вторая хорошая новость: современный vcpkg при установке порта генерирует per-package SPDX SBOM (vcpkg.spdx.json) внутри дерева установки. Это готовое evidence с именами, версиями и лицензиями, которое не нужно реконструировать бинарным анализом.
Как это проявляется
Версия компонента определяется не строкой "version>=", а триадой «baseline + overrides + версионные ограничения»:
{
"name": "demo-app",
"version-string": "0.1.0",
"dependencies": [ "openssl", "fmt", { "name": "zlib", "version>=": "1.3" } ],
"builtin-baseline": "a1b2c3d4...",
"overrides": [ { "name": "openssl", "version": "3.2.1" } ]
}
builtin-baseline — это git commit реестра портов, который задаёт версии по умолчанию; overrides — жёсткий пин конкретной зависимости.
Где брать фактические версии и SBOM
vcpkg install # в каталоге с vcpkg.json: ставит зависимости по baseline в vcpkg_installed/
# после установки:
find . -name vcpkg.spdx.json # per-package SPDX SBOM каждого порта
cat vcpkg_installed/<triplet>/share/openssl/vcpkg.spdx.json | jq '.packages[].versionInfo'
vcpkg.spdx.jsonотдаёт имя, версию и лицензию порта — это первичный источник состава, точнее, чем разборvcpkg.json.
Слепая зона или приём
Слепая зона — манифест без builtin-baseline. Версии в нём плавают, и зафиксированный однажды SBOM перестаёт соответствовать тому, что соберётся завтра. Вторая ловушка — читать только vcpkg.json и игнорировать vcpkg-configuration.json, где могут быть подключены приватные registries: оттуда приходят порты, которых нет в публичном реестре, и их версии/лицензии нужно проверять отдельно.
Берите SBOM из дерева установки, а не из манифеста Источник истины —
vcpkg.spdx.jsonпосле установки плюс зафиксированный baseline. Разборvcpkg.jsonруками — только дополнение: он не знает, во что baseline развернул диапазоны.
Что делать на проекте
- Проверьте наличие
builtin-baselineвvcpkg.json; его отсутствие — повод понизить confidence (версии плавают). - Соберите все
vcpkg.spdx.jsonизvcpkg_installed/как первичное evidence: имя, версия, лицензия каждого порта. - Сверьте
overrides— это жёсткие пины, они переопределяют baseline. - Откройте
vcpkg-configuration.json: при наличии приватных registries отметьте их порты для отдельной проверки версий и лицензий. - Сопоставьте состав из SPDX с
lddготового артефакта — статически слинкованные порты вlddне появятся, их даёт только SBOM установки. - Зафиксируйте baseline-commit в provenance сборки, чтобы SBOM был воспроизводим.
Связь
- Модуль: М09. C/C++ legacy
- Практики: П19. C C++ make build inventory · П04. Генерация SBOM через cdxgen для C C++ · П21. Conan graph и package identity
- Нормативка: ГОСТ Р 56939-2024 · BSI TR-03183-2 v2.1.0 · SPDX ISO IEC 5962 · NIST SP 800-218 SSDF
- Смежные заметки: Conan package id graph · CMake target_link_libraries · статическая линковка · version normalization