Dependency Check

Dependency Check

本文转自 icybersec 并作补充

https://github.com/jeremylong/DependencyCheck

简介

Dependency-Check 是一个开源的安全漏洞扫描工具,用于检查应用程序和依赖项中的已知漏洞。它可以扫描各种编程语言的依赖项,如Java、Python、.NET等,并根据公开的漏洞数据库,如NVD、OSV等,检查依赖项的版本是否存在已知的安全漏洞。

Dependency-Check 可以通过命令行或插件集成到各种构建工具中,如Maven、Gradle、Ant等。它会生成报告,显示已检测到的漏洞以及建议的修复措施。这些报告可以帮助开发人员识别和解决与应用程序或依赖项相关的安全问题,从而提高应用程序的安全性。

cli

dependency-check.sh支持的参数:

  • –advancedHelp:打印高级帮助信息。
  • –enableExperimental:启用实验性的分析器。
  • –exclude :指定一个排除模式。可以多次指定此选项,并接受 Ant 风格的排除。
  • -f,–format :指定报告格式(HTML、XML、CSV、JSON、JUNIT、SARIF、JENKINS 或 ALL)。默认为 HTML。可以指定多个格式参数。
  • –failOnCVSS :指定如果检测到 CVSS 分数高于指定级别的漏洞,构建是否应该失败。默认为 11;由于 CVSS 分数为 0-10,因此默认情况下构建永远不会失败。
  • -h,–help:打印帮助信息。
  • –junitFailOnCVSS :指定在生成 junit 报告时,被认为是失败的 CVSS 分数。默认值为 0。
  • -l,–log :写入详细日志信息的文件路径。
  • -n,–noupdate:禁用自动更新 NVD-CVE、hosted-suppressions 和 RetireJS 数据。
  • -o,–out :写入报告的文件夹路径。默认为当前目录。如果未将格式参数设置为 ALL,则可以将其设置为特定的文件名。
  • –prettyPrint:指定 JSON 和 XML 报告格式将被漂亮地打印。
  • –project :正在扫描的项目的名称。
  • -s,–scan :要扫描的路径 - 可以多次指定此选项。支持 Ant 风格的路径(例如,’path/**/*.jar’);如果使用 Ant 风格的路径,则强烈建议将参数值用引号引起来。
  • –suppression :抑制 XML 文件的文件路径。可以多次指定此选项以使用多个抑制文件。
  • -v,–version:打印版本信息。

对webgoat7的组件进行扫描

https://github.com/mpogr/WebGoat-7.0.1

1
./dependency-check.sh -s /tmp/WebGoat-7.0.1/ --project webgoat

输出扫描报告,没有扫描到有用的东西。

image

jenkins

docker启动Jenkins

1
docker run -itd -p 8080:8080 -p 50000:50000 -u root -v /tmp/jenkins:/var/jenkins_home   -v  /tmp/maven:/usr/local/maven jenkins/jenkins:2.344

安装插件

image

全局工具配置

Jenkins可以通过全局工具配置来安装一个或多个Dependency-Check版本。可以自动安装Dependency-Check,这将从Github下载并提取官方的命令行界面(CLI),或者可以手动安装官方版本,并在配置中引用安装路径。Dependency-Check是一个用于识别应用程序中存在的已知漏洞和依赖项的开源工具。

image

Builder

Builder是指使用预定义的Dependency-Check CLI安装之一执行分析的组件。在Jenkins中,特定于配置的部分很少,工作配置中的重要方面是“Arguments”字段,该字段直接发送到定义的CLI安装程序。Builder用于在Jenkins工作流中集成Dependency-Check分析。Builder的配置将传递给Dependency-Check CLI进行分析,并将分析结果传递回Jenkins用于显示和后续处理。

对webgoat进行maven编译,生成JAR包

image

Publisher

