Сканирование сборки для языков C и C++
В случае, если при сборке проекта на C/C++ не используется пакетный менеджер Conan и соответствующие манифесты, для получения списка используемых библиотек Johnny можно запустить в специальном режиме для анализа вывода процесса сборки. В этом режиме Johnny анализирует процесс сборки, используя вызовы компилятора и технологии eBPF, и выявляет использованные библиотеки. Далее с помощью системного кэша определяется местоположение библиотек и их источник.
Версия локальной статической библиотеки может быть найдена в .pc-файле, содержащем метаданные о компоненте.
Сканирование с использованием eBPF
eBPF (extended Berkeley Packet Filter) — это технология, которая позволяет безопасно запускать пользовательский код на уровне ядра Linux в ответ на события в системе, такие как сетевой трафик, системные вызовы или действия процессов.
Особенность вызова агента в этом режиме scan build ebpf состоит в том, что помимо исполнения команды из JSON-конфигурации, он также получает вызовы компилятора и компоновщика путём мониторинга запускаемых процессов и их параметров через механизм eBPF.
Для запуска нужны права root, ядро версии ≥ 5.8 с поддержкой eBPF и доступ к интерфейсам трассировки, включая tracepoint syscalls:sys_enter_execve. В контейнере могут потребоваться дополнительные привилегии и подключение интерфейсов ядра. Одних прав root внутри ограниченного контейнера может быть недостаточно.
Команда scan build ebpf доступна только в сборках Johnny для Linux и поддерживает дистрибутивы семейств Debian и RPM.
Пошаговый пример с локальной статической библиотекой и разбором неразрешённой версии приведён в сценарии «Просканировать сборку проекта на C/C++ и уточнить версии библиотек».
Пример работы
В проект добавляется JSON-файл build-config.json, описывающий последовательность команд для сборки. Например:
Поля команды:
command— исполняемая команда;flags_and_args— аргументы команды, разделённые пробелами;do_analyze— признак команды, вывод которой нужно проанализировать.
Команды выполняются последовательно из текущей рабочей директории. Значение flags_and_args не обрабатывается командной оболочкой. Если сборке нужны переменные окружения, перенаправления, конвейеры или сложное экранирование, вынесите их в отдельный исполняемый скрипт.
Далее вызывается команда анализа сборки и указывается путь до конфиг-файла:
Каталог с входным JSON-файлом используется как корень исходного кода. Под ним Johnny ищет .pc-файлы для локальных статических библиотек.
Параметры команды
Команда scan build ebpf поддерживает общие параметры сканирования и два дополнительных параметра:
Если --unresolved-file не указан, Johnny формирует имя с датой и временем, например UnresolvedLibs20260810_120000.json.
Полный список параметров доступен в справке:
Классификация библиотек
Библиотеки, обнаруженные в процессе сканирования сборки, могут автоматически быть классифицированы по типу определения:
toolchain— библиотеки, явно определённые как зависимости инструмента сборки, отмечаются суффиксом _toolchain в окружении;unresolved— библиотеки, для которых не удалось полностью определить метаданные, включаются в результат с суффиксом _unresolved в окружении;
Причиной unresolved может быть локальная библиотека без .pc-файла, отсутствие пакета в системной базе или недоступный путь к библиотеке. Неразрешённая версия сама по себе не означает наличие уязвимости или ошибку сборки.
Чтобы указать подтверждённые версии вручную:
- Сохраните результат сканирования через
--unresolved-file. - Скопируйте нужные записи в отдельный JSON-файл.
- Заполните поле
versionзначением из проверяемого источника. - Повторите анализ с параметром
--lib-versions.
Если все версии разрешены, новый файл unresolved-after.json не создаётся.
Коды возврата
Агент возвращает один из кодов:
- 0 — анализ завершён, блокирующие политики не сработали;
- 1 — анализ завершён, сработала блокирующая политика безопасности, требуется действие пользователя;
- 2 — анализ не выполнен из-за ошибки;
- 3 — артефакты для анализа не найдены. Код возвращается, если параметр
--block-on-empty-resultимеет значениеtrue.
