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

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

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

Различные инструменты для отслеживания уязвимостей в зависимостях интегрированы в 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:

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

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

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

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

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

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

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

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

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

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

Данный идентификатор вам нужно указывать в 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, либо создать новый ключ, в т.ч. и в других группах.

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

Полученный ключ 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")
}

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

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

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

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

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

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

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

Напоследок

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

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

64 views·3 shares