- PVSM.RU - https://www.pvsm.ru -

Использование сканера уязвимостей в используемых библиотеках Dependency-Check в GitlabCI

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

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

В этом посте рассмотрим использование OWASP Dependency Check для прерывания сборки в случае обнаружения серьезных проблем с вашим кодом.

В книге "Безопасность разработки в Agile-проектах" описан так. OWASP Dependency Check – это бесплатный сканер, который каталогизирует все используемые в приложении компоненты с открытым исходным кодом и показывает имеющиеся в них уязвимости. Имеются версии для Java, .NET, Ruby (gemspec), PHP (composer), Node.js и Python, а также для некоторых проектов на C/C++. Dependency Check интегрируется с распространенными средствами сборки, в т. ч. Ant, Maven и Gradle и серверами непрерывной интеграции типа Jenkins.

Dependency Check сообщает обо всех компонентах с известными уязвимостями из Национальной базы данных уязвимос­тей (NVD) NIST и обновляется на основании данных из новостных каналов NVD.

По счастью, все это можно делать автоматически с помощью таких инструментов, как проект OWASP Dependency Check, или коммерческих программ типа Black Duck (https://www.blackducksoftware.com/solutions/application-security [1]), JFrog Xray (https://jfrog.com/xray/ [2]), Snyk (https://snyk.io/ [3]), Nexus Lifecycle (https://www.sonatype.com/nexus-lifecycle [4]) компании Sonatype или SourceClear (https://srcclr.com/ [5]).
Эти инструменты можно включить в сборочные конвейеры, чтобы автоматически составлять опись зависимостей с открытым исходным кодом, выявлять устаревшие версии библиотек и библиотеки, содержащие известные уязвимости, и прерывать сборку в случае обнаружения серьезных проблем.

OWASP Dependency Check

Для тестирования и демонстрации работы Dependency Check используем этот репозиторий dependency-check-example [6].

Для просмотра HTML отчета нужно настроить web-севрер nginx на вашем gitlab-runner.

Пример минимального конфига nginx:

server {
    listen       9999;
    listen       [::]:9999;
    server_name  _;
    root         /home/gitlab-runner/builds;

    location / {
        autoindex on;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

В конце сборки вы можете видеть вот таку картину:

Использование сканера уязвимостей в используемых библиотеках Dependency-Check в GitlabCI - 1

Переходим по ссылке и видим отчет Dependency Check.

Первый скриншот — верхняя часть отчета с кратким содержанием.

Использование сканера уязвимостей в используемых библиотеках Dependency-Check в GitlabCI - 2

Второй скриншот подробности CVE-2017-5638. Здесь мы видим уроверь CVE и ссылки на эксплойты.

Использование сканера уязвимостей в используемых библиотеках Dependency-Check в GitlabCI - 3

Третий скриншот — подробности log4j-api-2.7.jar. Видим что уровни CVE 7.5 и 9.8.

Использование сканера уязвимостей в используемых библиотеках Dependency-Check в GitlabCI - 4

Четвертый скриншот — подробности commons-fileupload-1.3.2.jar. Видим что уровни CVE 7.5 и 9.8.

Использование сканера уязвимостей в используемых библиотеках Dependency-Check в GitlabCI - 5

Если вы хотите использовать gitlab pages, то не получится — упавшая таска не создаст артефакт.

Пример здесь https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages [7].

Вывод сборки: артефактов нет, html отчета не вижу.

https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages/-/jobs/400004246 [8]

Использование сканера уязвимостей в используемых библиотеках Dependency-Check в GitlabCI - 6

Регулирование уровня CVE уязвимостей

Самая главная строка в файле gitlab-ci.yaml:

mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7

Параметром failBuildOnCVSS вы можете регулировать уровень CVE уязвимостей, на которые нужно реагировать.

Скачивание с интернета базы данных уязвимос­тей (NVD) NIST

Вы заметили что постоянно скачивает базы данных уязвимос­тей (NVD) NIST с интернета:

Использование сканера уязвимостей в используемых библиотеках Dependency-Check в GitlabCI - 7

Для скачивания можно использовать утилиту nist_data_mirror_golang [9]

Установим и запустим ее.

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nist_data_mirror_golang
yum -y install nist-data-mirror
systemctl start nist-data-mirror

Nist-data-mirror закачивает CVE JSON NIST в /var/www/repos/nist-data-mirror/ при запуске и обновляет данные каждые 24 часа.

Для скачивания CVE JSON NIST нужно настроить web-севрер nginx (например на вашем gitlab-runner).

Пример минимального конфига nginx:

server {
    listen       12345;
    listen       [::]:12345;
    server_name  _;
    root         /var/www/repos/nist-data-mirror/;

    location / {
        autoindex on;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }

}

Чтобы не делать длинную строку где запускается mvn вынесем параметры в отдельную переменную DEPENDENCY_OPTS.

Итоговый минимальный конфиг .gitlab-ci.yml получится вот так:

variables:
  MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
  DEPENDENCY_OPTS: "-DfailBuildOnCVSS=7 -DcveUrlModified=http://localhost:12345/nvdcve-1.1-modified.json.gz -DcveUrlBase=http://localhost:12345/nvdcve-1.1-%d.json.gz"

cache:
  paths:
    - .m2/repository

verify:
  stage: test
  script:
    - set +e
    - mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check $DEPENDENCY_OPTS || EXIT_CODE=$?
    - export PATH_WITHOUT_HOME=$(pwd | sed -e "s//home/gitlab-runner/builds//g")
    - echo "************************* URL Dependency-check-report.html *************************"
    - echo "http://$HOSTNAME:9999$PATH_WITHOUT_HOME/target/dependency-check-report.html"
    - set -e
    - exit ${EXIT_CODE}
  tags:
    - shell

Telegram канал про DevOps and Security: https://t.me/devsecops_ru [10]

Автор: Пацев Антон

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/informatsionnaya-bezopasnost/342995

Ссылки в тексте:

[1] https://www.blackducksoftware.com/solutions/application-security: https://www.blackducksoftware.com/solutions/application-security

[2] https://jfrog.com/xray/: https://jfrog.com/xray/

[3] https://snyk.io/: https://snyk.io/

[4] https://www.sonatype.com/nexus-lifecycle: https://www.sonatype.com/nexus-lifecycle

[5] https://srcclr.com/: https://srcclr.com/

[6] dependency-check-example: https://github.com/patsevanton/dependency-check-example

[7] https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages: https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages

[8] https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages/-/jobs/400004246: https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages/-/jobs/400004246

[9] nist_data_mirror_golang: https://github.com/patsevanton/nist_data_mirror_golang

[10] https://t.me/devsecops_ru: https://t.me/devsecops_ru

[11] Источник: https://habr.com/ru/post/483716/?utm_source=habrahabr&utm_medium=rss&utm_campaign=483716