Сканирование сборки для языков 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, описывающий последовательность команд для сборки. Например:

{
  "commands": [
    {
      "command": "make",
      "flags_and_args": "clean"
    },
    {
      "command": "./configure"
    },
    {
      "command": "make",
      "do_analyze": true
    }
  ]
}

Поля команды:

  • command — исполняемая команда;
  • flags_and_args — аргументы команды, разделённые пробелами;
  • do_analyze — признак команды, вывод которой нужно проанализировать.

Команды выполняются последовательно из текущей рабочей директории. Значение flags_and_args не обрабатывается командной оболочкой. Если сборке нужны переменные окружения, перенаправления, конвейеры или сложное экранирование, вынесите их в отдельный исполняемый скрипт.

Далее вызывается команда анализа сборки и указывается путь до конфиг-файла:

./johnny scan build ebpf ./build-config.json

Каталог с входным JSON-файлом используется как корень исходного кода. Под ним Johnny ищет .pc-файлы для локальных статических библиотек.

Параметры команды

Команда scan build ebpf поддерживает общие параметры сканирования и два дополнительных параметра:

ПараметрОписание
--lib-versions, -LИспользовать JSON-файл с подтверждёнными версиями библиотек
--unresolved-file, -UСохранить библиотеки с неразрешёнными версиями в указанный JSON-файл

Если --unresolved-file не указан, Johnny формирует имя с датой и временем, например UnresolvedLibs20260810_120000.json.

Полный список параметров доступен в справке:

./johnny scan build ebpf --help

Классификация библиотек

Библиотеки, обнаруженные в процессе сканирования сборки, могут автоматически быть классифицированы по типу определения:

  • toolchain — библиотеки, явно определённые как зависимости инструмента сборки, отмечаются суффиксом _toolchain в окружении;
  • unresolved — библиотеки, для которых не удалось полностью определить метаданные, включаются в результат с суффиксом _unresolved в окружении;

Причиной unresolved может быть локальная библиотека без .pc-файла, отсутствие пакета в системной базе или недоступный путь к библиотеке. Неразрешённая версия сама по себе не означает наличие уязвимости или ошибку сборки.

Чтобы указать подтверждённые версии вручную:

  1. Сохраните результат сканирования через --unresolved-file.
  2. Скопируйте нужные записи в отдельный JSON-файл.
  3. Заполните поле version значением из проверяемого источника.
  4. Повторите анализ с параметром --lib-versions.
./johnny scan build ebpf ./build-config.json \
  --lib-versions ./lib-versions.json \
  --unresolved-file ./unresolved-after.json

Если все версии разрешены, новый файл unresolved-after.json не создаётся.

Коды возврата

Агент возвращает один из кодов:

  • 0 — анализ завершён, блокирующие политики не сработали;
  • 1 — анализ завершён, сработала блокирующая политика безопасности, требуется действие пользователя;
  • 2 — анализ не выполнен из-за ошибки;
  • 3 — артефакты для анализа не найдены. Код возвращается, если параметр --block-on-empty-result имеет значение true.
Страница была полезна?