Publisher是一个独立于工具配置或Builder的组件,负责读取dependency-check-report.xml并生成指标、趋势、发现,并根据可配置的阈值选择性地将构建设为失败或警告状态。在Jenkins工作流程中,Publisher用于生成Dependency-Check的度量和报告,并可根据预定义的阈值将构建标记为失败或警告状态。通过读取dependency-check-report.xml文件,Publisher可以对构建进行分析并提供有关依赖项和已知漏洞的详细信息。

image

结果

构建结果

image

当任务配置了Publisher时,趋势图将显示按严重性分组的结果总数。

image

点击Latest Dependency-Check,可以看到具体的组件报告

image

image

maven

mvn

这是 Maven 插件 Dependency-Check 的命令,用于检测应用程序依赖项中已知漏洞并生成报告。

1
mvn org.owasp:dependency-check-maven:check
1
mvn org.owasp:dependency-check-maven:aggregate

命令执行是全面的漏洞扫描,并生成包含所有依赖项中已知漏洞信息的报告

image

使用maven进行扫描webgoat7可以看到报告里面有JAR包组件漏洞,比直接CLI扫描更能发现问题。

image

pom.xml

①检测组件

在目标目录中创建 dependency-check-report.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.1.2</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>

在IDEA进行maven verify,生成报告

image

②检测所有依赖项

在站点内创建汇总的依赖性检查报告

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<project>
...
<reporting>
...
<plugins>
...
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.1.2</version>
<reportSets>
<reportSet>
<reports>
<report>aggregate</report>
</reports>
</reportSet>
</reportSets>
</plugin>
...
</plugins>
...
</reporting>
...
</project>

③CVSS评分过滤

创建 dependency-check-report.html 并使 CVSS 大于或等于 8 的构建失败

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.1.2</version>
<configuration>
<failBuildOnCVSS>8</failBuildOnCVSS>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>

效果如下

image

④跳过没有使用到组件

通常情况下,使用 mvn org.owasp:dependency-check-maven:aggregate命令来运行 OWASP 的 “dependency-check-maven” 插件,以检查项目依赖项中是否存在已知的安全漏洞,并生成报告。

但是,有时候我们不想包含某些依赖项,比如 provided 范围的依赖,这些依赖项不会被打包到分发包中,因此不需要进行漏洞检查。在这种情况下,可以使用上述命令来创建报告并跳过这些依赖项,以提高效率和减少报告中的噪音。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.1.2</version>
<configuration>
<skipProvidedScope>true</skipProvidedScope>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>

⑤使用内部CVE源

创建 dependency-check-report.html报告文件,并使用内部 CVE 内容的镜像。这意味着,dependency-check-maven插件将使用本地存储的 CVE 内容,而不是从网络上获取。这通常可以提高扫描的速度,并且可以在没有网络连接的情况下进行扫描。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.1.2</version>
<configuration>
<cveUrlModified>http://internal-mirror.mycorp.com/nvdcve-1.1-modified.json.gz</cveUrlModified>
<cveUrlBase>http://internal-mirror.mycorp.com/nvdcve-1.1-%d.json.gz</cveUrlBase>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>

⑥仅更新仓库

从 NIST 更新 NVD 数据的本地缓存,而不分析依赖关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.1.2</version>
<executions>
<execution>
<goals>
<goal>update-only</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>

⑦抑制误报

使用多个抑制文件(例如公司范围的抑制文件和本地项目文件)抑制误报。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>8.1.2</version>
<configuration>
<suppressionFiles>
<suppressionFile>http://example.org/suppression.xml</suppressionFile>
<suppressionFile>project-suppression.xml</suppressionFile>
</suppressionFiles>
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>

【安全测试】Owasp Dependency-check 集成jenkins

【安全测试】Owasp Dependency-check 集成jenkins

本文转自 码上起舞 并作补充

一、目的

本文主要记录我在搭建安全体系中第三方依赖检查的过程中,使用Owsap dependency-check的过程及问题

