Анализ достижимости уязвимостей

Что такое достижимость

Достижимость уязвимости — это проверка того, действительно ли потенциально уязвимый участок кода может быть выполнен при использовании приложения. Такой анализ позволяет отфильтровать «шум» и сосредоточиться на реально эксплуатируемых проблемах.

Консольный агент Johnny умеет анализировать уязвимости на достижимость из исходного кода и из контейнерных образов. Для использования данной функции необходимо задать два параметра:

  • cg-path — путь к файлу графа вызовов: для java, python, go, kotlin и csharp (C#) — формат Svace; для javascript — JSON, сформированный Joern (см. раздел ниже);
  • cg-lang — язык программирования, для которого был построен граф вызовов. Поддерживаются значения java, python, go, kotlin, csharp (C#) и javascript.

Построение графа вызовов

С использованием инструмента Svace

  1. Скачать модуль Svace https://REGISTRY_USERNAME:REGISTRY_PASSWORD@REGISTRY_URL/#browse/browse:files:codescoring%2Fsvace-callgraph

  2. Получить токен пользователя в CodeScoring (по ссылке{platform-url}/cabinet/profile)

  3. Запустить Svace на исходном коде проекта. Этот этап лучше делать в рамках или после шага сборки в конвейере.

    1. Инициализация
      svace init
      По умолчанию Svace формирует граф вызовов в формате 2.0. Чтобы сформировать граф в формате 1.0, выполните команду:
      svace config PRINT_CALL_GRAPH_JSON_V1=true
    2. Контролируемая сборка
      svace build <build command>
      Пример для проектов на языке Java:
      svace build mvn clean package
      Пример на языке Go:
      svace build go build -a main.go
      Пример на языке Python:
      svace build --python .
      Пример на языке Kotlin:
      svace build ./gradlew clean build
      Пример на языке C#:
      svace build dotnet build
    3. Анализ результатов и построение графа вызовов
      svace analyze --build-call-graph-only --license-server-url "http(s)://<codescoring_host>" --license-server-token "<токен из п.2>"
  4. В случае успешного выполнения всех шагов в директории проекта появится файл .svace-dir/analyze-res/call-graph-results/<project_name>-graph-order.json, содержащий граф вызовов.

    Сохранение файла

    До версии Svace 5.0.260311 файл с графом вызовов сохранялся в папку .svace-dir/analyze-res/call-graph

    Версия формата графа вызовов

    2026.35.0 Johnny поддерживает форматы графа вызовов Svace 1.0 и 2.0 и автоматически определяет версию формата при сканировании.

  5. Запустить сканирования с помощью Johnny, например:

    johnny-linux-amd64 scan dir . --api_url "http(s)://<codescoring_host>" --api_token "<токен из п.2>"  --cg-path .svace-dir/analyze-res/call-graph-results/<project_name>-graph-order.json  --cg-lang java

С использованием Joern (JavaScript)

Для языка JavaScript граф вызовов для анализа достижимости строится с помощью Joern. В каталоге с исходным кодом проекта выполните:

joern-parse .
joern-slice usages cpg.bin

Команда joern-parse создаёт CPG в файле cpg.bin. Команда joern-slice usages записывает результат в JSON. По умолчанию файл сохраняется как slices.json в текущей папке. Путь к этому файлу передайте в параметре --cg-path при запуске Johnny. Имя выходного файла можно задать опцией -o у joern-slice; см. документацию Joern по CPG slicing.

Пример запуска сканирования:

johnny-linux-amd64 scan dir . --api_url "http(s)://<codescoring_host>" --api_token "<токен из личного кабинета>" --cg-path <путь_к_json_joern> --cg-lang javascript

Анализ достижимости в контейнерных образах

Анализ достижимости уязвимостей доступен не только для исходного кода, но и для контейнерных образов. Агент Johnny находит достижимые пути выполнения непосредственно внутри содержимого образа, используя предоставленный граф вызовов.

Для запуска сканирования образа с анализом достижимости используются те же параметры --cg-path и --cg-lang, что и для исходного кода, но с указанием команды scan image.

Пример запуска:

johnny-linux-amd64 scan image java_json.tar \
  --api_url "http(s)://<codescoring_host>" \
  --api_token "<токен из п.2>" \
  --cg-path .svace-dir/analyze-res/call-graph-results/<project_name>-graph-order.json \
  --cg-lang java 

Удаленный анализ

В версии Svace 5.0.260311 появилась возможность использования сервера удалённого анализа. Это позволяет вынести построение графа вызовов за пределы CI/CD пайплайна, снизить нагрузку на сборочные серверы и оптимизировать процесс непрерывной интеграции.

Этапы настройки сервера

  1. Указать переменные окружения
SVACE_LIC_SERVER_URL=http(s)://<codescoring_host>
SVACE_LIC_SERVER_TOKEN=<токен CodeScoring>
  1. Инициализация
svace server init
  1. Запустить сервер
svace server start
  1. Отправить проект на анализ. После настройки сервера не нужно указывать параметры лицензии --license-server-url и --license-server-token.

    svace remote --host <адрес сервера> analyze --build-call-graph-only

    При необходимости можно добавить параметры --port, --login, --pass и т.д.

Подробнее с настройками сервера удалённого анализа можно ознакомиться в документации Svace.

Формат вывода отчёта

2026.35.0 Таблица достижимых путей вызовов выводится в консоль вместе с остальными результатами сканирования. Параметр --reachability-format позволяет дополнительно вывести этот отчёт в выбранном формате и перенаправить его в файл.

Поддерживаемые форматы: coloredtable, table, text, json.

Можно указать несколько форматов сразу через запятую. Чтобы записать отчёт в файл, добавьте имя файла после >>:

johnny-linux-amd64 scan dir . --api_url "http(s)://<codescoring_host>" --api_token "<токен>" \
  --cg-path <путь_к_графу_вызовов> --cg-lang java \
  --reachability-format "coloredtable,json>>reachability.json"

В этом примере отчёт дополнительно выводится в консоль в виде цветной таблицы и сохраняется в файл reachability.json.

Параметр также можно задать в конфигурационном файле с помощью ключа reachability-format в секции stats.

Получение результатов

В таблице уязвимостей с найденными достижимыми вызовами будет проставлена отметка в соответствующем столбце:

Таблица уязвимостей с колонкой Reachable

В конце будет доступна ещё одна таблица с перечислением деревьев вызовов для уязвимостей:

Таблица путей достижимости уязвимостей json-bug

Пример для более крупного проекта:

Таблица путей достижимости уязвимостей dep-track

Если был указан флаг --save-results, то результаты достижимости будут в колонке "Достижимо" таблицы уязвимостей:

Таблица уязвимостей json-bug

Страница была полезна?