代码改变世界

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

2022-04-02 11:44  码上起舞  阅读(4383)  评论(0编辑  收藏  举报

一、目的

本文主要记录我在搭建安全体系中第三方依赖检查的过程中,使用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/

    

     点击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报告,浏览器打开即可查看扫描内容

扫描结果会有个工程汇总信息,总共扫描多少个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等包,点击构建开始扫描),

 

配置上传文件如下:

4.2 execute shell

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报告

 4.4 jenkins发布html报告

 4.5 构建完成后查看html报告

  4.6 查看jenkins发布的xml报告

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

 

 

 说明:在这个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的漏洞数量

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脚本)

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构建时,提示连接失败

问题解决:
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时,生成报告,报错

问题解决:
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