漏洞管理的一个重要部分是彻底了解和保护构成现代系统的软件组件的供应链。 敏捷和 DevOps 团队广泛使用开源库和框架来减少开发时间和成本。 但这枚奖牌也有一个缺点:有机会继承别人的错误和弱点。
显然,团队应该确保知道其应用程序中包含哪些开源组件,确保从已知可靠来源下载已知可靠版本,并在修补新发现的漏洞后下载组件的更新版本。
在这篇文章中,我们将了解如何使用 OWASP 依赖项检查在检测到代码存在严重问题时中止构建。
《敏捷项目中的开发安全》一书中是这样描述的。 OWASP Dependency Check 是一款免费扫描程序,它可以对应用程序中使用的所有开源组件进行分类并显示它们包含的漏洞。 有适用于 Java、.NET、Ruby (gemspec)、PHP (composer)、Node.js 和 Python 以及一些 C/C++ 项目的版本。 Dependency Check 与常见的构建工具集成,包括 Ant、Maven 和 Gradle,以及 Jenkins 等持续集成服务器。
依赖性检查会报告 NIST 国家漏洞数据库 (NVD) 中存在已知漏洞的所有组件,并使用 NVD 新闻源中的数据进行更新。
幸运的是,所有这些都可以使用 OWASP Dependency Check 项目等工具或商业程序自动完成
这些工具可以包含在构建管道中,以自动清点开源依赖项,识别过时版本的库和包含已知漏洞的库,并在检测到严重问题时中止构建。
OWASP 依赖性检查
为了测试和演示依赖项检查的工作原理,我们使用此存储库
要查看 HTML 报告,您需要在 gitlab-runner 上配置 nginx Web 服务器。
最小 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 {
}
}
组装结束后你可以看到这张图:
单击链接并查看依赖性检查报告。
第一个屏幕截图是报告的顶部部分,其中包含摘要。
第二个屏幕截图详细说明了 CVE-2017-5638。 在这里我们可以看到 CVE 级别和漏洞利用链接。
第三张截图是log4j-api-2.7.jar的详细信息。 我们看到 CVE 水平为 7.5 和 9.8。
第四张截图是commons-fileupload-1.3.2.jar的详细信息。 我们看到 CVE 水平为 7.5 和 9.8。
如果你想使用 gitlab 页面,那么它将无法工作 - 失败的任务不会创建工件。
示例在这里
构建输出:没有工件,我没有看到 html 报告。 你应该尝试 Artifact: 总是
规范CVE漏洞级别
gitlab-ci.yaml 文件中最重要的一行:
mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7
使用failBuildOnCVSS参数,您可以调整需要响应的CVE漏洞的级别。
从 Internet 下载 NIST 漏洞数据库 (NVD)
您是否注意到 NIST 不断从互联网下载 NIST 漏洞数据库(NVD):
要下载,您可以使用该实用程序
让我们安装并启动它。
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 在启动时将 NIST JSON CVE 上传到 /var/www/repos/nist-data-mirror/ 并每 24 小时更新一次数据。
要下载 CVE JSON NIST,您需要配置 nginx Web 服务器(例如,在 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 install 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
来源: habr.com