二、OWASP Dependency-check简介

dependency-check适用于对代码中使用到的第三方依赖包进行扫描检测,查看引入的第三方包是否有已知的漏洞和缺陷,及早暴露风险及解决。

其原理可以在另一篇文章中查看。

三、OWASP Dependency-check 安装及使用

dependency check支持jenkins插件集成,也支持linux下命令行模式执行,还支持maven等。

ps:maven集成需要修改pom.xml,然后用命令

  • mvn org.owasp:dependency-check-maven:check
  • mvn dependency:list|grep -i “log4j*”
  • mvn dependency:tree

我们采用linux下命令行模式执行,然后在jenkins中execute shell集成denpendency-check的脚本,并利用jenkins插件,发布dependency-check的报告。

3.1 dependency-check下载

  1. command line安装包下载地址:https://owasp.org/www-project-dependency-check/
  2. jenkins插件下载地址:http://updates.jenkins-ci.org/download/plugins/dependency-check-jenkins-plugin/

image

点击Command Line,即可下载 dependency-check-7.0.4-release.zip

3.2 dependency-check使用(纯cmd模式)

将下载下来的dependency包解压后,进入bin目录,可以看到有dependency-check.sh 和dependency-check.bat脚本,sh脚本是linux使用脚本,bat是windows使用脚本。

我们以linux使用为例,将解压后文件夹拷贝到linux目录/data/tools

进入bin目录,执行 sh dependency-check.sh -help 查看命令行使用帮助。

执行扫描命令如下:

DIR=/data/tools/apps/

sh /data/tools/dependency-check/bin/dependency-check.sh -s ${DIR} –format HTML –format XML -o ./ –disableNodeAudit

命令行说明:

  • -s :扫描对象的路径,扫描的是文件夹路径下的所有文件的,例如war包,jar包均可被扫描
  • –format:生成报告的格式
  • -o :报告生成的路径

3.3 查看扫描结果

在-o指定的路径下会生成dependency的dependency-check-report.html报告,浏览器打开即可查看扫描内容

image

扫描结果会有个工程汇总信息,总共扫描多少个dependencies,有多少个漏洞被发现等

在工程信息下面会有汇总信息,比如对应的每个依赖包,例如abc.jar包,对应的cpe信息,以及枚举的漏洞级别数量等信息,每个漏洞对应具体的CVE号。需要具体分析;

也可以结合jenkins发布xml报告,查看更详细的信息,见步骤四。

四、dependency-check集成jenkins配置

  • 目的:扫描指定路径下的文件,路径下可能有需要部署的jar包和war包。路径暂定jenkins的变量${WORKSPACE}
  • 前提:
  1. 安装jenkins的dependency-check查看,方便发布报告用。
  2. 部署jenkins的linux服务器上已经安装第三部安装好dependency check软件包。

4.1 新建jenkins工程,自由风格

配置完成后构建效果如下,可以上传文件(jar,war,zip等包,点击构建开始扫描)

image

配置上传文件如下:

image

4.2 execute shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
cp jsrepository.json.right jsrepository.json #这步是因为有时候会构建失败,然后发现jsrepository.json是空的,每次扫描前用一个正确的去替换,确保扫描的稳定性
echo ${BUILD_NUMBER}echo ${WORKSPACE}cd ${WORKSPACE}
sh /home/appdeploy/dependency-check/bin/dependency-check.sh -s ${WORKSPACE}/file/ --format HTML --format XML -o ./
#如果使用本地库,需加上如下命令参数(本地镜像库需自己搭建后,将这些文件发布成可以http访问)
--cveUrlModified http://nvdcve-mirror.domain.com/nvdcve-1.1-modified.json.gz  --cveUrlBase http://nvdcve-mirror.domain.com/nvdcve-1.1-%d.json.gz

### 4.3 jenkins发布xml报告

![image](5.png)

### 4.4 jenkins发布html报告

