Перейти к содержанию

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

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

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

Консольный агент 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 на исходном коде проекта. Этот этап лучше делать в рамках или после шага сборки в конвейере.
  4. Инициализация
    svace init
    
  5. Контролируемая сборка
    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
    
  6. Анализ результатов и построение графа вызовов
    svace analyze --build-call-graph-only --license-server-url "http(s)://<codescoring_host>" --license-server-token "<токен из п.2>"
    
  7. В случае успешного выполнения всех шагов в директории проекта появится файл .svace-dir/analyze-res/call-graph-results/<project_name>-graph-order.json, содержащий граф вызовов.

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

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

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

    johnny-linux-amd64 scan dir . --api_url "http(s)://<codescoring_host>" --api_token "<токен из п.1>"  --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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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