![](https://alexkosarev.name/wp-content/uploads/2024/07/shield-data-protection-status-a-check-mark-on-the-shield-vector-1024x410.jpg)
В современных условиях разработки программного обеспечения крайне редко встречаются проекты, не имеющие внешних зависимостей, и большинство из них — различные библиотеки для работы с различными базами данных. Большая же часть проектов разрабатывается с использованием сторонних зависимостей — библиотек и фреймворков, которые предоставляют готовые решения для большого количества задач. Однако в сторонних зависимостях могут скрываться уязвимости, которыми злоумышленники могут воспользоваться при атаке на разрабатываемые вами проекты. Но потенциальное наличие уязвимостей в сторонних библиотеках не должно стать поводом для отказа от них — вместо этого лучше поддерживать зависимости в актуальном состоянии и анализировать их на предмет уязвимостей.
Различные инструменты для отслеживания уязвимостей в зависимостях интегрированы в 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:
1 2 3 4 5 |
# Downloads the latest Docker Compose file curl -LO https://dependencytrack.org/docker-compose.yml # Starts the stack using Docker Compose docker-compose up -d |
Более подробную информацию о развёртывании Dependency Track в Docker, Kubernetes или в виде исполняемого WAR-файла вы можете найти в официальной документации. Да, проект написан на Java и в качестве основы использует Alpine.
При первом входе воспользуйтесь логином admin
и паролем admin
:
![](https://alexkosarev.name/wp-content/uploads/2024/07/dtrack_login.png)
После этого Dependency Track потребует изменить пароль:
![](https://alexkosarev.name/wp-content/uploads/2024/07/dtrack_change_password.png)
После смены пароля вы снова сможете ввести логин и пароль и попасть на главную страницу сервиса:
![](https://alexkosarev.name/wp-content/uploads/2024/07/dtrack_dashboard-1024x569.png)
Создание проекта
Для анализа зависимостей проекта вам необходимо создать проект в Dependency Track, для этого нажмите на кнопку «+ Создать проект» на странице проектов и введите параметры проекта в появившейся форме.
![](https://alexkosarev.name/wp-content/uploads/2024/07/dtrack_new_project.png)
После создания проекта вы можете открыть параметры проекта, где среди прочих параметров будет его идентификатор:
![](https://alexkosarev.name/wp-content/uploads/2024/07/dtrack_project_details.png)
Данный идентификатор вам нужно указывать в 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, либо создать новый ключ, в т.ч. и в других группах.
![](https://alexkosarev.name/wp-content/uploads/2024/07/dtrack_api_key-1024x617.png)
Полученный ключ API нужно передавать в запросах к REST API в HTTP-заголовке X-API-Key
.
Теперь необходимо сгенерировать SBOM (Software Bill of Materials) для вашего проекта в формате CycloneDX.
Анализ зависимостей с Apache Maven
Если в качестве инструмента сборки вашего проекта вы используете Apache Maven, то сгенерировать SBOM для проекта вы можете при помощи плагина org.cyclonedx:cyclonedx-maven-plugin
:
1 |
mvn org.cyclonedx:cyclonedx-maven-plugin:2.8.0:makeAggregateBom |
Более подробную информацию о работе с данным плагином вы можете найти на странице проекта в GitHub.
Результатом выполнения данной команды будет 2 файла в директории target: bom.json
и bom.xml
, это и будут сгенерированные SBOM в формате CycloneDX. Данный плагин вы можете добавить в pom.xml
вашего проекта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<project> <!-- Прочие настройки --> <build> <plugins> <plugin> <groupId>org.cyclonedx</groupId> <artifactId>cyclonedx-maven-plugin</artifactId> <version>2.8.0</version> </plugin> </plugins> </build> </project> |
Однако отправлять в Dependency Track нужно следующую структуру:
1 2 3 4 |
{ "project": "project-id-from-dependency-track", "bom": "Base64 encoded bom.json" } |
Иными словами в свойство bom нужно поместить содержимое bom.json, закодированное в Base64, должно получиться что-то вроде:
1 2 3 4 |
{ "project": "4acade64-0c25-4020-a53b-a9f4672c7e21", "bom": "ewogICJib21Gb3JtYXQiIDogIkN5Y2xvbmVEWCIsCiAgInN..." } |
Полученный файл можно отправить в Dependency Track:
1 2 3 4 |
curl -X "PUT" "http://localhost:8081/api/v1/bom" \ -H 'Content-Type: application/json' \ -H 'X-API-Key: LPojpCDSsEd4V9Zi6qCWr4KsiF3Konze' \ -d @target/bom_full.json |
Всё это можно автоматизировать при помощи цели upload-bom
другого плагина Maven от одного из разработчиков Dependency Track — io.github.pmckeown:dependency-track-maven-plugin
:
1 |
mvn io.github.pmckeown:dependency-track-maven-plugin:1.7.0:upload-bom |
Плагин так же можно добавить в настройки проекта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<project> <build> <plugins> <plugin> <groupId>io.github.pmckeown</groupId> <artifactId>dependency-track-maven-plugin</artifactId> <version>1.7.0</version> <configuration> <dependencyTrackBaseUrl>http://localhost:8081</dependencyTrackBaseUrl> <apiKey>API_KEY</apiKey> </configuration> </plugin> </plugins> </build> </project> |
Анализ зависимостей с Gradle
Сообщество OWASP предоставляет плагин CycloneDX и для Gradle:
1 2 3 4 5 6 7 |
plugins { id("org.cyclonedx.bom") version "1.8.2" } tasks.cyclonedxBom { outputName = "bom" } |
Для генерации файла SBOM достаточно выполнить задачу cyclonedxBom
:
1 |
gradle cyclonedxBom |
Итоговый файл будет build/reports/bom.json
.
Для загрузки SBOM в Dependency Track можно использовать один из плагинов от сообщества: com.liftric.dependency-track-companion-plugin
:
1 2 3 4 5 6 7 8 9 10 |
plugins { id("com.liftric.dependency-track-companion-plugin") version "1.2.0" } tasks.uploadSbom { apiKey = "odt_8LMcch82ZmXeyhbX6f9bmrpBXwsNfidH" url = "http://localhost:8081" projectUUID = "4acade64-0c25-4020-a53b-a9f4672c7e21" inputFile = file("build/reports/bom.json") } |
Анализ проекта
С полным деревом зависимостей вы можете ознакомиться на странице проекта:
![](https://alexkosarev.name/wp-content/uploads/2024/07/dtrack_dependencies-1024x509.png)
Так же в списке компонентов можно проанализировать их уязвимости:
![](https://alexkosarev.name/wp-content/uploads/2024/07/dtrack_vulnerabilities-1024x566.png)
Dependency Track предоставляет подробную информацию о найденных уязвимостях:
![](https://alexkosarev.name/wp-content/uploads/2024/07/dtrack_vulnerability_details-1024x706.png)
Напоследок
Старайтесь регулярно отслеживать уязвимости в зависимостях разрабатываемых проектах и периодически анализируйте зависимости на предмет уязвимостей, даже если вы не вносите изменения в проект.