一、目的
本文主要記錄我在搭建安全體系中第三方依賴檢查的過程中,使用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下載
- command line安裝包下載地址:https://owasp.org/www-project-dependency-check/
- 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}
- 前提:
- 安裝jenkins的dependency-check查看,方便發布報告用。
- 部署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