Анализ уязвимостей в зависимостях
В современных условиях разработки программного обеспечения крайне редко встречаются проекты, не имеющие внешних зависимостей, и большинство из них — различные библиотеки для работы с различными базами данных. Большая же часть проектов разрабатывается с использованием сторонних зависимостей — библиотек и фреймворков, которые предоставляют готовые решения для большого количества задач. Однако в сторонних зависимостях могут скрываться уязвимости, которыми злоумышленники могут воспользоваться при атаке на разрабатываемые вами проекты. Но потенциальное наличие уязвимостей в сторонних библиотеках не должно стать поводом для отказа от них — вместо этого лучше поддерживать зависимости в актуальном состоянии и анализировать их на предмет уязвимостей.
Различные инструменты для отслеживания уязвимостей в зависимостях интегрированы в 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:
# 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:
После этого 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:
mvn org.cyclonedx:cyclonedx-maven-plugin:2.8.0:makeAggregateBom
Более подробную информацию о работе с данным плагином вы можете найти на странице проекта в GitHub.
Результатом выполнения данной команды будет 2 файла в директории target: bom.json и bom.xml, это и будут сгенерированные SBOM в формате CycloneDX. Данный плагин вы можете добавить в pom.xml вашего проекта:
<project>
<!-- Прочие настройки -->
<build>
<plugins>
<plugin>
<groupId>org.cyclonedx</groupId>
<artifactId>cyclonedx-maven-plugin</artifactId>
<version>2.8.0</version>
</plugin>
</plugins>
</build>
</project>Однако отправлять в Dependency Track нужно следующую структуру:
{
"project": "project-id-from-dependency-track",
"bom": "Base64 encoded bom.json"
}Иными словами в свойство bom нужно поместить содержимое bom.json, закодированное в Base64, должно получиться что-то вроде:
{
"project": "4acade64-0c25-4020-a53b-a9f4672c7e21",
"bom": "ewogICJib21Gb3JtYXQiIDogIkN5Y2xvbmVEWCIsCiAgInN..."
}Полученный файл можно отправить в Dependency Track:
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:
mvn io.github.pmckeown:dependency-track-maven-plugin:1.7.0:upload-bom
Плагин так же можно добавить в настройки проекта:
<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:
plugins {
id("org.cyclonedx.bom") version "1.8.2"
}
tasks.cyclonedxBom {
outputName = "bom"
}Для генерации файла SBOM достаточно выполнить задачу cyclonedxBom:
gradle cyclonedxBom
Итоговый файл будет build/reports/bom.json.
Для загрузки SBOM в Dependency Track можно использовать один из плагинов от сообщества: com.liftric.dependency-track-companion-plugin:
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")
}Анализ проекта
С полным деревом зависимостей вы можете ознакомиться на странице проекта:
Так же в списке компонентов можно проанализировать их уязвимости:
Dependency Track предоставляет подробную информацию о найденных уязвимостях:
Напоследок
Старайтесь регулярно отслеживать уязвимости в зависимостях разрабатываемых проектах и периодически анализируйте зависимости на предмет уязвимостей, даже если вы не вносите изменения в проект.
