利用Dependency-Check结合Python高效进行开源组件分析

时间:2023-02-15 01:07:36

前言:在软件开发安全、信息科技外包安全管理或者供应链安全管理中,有一个越来越重要的问题变得非常难以绕过,那就是对软件产品中开源软件或开源组件的管控。笔者一直想找一款方便、易用、开源的检测工具,但是没有太好的软件工具。后来找到了OWASP提供的Dependency-Check工具,该工具提供不同的插件,如独立命令行、Maven、Gradle、Jenkins等。笔者对SDL整体流程及工具还不太熟悉,因此就基于独立命令行模式对软件产品进行扫描,但是,当出现比较多的项目时,如100个项目,后期的分析工作变得比较庞大,且不好关联。因此,笔者通过Python对输出的HTML结果进行解析,最终实现多个项目输出到一个EXCEL表单中,那么安全管理人员就可以结合EXCEL的统计、透视功能进一步开展分析了。不过比较尴尬的是,在写完这个脚本后,发现Dependency-Check可以直接输出CSV格式,下次再写个脚本把各个CSV合并为一个表格吧。

一、Dependency-Check下载

https://owasp.org/www-project-dependency-check/,这是官网地址,目前最新版本为8.2.1,如下:

利用Dependency-Check结合Python高效进行开源组件分析

二、下载后,使用命令进行扫描

下载后解压,进入其bin目录:

dependency-check.bat –h 可以查看帮助

dependency-check.bat -s G:\迅雷下载\springmvc-master --project springmvc-master -o springmvc

-s :指定软件目录

--project :指定项目名称,这里可以用软件产品的名称,方便后续分析跟踪

-o :指定报告输出目录,默认为当前目录

运行后会下载漏洞库到本地:

利用Dependency-Check结合Python高效进行开源组件分析

我再这里遇到一个问题,提示:[ERROR] Failed to initialize the RetireJS repo,网上有解决办法,不处理也可以输出最终结果。

输出报告名称默认为:dependency-check-report.html

三、报告结构分析

在Summary下点击以下click to show all,可以展示有漏洞的,以及无漏洞的jar包,如下:

利用Dependency-Check结合Python高效进行开源组件分析

可以看到包括了Dependency、Vulerability IDs、Package、Highest Serverity、CVE Count、Confidence、Evidence Count几个字段。这几个字段通过F12查看HTML结构:

利用Dependency-Check结合Python高效进行开源组件分析

可以看到所有的jar包都包含在tbody中,每一行一个tr标签,每个tr标签中又有多个td标签,因此可以将相关的字段取出,然后再分别写入EXCEL表格即可。

四、脚本编写

思路:利用Dependency-Check进行扫描,将得到的输出文件放在指定目录中。给定脚本扫描的目录路径,找到其中html文件,然后再逐个读取文件,通过BeautifulSoup进行解析,解析结果为列表,再通过openpyxl写入excel文件中。具体如下:

1、 给定扫描目录,返回其中的HTML文件:

def scanHtml(path):
    htmlList = []     fileList = os.listdir(path)
    for f in fileList:
        if f.endswith(".html"):
            htmlList.append(f)
    return htmlList

2、 读取文件内容:

def getContent(path, filename):
    file = open(path + '\/' + filename, 'r', encoding='utf-8').readlines()
    return file

3、 对文件内容进行解析:

def contentParse(file):

    resultlist = []

    dalist = []

    file = file

    soup = BeautifulSoup(str(file), 'html.parser')
#读取不含漏洞的三方组件

    notvulnerables = soup.find_all('tr', {"class": "notvulnerable"})

#读取含漏洞的三方组件
vulnerables = soup.find_all('tr', {"class": "vulnerable"})

    project = soup.find('div', {"class": "wrapper"})
#读取HTML文件中的项目Project值

    pro = project.findChild('h2').getText().split(":")[-1]

#对含漏洞的三方组件逐个进行处理

    for vul in vulnerables:

        da = vul.find_all('td')

        for i in range(len(da)):

            dalist.append(da[i].get_text("|"))

        resultlist.append(dalist)

        dalist = []
#对不含漏洞的三方组件逐个进行处理

    for notvul in notvulnerables:

        da1 = notvul.find_all('td')

        for i in range(len(da1)):

            dalist.append(da1[i].get_text("|"))

        resultlist.append(dalist)

        dalist = []
#将解析结果及项目名称一起返回

    return resultlist, pro

4、 将解析的具体结果写入excel文件中

def workbookParse(htmlList, path, name):

    wb = Workbook()

    ws = wb.active

    ws.title = "independcy2"

    sheet = wb['independcy2']
    #定义EXCEL的表单字段

    sheet.append(['Project', 'name', 'vulID', 'package', 'Severity', 'CVECount', 'Confidence', 'Evidence'])

    for i in range(len(htmlList)):

        file = getContent(path, htmlList[i])

        data, project = contentParse(file)

        print(project)



        for d in data:
     #解析结果data是一个列表,通过insert方法在每个列表前插入project名称

            d.insert(0, project)
#将列表通过workboot的append方法写入到EXCEL的页签表单中

            sheet.append(d)
    #保存为xlsx格式

         wb.save(name + '.xlsx')

5、 主方法,接收键盘输入扫描目录,保存的文件名

def main():

    parser = optparse.OptionParser('Usage%prog ' + '-p <Path to Scan> -n <name to save,.csv>')

    parser.add_option('-p', dest='path', type='string', help='path to scan')

    parser.add_option('-n', dest='name', type='string', help='ame to save,.csv')

    (options, args) = parser.parse_args()

    path = options.path

    name = options.name

    if path == None or name == None:

        print(parser.usage)

        exit(0)

    htmlList = scanHtml(path)

    print(htmlList)

    workbookParse(htmlList, path, name)

6、 最后是main方法执行

if __name__ == '__main__':

    main()

 

五、测试效果

1、 执行命令:python 7.py -p E:\工具\dependency-check-8.1.2-release\dependency-check\bin -n test2

利用Dependency-Check结合Python高效进行开源组件分析

2、 查看处置结果:

利用Dependency-Check结合Python高效进行开源组件分析

这样在一张EXCEL表中可以呈现多个项目的开源组件情况,可以进一步筛选透视进行分析。

3、 最后程序可以查看帮助,输入错误会打印帮助信息:

利用Dependency-Check结合Python高效进行开源组件分析

六、写在最后

Dependency-Check软件作为一款开源软件可以很好的分析JAVA程序中的开源组件,如果我有大量的项目要分析,那么就涉及如何将扫描结果进行整合,我这里是将所有的结果文件进行解析,然后写入EXCEL表格中。不过在后来才发现Dependency-Check可以直接输出为CSV格式,只不过多个项目的话需要进行合并处理,后续在写个脚本玩一下。另外,也可以将扫描结果存入数据库,然后在数据库中进行保存,以备后续分析。