前言:在软件开发安全、信息科技外包安全管理或者供应链安全管理中,有一个越来越重要的问题变得非常难以绕过,那就是对软件产品中开源软件或开源组件的管控。笔者一直想找一款方便、易用、开源的检测工具,但是没有太好的软件工具。后来找到了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,如下:
二、下载后,使用命令进行扫描
下载后解压,进入其bin目录:
dependency-check.bat –h 可以查看帮助
dependency-check.bat -s G:\迅雷下载\springmvc-master --project springmvc-master -o springmvc
-s :指定软件目录
--project :指定项目名称,这里可以用软件产品的名称,方便后续分析跟踪
-o :指定报告输出目录,默认为当前目录
运行后会下载漏洞库到本地:
我再这里遇到一个问题,提示:[ERROR] Failed to initialize the RetireJS repo,网上有解决办法,不处理也可以输出最终结果。
输出报告名称默认为:dependency-check-report.html
三、报告结构分析
在Summary下点击以下click to show all,可以展示有漏洞的,以及无漏洞的jar包,如下:
可以看到包括了Dependency、Vulerability IDs、Package、Highest Serverity、CVE Count、Confidence、Evidence Count几个字段。这几个字段通过F12查看HTML结构:
可以看到所有的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
2、 查看处置结果:
这样在一张EXCEL表中可以呈现多个项目的开源组件情况,可以进一步筛选透视进行分析。
3、 最后程序可以查看帮助,输入错误会打印帮助信息:
六、写在最后
Dependency-Check软件作为一款开源软件可以很好的分析JAVA程序中的开源组件,如果我有大量的项目要分析,那么就涉及如何将扫描结果进行整合,我这里是将所有的结果文件进行解析,然后写入EXCEL表格中。不过在后来才发现Dependency-Check可以直接输出为CSV格式,只不过多个项目的话需要进行合并处理,后续在写个脚本玩一下。另外,也可以将扫描结果存入数据库,然后在数据库中进行保存,以备后续分析。