現代的軟體開發工作大多基於許多 Open-source 的 Library 之上,故當 Library 出現安全漏洞時,也會隨之受到影響。
攻擊者的手法也是日新月異,時常就會有新的弱點被揭露,即使是上個月或上週評估為安全的 Library 可能不再安全。
圖檔來源:How Snyk helps satisfy White House cybersecurity recommendations
今天將來介紹 Dependency-Check 這個專門掃描 Library 弱點的工具,並整合到 CI/CD Pipeline。
Dependency-Check 是一套由 OWASP(Open Web Application Security Project)維護的專案。專門用來檢測軟體專案中的 Library 是否存在已知的安全漏洞,幫助開發者及安全團隊及時發現並修補潛在的安全風險。
能掃描多種語言的 Library 並產生弱點報告
Dependency-Check 基於 美國國家標準暨技術研究院 (National Institute of Standards and Technology) 發佈的 國家漏洞資料庫(National Vulnerability Database) 為資料來源作為弱點的風險評分基準。
透過 CLI 與 Plugin 掃描軟體專案的 Library 資訊(如 build.gradle、pom.xml)與 CVE 清單進行比對後,產出弱點報告。
依據 官方文件
讀者能用自己的專案,或 直接 git clone 此 Github 專案
若使用我提供的專案能跳過此步驟。
依 Maven 為例,再 pom.xml 添加以下設定即可,其他套件管理工具的 Plugin 安裝方式,可參考 官方文件/Modules
<project>
...
<build>
...
<plugins>
...
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>10.0.4</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
...
</plugins>
...
</build>
...
</project>
依 maven 為例,執行以下指令
# 有 NVD API Key 用此指令,會下載比較快
NVD_API_KEY=<你的 NVD API Key>
mvn verify -DnvdApiKey=$NVD_API_KEY
# 沒有 NVD API Key 則執行此指令
mvn verify
📘 第一次執行時,Dependency-Check 會將 CVE 資料下載到本地快取,所以可能會花費 5 ~ 10 分鐘,若有搭配 NVD API Key 能加快下載速度。
掃描完成應該能看到以下日誌
[INFO] Writing HTML report to: /Users/leokao/git/app-backend/target/dependency-check-report.html
# ...省略
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 7.614 s
[INFO] Finished at: 2024-10-03T21:21:17+08:00
[INFO] ------------------------------------------------------------------------
開啟 target/dependency-check-report.html
的掃描報告
能看到 Summary 中列出了該軟體專案中哪些 Library 有弱點(綠框區塊),並且標示出 風險等級(紅框區塊)。
點擊任何一個 Library 名稱,則會跳轉到該套件的弱點明細
這裡除了有該套件的基本資訊之外,還嘔 CVE 的說明與連結(紅框區塊) 與 第三方的參考資訊(綠框區塊),節省人工另外查詢每個 CVE 的時間。
使用 Github Action 建構出 Jar 之前進行弱點掃描,若有 CVSS 超過 8 的弱點時,中斷建構,並上傳弱點報告。
📘 讀者也能 fork 此 Github 專案 即可
新增 build.yml 到專案目錄:.github/workflows/
。
# .. 以上省略
# 執行 dependency-check 的 job
dependency-check:
runs-on: ubuntu-latest
steps:
# .. 省略
- name: Analysis
run: ./mvnw verify -DfailBuildOnCVSS=8
# 若建構失敗,則上傳 dependency-check report
- name: upload reports
if: failure()
uses: actions/upload-artifact@v4
with:
name: reports
path: |
**/target/dependency-check-report.html
build-jar:
runs-on: ubuntu-latest
# 需要 test job 與 dependency-check job 通過後才 build jar
needs: [ test, dependency-check ]
# ..以下省略
能看到 dependency-check
的 Job,使用 ./mvnw verify
執行 Dependency-Check 的弱點掃描 並 加上 -DfailBuildOnCVSS=8
參數,代表掃出 CVSS 8分以上的弱點時,中斷 Pipeline。
開發者能從 Artifacts 區塊中下載弱點報告,進行弱點排除。
Dependency-Check 也能透過 dependency-check-sonar-plugin 無縫的 SonarQube Quality Gate 進行整合, 作為控管代碼品質與弱點防護的控制點,每次建構軟體成品時,當發現 OSS 超過閥值時,則中斷部署。
除了能控制部署流之外,也能透過 UI 方便的檢視弱點掃描報告。
圖檔來源:SonarQube & OWASP Dependency Check for Java Project
圖檔來源:SonarQube & OWASP Dependency Check for Java Project
今天介紹了如何使用 Dependency-Check 改善傳統低頻率且被動的弱點掃描計畫,將其自動化整合到 CI/CD Pipeline,以便在軟體專案建構過程中進行 Library 弱點掃描,避免弱點進入生產環境。這樣的方式不僅能強化了軟體開發流程中的安全防護,也有效減少了人工檢查的時間與成本。