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

В современных условиях разработки программного обеспечения крайне редко встречаются проекты, не имеющие внешних зависимостей, и большинство из них — различные библиотеки для работы с различными базами данных. Большая же часть проектов разрабатывается с использованием сторонних зависимостей — библиотек и фреймворков, которые предоставляют готовые решения для большого количества задач. Однако в сторонних зависимостях могут скрываться уязвимости, которыми злоумышленники могут воспользоваться при атаке на разрабатываемые вами проекты. Но потенциальное наличие уязвимостей в сторонних библиотеках не должно стать поводом для отказа от них — вместо этого лучше поддерживать зависимости в актуальном состоянии и анализировать их на предмет уязвимостей.

Различные инструменты для отслеживания уязвимостей в зависимостях интегрированы в IDE, SonarQube и CI/CD-решения, а в этой статье речь пойдёт о Dependency Track.

OWASP Dependency Track

В рамках сообщества OWASP (Open Worldwide Application Security Project) существует проект с открытым исходным кодом Dependency Track, представляющий собой сервис для анализа зависимостей и использующий в качестве источников информации об уязвимостях открытые базы данных, среди которых есть National Vulnerability Database, GitHub Advisories, Sonatype OSS Index, Snyk и другие.

Вы можете развернуть OWASP Dependency Track в своей экосистеме, в рамках этой статьи я рассмотрю вариант минимального локального развёртывания при помощи Docker Compose:

Более подробную информацию о развёртывании Dependency Track в DockerKubernetes или в виде исполняемого WAR-файла вы можете найти в официальной документации. Да, проект написан на Java и в качестве основы использует Alpine.

При первом входе воспользуйтесь логином admin и паролем admin:

После этого Dependency Track потребует изменить пароль:

После смены пароля вы снова сможете ввести логин и пароль и попасть на главную страницу сервиса:

Создание проекта

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

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

Данный идентификатор вам нужно указывать в SBOM при анализе.

В демонстрационном проекте я буду использовать Spring Boot 2.7.10 и следующие зависимости:

  • spring-boot-starter-web
  • spring-boot-starter-data-jpa
  • spring-boot-starter-security
  • spring-boot-starter-postgresql

Получение ключа доступа

Теперь необходимо получить ключ API для анализа зависимостей. Для этого нужно перейти в раздел Администрация → Управление доступом → Команды. Здесь вы можете использовать уже существующий ключ API из группы Automation, либо создать новый ключ, в т.ч. и в других группах.

Полученный ключ API нужно передавать в запросах к REST API в HTTP-заголовке X-API-Key.

Теперь необходимо сгенерировать SBOM (Software Bill of Materials) для вашего проекта в формате CycloneDX.

Анализ зависимостей с Apache Maven

Если в качестве инструмента сборки вашего проекта вы используете Apache Maven, то сгенерировать SBOM для проекта вы можете при помощи плагина org.cyclonedx:cyclonedx-maven-plugin:

Более подробную информацию о работе с данным плагином вы можете найти на странице проекта в GitHub.

Результатом выполнения данной команды будет 2 файла в директории targetbom.json и bom.xml, это и будут сгенерированные SBOM в формате CycloneDX. Данный плагин вы можете добавить в pom.xml вашего проекта:

Однако отправлять в Dependency Track нужно следующую структуру:

Иными словами в свойство bom нужно поместить содержимое bom.json, закодированное в Base64, должно получиться что-то вроде:

Полученный файл можно отправить в Dependency Track:

Всё это можно автоматизировать при помощи цели upload-bom другого плагина Maven от одного из разработчиков Dependency Track — io.github.pmckeown:dependency-track-maven-plugin:

Плагин так же можно добавить в настройки проекта:

Анализ зависимостей с Gradle

Сообщество OWASP предоставляет плагин CycloneDX и для Gradle:

Для генерации файла SBOM достаточно выполнить задачу cyclonedxBom:

Итоговый файл будет build/reports/bom.json.

Для загрузки SBOM в Dependency Track можно использовать один из плагинов от сообщества: com.liftric.dependency-track-companion-plugin:

Анализ проекта

С полным деревом зависимостей вы можете ознакомиться на странице проекта:

Так же в списке компонентов можно проанализировать их уязвимости:

Dependency Track предоставляет подробную информацию о найденных уязвимостях:

Напоследок

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

Полезные ссылки