![image](6.png)

### 4.5 构建完成后查看html报告

![image](7.png)

### 4.6 查看jenkins发布的xml报告

点击进入构建号的build页,左侧可以看到Dependency-check的选项,点击即可出现表格式的漏洞汇总

![image](8.png)

![image](9.png)

说明:在这个dependecny-check结果列表里面,会列出所有有漏洞的第三方依赖包,包括依赖包的名字,对应的漏洞CVE id,漏洞等级等信息,点击对应的包名,可以查看依赖包所在的路径,以及漏洞的描述。如果信息不够,可以查看html中的详细内容,以及搜索对应的CVE编号,去NVD漏洞库中查看完整的漏洞信息及解决方案。

NVD漏洞库:https://nvd.nist.gov/vuln/detail/CVE-2020-44226

不同的漏洞编号,替换后面的CVE编号查询即可。

**报告中一些重要字段的含义:**

· Dependency - 被扫描的第三依赖库名字

· CPE - 所有被识别出来的CPE.

· GAV - Maven 组, Artifact, 版本 (GAV).

· Highest Severity - 所有关联的cve的最高漏洞等级

· CVE Count - 关联的cve个数

· CPE Confidence - dependency-check正确识别cpe的程度

· Evidence Count - 识别CPE的数据个数

### 4.7 举一反三

- 1.扫描中的dir可以提取出来当build with param的参数,可以单独执行,也可以上下游工程串联执行
- 2.扫描中的dir可以是git自动down下来的文件夹目录,即只要构建参数指定git地址和分支名称,即可实现对该分支自动扫描

## 五、解析html文件用于消息的发送

解析html报告的代码文件get_security_result.py,获取html报告中summary数据中的critical的漏洞数量

```python
from bs4 import BeautifulSoup
from lxml import etree

class GetSecRes:

def get_dependency_critical_num_with_lxml(self, filename):
'''
用lxml库解析安全扫描的html报告,并统计出其中的critical的漏洞数量
:param filename: dependency-check扫描完成后生产的html文件,文件名全路径
:return:critical数量
'''
# 读取html文件
with open(filename, encoding='utf-8') as f:
data = f.read()
doc = etree.HTML(data)
# 获取漏洞汇总表中的漏洞行信息
trs = doc.xpath('//*[@id="summaryTable"]//tr[@class=" vulnerable"]')
criticalres = []
# 统计出每行的critical数量
for tr in trs:
tr_list = tr.xpath('./td/@data-sort-value')
td_text = tr.xpath('./td/text()')
tr_list.extend(td_text)
[criticalres.append(td) for td in tr_list if "CRITICAL" == td]
return (len(criticalres))

if __name__ == '__main__':
import sys
filename = sys.argv[1]
criticalres = GetSecRes().get_dependency_critical_num_with_lxml(filename)
print(criticalres)

集成get_security_result.py到jenkins的execute shell中(在sh下执行python脚本)

1
2
critical=$(python3 /data/script/get_security_result.py ${DIR}/dependency-check-report.html)
echo $critical

六、Troubshooting

6.1 Could not connect to Central search. Analysis failed.

问题描述:jenkins构建时,提示连接失败

image

问题解决:
https://issues.jenkins.io/browse/JENKINS-47991
1.原因是jenkins访问maven失败,需要在jenkins服务器开通访问 https://search.maven.org/这个地址的权限
2.测试访问:
# curl https://search.maven.org/

6.2 Failed to request component-reports

问题描述:

jenkins构建dependency-check时,生成报告,报错

image

问题解决:
1.原因是因为jenkins服务器无法访问https://ossindex.sonatype.org/
加上授权即可构建成功

6.3 owasp 需要的外网访问权限包括

https://nvd.nist.gov
https://search.maven.org/
https://ossindex.sonatype.org/
https://retirejs.github.io
https://github.com/advisories
https://registry.npmjs.org
https://www.npmjs.com