Как читать авторский курс и нормативные материалы
Это учебные материалы, а не заключение о соответствии конкретного продукта. Организационные модели курса отделяйте от терминов стандарта: ППК в опубликованном проекте — машиночитаемый перечень, а живой реестр его версий является практикой сопровождения. Термин OSA в разных материалах имеет разный охват. Статус и обязательность нормативного документа проверяются отдельно; проект КАПО опубликован как проект первой редакции.
cross-compilation
Почему это важно для SCA/OSA
Кросс-компиляция ломает самое надёжное допущение C/C++ SCA: что библиотеки лежат в системе, на которой ведётся анализ. При сборке под другую архитектуру (ARM, MIPS, aarch64) код линкуется не с хостовыми /usr/lib, а с библиотеками из целевого --sysroot — отдельного дерева с заголовками и .so под целевую платформу. Поэтому маппинг «.so → пакет» нельзя делать инструментами хоста: dpkg -S и ldd на хосте дадут координаты не того окружения либо вообще откажутся работать с чужой архитектурой.
Это самая чистая слепая зона группы: аудитор по привычке снимает ldd на своей машине, получает правдоподобный список и не замечает, что версии и пакеты относятся к хосту, а не к тому, что реально слинковано под целевую платформу.
Как это проявляется
Архитектуру артефакта и источник его зависимостей определяет не хост, а заголовок ELF и sysroot:
Сначала определите целевую платформу
readelf -h app | grep Machine # Machine: AArch64 → это НЕ хостовый x86-64
file app # ELF 64-bit LSB, ARM aarch64
ldd app
# → "not a dynamic executable" или ошибка: хостовый ldd не умеет чужую архитектуру
lddна хосте бесполезен. Резолвить зависимости нужно против sysroot цели.
| Действие | На хосте (неверно) | Против sysroot цели (верно) |
|---|---|---|
Список .so |
ldd app (ошибка/чужие пути) |
readelf -d app → DT_NEEDED + поиск в sysroot |
| Маппинг на пакет | dpkg -S /usr/lib/... (хостовый пакет) |
dpkg-query в chroot/sysroot цели |
| Версия библиотеки | версия хоста | версия из sysroot/package DB цели |
DT_NEEDED архитектурно-нейтрален
readelf -d appчитает секцию.dynamicлюбого ELF независимо от своей архитектуры и печатаетDT_NEEDED(libssl.so.3,libc.so.6). Это даёт имена библиотек; версии и пакеты ищите в sysroot цели, а не на хосте.
Слепая зона или приём
Слепая зона — «правдоподобный, но хостовый» результат. Инструменты не падают, отдают список, и его принимают за состав, хотя версии относятся к машине аналитика. Усугубляет дело то, что toolchain-файл CMake (CMAKE_TOOLCHAIN_FILE с CMAKE_SYSROOT) и переменные --sysroot/PKG_CONFIG_SYSROOT_DIR задают целевое окружение в стороне от привычных системных путей — их легко не заметить.
Что делать на проекте
- Определите целевую архитектуру артефакта:
readelf -h(полеMachine) иfile. Не доверяйтеlddхоста. - Найдите sysroot сборки:
CMAKE_SYSROOTв toolchain-файле,--sysrootв командах компилятора,PKG_CONFIG_SYSROOT_DIR. - Снимите
DT_NEEDEDчерезreadelf -d— это работает на любой архитектуре и даёт имена.so. - Резолвите версии и пакеты против package DB целевого окружения (chroot/sysroot,
dpkg-query/rpmв нём), а не хоста. - Зафиксируйте версию кросс-toolchain и sysroot в provenance: один и тот же исходник под разные sysroot даёт разный состав.
- Если sysroot собран вручную из вендоренных библиотек — каждая такая
.soидёт в worklist доразметки, координат у неё нет.
Связь
- Модуль: М09. C/C++ legacy
- Практики: П22. ELF dynamic dependencies · П19. C C++ make build inventory · П25. CPE alias worklist
- Нормативка: ГОСТ Р 56939-2024 · BSI TR-03183-2 v2.1.0 · NIST SP 800-218 SSDF
- Смежные заметки: ELF и DT_NEEDED · ldd/readelf/objdump · Astra/Debian/RPM среды · dpkg/apt metadata