【安全測試】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/

    

     點擊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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM