探索軟體組合分析
軟體組合分析 (SCA) 是一種自動化過程,用於識別應用程式中的開源和第三方元件,分析其安全漏洞、授權合規性和程式碼品質。 隨著現代應用程式越來越依賴外部依賴關係,SCA 對於管理與軟體供應鏈相關的風險至關重要。
什麼是軟體組成分析?
軟體組合分析 是自動發現、編目和分析應用程式中使用的所有開放原始碼和第三方元件的做法。 SCA 工具檢查套件清單、依賴鎖定檔案、原始程式碼和編譯的二進位檔,以建立全面的軟體物料清單 (SBOM)。
核心 SCA 功能
依賴性發現:
- 清單解析: SCA 工具會讀取套件資訊清單檔 (package.json, requirements.txt, pom.xml, *.csproj) ,以識別宣告的相依關係。
- 鎖定檔案分析: 分析鎖定檔案(package-lock.json、Pipfile.lock、Gemfile.lock),顯示確切的已安裝版本,包括傳遞依賴項。
- 二進位掃描: 進階工具會掃描已編譯的成品、容器映像和已部署的應用程式,以探索資訊清單中未宣告的內嵌相依性。
- 多語言支援: 全面的工具支援數十種程式語言和套件生態系統(npm、PyPI、Maven、NuGet、RubyGems、Go 模組)。
漏洞分析:
- CVE比對: 將探索到的相依性與常見弱點和暴露 (CVE) 資料庫進行比較。
- 嚴重性評分: 計算通用漏洞評分系統 (CVSS) 分數,指出漏洞嚴重性從 0(無)到 10(嚴重)。
- 惡意探索情報:識別哪些弱點已知有弱點被攻擊者主動惡意探索。
- 補丁建議: 建議特定版本升級,以解決漏洞,同時保持相容性。
授權合規性:
- 授權偵測: 透過分析授權檔案、套件中繼資料和原始程式碼標頭來識別所有相依性的授權。
- 政策執行: 自動標示違反組織授權原則的相依性。
- 相容性分析: 偵測無法在同一應用程式中合法組合的衝突授權。
- 義務追蹤: 記錄授權要求,例如歸屬通知、原始程式碼揭露或衍生作品限制。
品質評估:
- 維護狀態: 評估依賴關係是否被主動維護或放棄。
- 社區健康: 評估貢獻者活動、社群規模和專案永續性。
- 安全實踐: 驗證專案具有負責任的揭露流程和安全建議。
- 更新建議: 識別過時的依賴關係並提出更安全、更最新的替代方案。
為什麼 SCA 對 DevOps 至關重要
現代軟體開發實踐使 SCA 不可或缺:
相依性爆炸
應用程式包含數百個相依性:
- 直接依賴: 典型應用直接引用 20-50 個外部封裝。
- 可傳遞相依性: 每個直接依賴項都會帶來自己的依賴項,從而創建總共 200-500 個包的依賴項樹。
- 多個生態系統: 應用程式通常會結合來自多種語言生態系統 (JavaScript 前端、Python 後端、Java 微服務) 的相依性。
- 容器相依性: 容器化應用程式包括基礎映像相依性以及應用程式相依性。
手動追蹤是不可能的:
- 規模: 手動追蹤數十個應用程式中的數百個依賴性是不切實際的。
- 速度: 每天都會披露新的漏洞,使任何手動庫存立即過時。
- 複雜: 了解傳遞依賴鏈及其交互需要自動化分析。
- 分配所有權: 由全球數千個獨立開源項目維護的依賴關係。
安全當務之急
依賴項中的漏洞被積極利用:
- 備受矚目的違規行為: 重大安全事件通常涉及利用流行的開源套件中的已知漏洞。
- 供應鏈攻擊: 攻擊者破壞合法軟體包,將惡意軟體分發給下游消費者。
- 零時差弱點:廣泛使用的套件中先前已知的弱點,可能同時影響數千個組織。
- 補丁緊急性: 嚴重漏洞需要在所有受影響的應用程式中快速識別和修復。
傳統安全工具遺漏依賴漏洞:
- 靜態分析: 原始程式碼掃描工具會分析您的程式碼,但不會分析相依性程式碼。
- 動態測試: 滲透測試可能會遺漏測試期間未觸發的相依性中的弱點。
- 手動審核: 安全團隊無法切實地審查數百個第三方套件的原始程式碼。
- 專業檢測: 需要專門設計用於識別依賴漏洞的 SCA 工具。
合規要求
違反許可證會帶來重大風險:
- 法律責任: 在不遵守授權條款的情況下使用依賴項可能會導致訴訟和損害。
- 強制開源: 強制性著作權許可證(GPL、AGPL)可能要求整個應用程式開源。
- 分發限制: 某些許可證禁止商業分發或施加使用限制。
- 審核要求: 監管框架越來越要求組織維護準確的軟體物料清單。
許可證複雜性:
- 數百種許可證類型: 開源生態系統包括數百個具有不同義務的不同許可證。
- 相容性問題: 不同的許可證具有相互衝突的條款,禁止它們一起使用。
- 可轉移授權: 必須追蹤並滿足可轉移相依性的授權義務。
- 授權變更: 專案有時會在版本之間變更授權,需要持續監控。
SCA 工具的運作方式
SCA 工具採用多種技術來發現和分析依賴關係:
探索機制
資訊清單檔案剖析:
- 特定語言格式:工具可瞭解每種語言的套件資訊清單格式 (npmpackage.json、Python requirements.txt、Maven pom.xml)。
- 依賴關係解決: 剖析相依性版本規格,包括範圍、限制和解析規則。
- 工作區掃描:遞迴掃描專案目錄,以尋找單一存放庫和多專案工作區中的所有資訊清單檔案。
- 配置意識: 分別考慮開發、測試、生產環境中的特定依賴關係。
依賴鎖定檔案分析:
- 確切版本: 鎖定檔案記錄所有依賴項的精確版本,包括可傳遞依賴項。
- 安裝狀態: 代表實際安裝的相依性,而不是抽象的需求。
- 確定性解析度: 鎖定檔案可確保跨環境的相依性版本一致。
- 完整的依賴關係圖: 包含具有版本解析的完整可轉移相依性樹狀結構。
二進位和構件掃描:
- 編譯的工件: 掃描 JAR 檔案、滾輪檔案、DLL 和可執行檔以識別內嵌的依賴項。
- 容器映像層: 分析容器映像層以探索基礎映像元件和應用程式相依性。
- 檔案系統掃描: 檢查已部署的應用程式檔案系統,以尋找資訊清單中未宣告的相依性。
- 指紋識別: 使用加密雜湊來識別特定的套件版本,即使沒有中繼資料。
構建集成:
- 構建工具插件: 與建置系統 (Maven、Gradle、webpack、pip) 整合,以在建置期間擷取相依性資訊。
- 解析鉤子: 掛接至相依性解析程式,以記錄已安裝的確切版本。
- 構件生成: 在建置期間產生軟體物料清單(SBOM)生成物,以供下游使用。
- 管道整合: 在 CI/CD 管道中作為自動化步驟執行,以便分析每個組建。
分析能力
漏洞匹配:
- 資料庫查詢: 查詢國家弱點資料庫 (NVD)、GitHub 諮詢資料庫和專有弱點資料庫。
- 版本範圍匹配: 判斷特定套件版本是否屬於易受攻擊的版本範圍。
- 修補程式驗證: 確認套用的修補程式是否確實解決了報告的漏洞。
- 優先順序: 依嚴重性、可利用性和業務影響對漏洞進行排名。
許可證識別:
- 多個來源: 從套件中繼資料、授權檔案、來源標頭和讀我文件中提取授權資訊。
- 授權正規化: 將各種授權名稱和識別碼(SPDX、OSI)對應到標準化授權類型。
- 雙重許可: 處理在多個替代授權下發行的套件。
- 自訂授權: 識別需要法律審查的非標準許可證。
可達性分析:
- 呼叫圖建構: 建立呼叫圖表,顯示應用程式實際執行的相依性程式碼。
- 死碼檢測: 識別捆綁但從未實際使用的依賴項。
- 漏洞利用路徑分析: 判斷應用程式進入點是否可到達易受攻擊的程式碼路徑。
- 風險細化: 透過專注於實際使用的程式碼中可利用的漏洞來減少噪音。
持續監控:
- 即時警報: 當影響您的依賴關係的新漏洞被揭露時,立即收到通知。
- 排程掃描: 定期重新掃描應用程式,以偵測未變更的相依性中新發現的弱點。
- 基線比較: 追蹤漏洞和合規狀態隨時間的變化。
- 預防回歸: 當新的相依性引入漏洞或授權違規時發出警報。
SCA 整合模式
有效的 SCA 實作涉及在開發生命週期中多個點的整合:
開發人員工作站
IDE整合:
- 即時回饋: 當開發人員將相依性新增至專案時,會掃描相依性。
- 內嵌警告: 直接在 IDE 中顯示弱點和授權警告。
- 補救建議: 建議替代套件版本或替代套件。
- 政策執行: 防止新增違反組織原則的相依性。
預提交驗證:
- Git 鉤子: 在提交之前執行 SCA 檢查,以防止引入易受漏洞影響的相依性。
- 本地掃描: 在推送到遠端儲存庫之前,在本機分析變更。
- 快速反饋: 在積極開發期間向開發人員提供即時回饋。
- 早期偵測: 在問題到達共用分支和 CI/CD 管線之前捕捉問題。
源碼管理
提取要求驗證:
- 自動檢查: 對所有提取請求執行 SCA 分析,以偵測相依性變更。
- 檢閱註解:將發現的內容張貼為提取要求註解,以獲得檢閱者可見度。
- 合併封鎖:防止合併引入重大弱點或授權違規的提取要求。
- 依賴變更追蹤: 清楚記錄每個提取請求引入的依賴項變更。
GitHub Dependabot 整合:
- 自動更新: 當相依性安全性更新可用時,自動建立提取要求。
- 弱點警示: 接收易受攻擊相依性的 GitHub 安全性警示。
- 依賴關係圖: 在 GitHub 的相依性圖表功能中視覺化相依性關係。
- 檢閱工作流程: 利用 GitHub 的審查和批准流程進行依賴性更新。
CI/CD 管線
建置時間掃描:
- 管線步驟: 將 SCA 掃描新增為 CI/CD 管線中的自動化建置步驟。
- 優質閘道:讓不符合安全性與合規性需求的組建失效。
- SBOM 產生:建立軟體用料表成品以及建置輸出。
- 審計跟踪: 記錄掃描結果以進行合規性和鑑識。
部署閘道:
- 部署前驗證: 在部署至生產環境之前掃描成品。
- 環境特定政策: 對生產部署套用比開發部署更嚴格的原則。
- 復原觸發:自動復原發現包含重大弱點的部署。
- 部署核准: 需要手動核准具有已知但可接受風險的部署。
執行階段監控
生產掃描:
- 部署的應用程式分析: 掃描實際部署的應用程式以偵測執行階段相依性。
- 容器登錄掃描: 持續掃描儲存在登錄中的容器映像。
- Serverless功能分析: 掃描已部署的無伺服器函數及其相依性。
- 漂移檢測: 識別預期和實際部署的相依性之間的差異。
持續的漏洞監控:
- 持續監控: 監控已部署的應用程式是否有新揭露的弱點,這些弱點會影響目前的相依性。
- 事件回應: 在生產環境中發現嚴重漏洞時觸發事件回應工作流程。
- 補丁規劃: 產生修補程式部署計劃,以解決已部署應用程式中的漏洞。
- SLA 合規性: 追蹤補救時間範圍,以確保符合安全性 SLA。
SCA 工作流程最佳作法
成功的 SCA 實作遵循經過驗證的工作流程:
建立基準線
初始庫存:
- 全面發現: 針對所有應用程式執行 SCA 工具,以建立完整的相依關係庫存。
- 風險評估: 了解當前面臨的漏洞和許可證合規性問題。
- 優先順序: 確定哪些應用程式和漏洞需要立即關注。
- 基準文件: 記錄當前狀態作為衡量改進的基準。
定義原則
安全政策:
- 漏洞嚴重性閾值: 定義哪些嚴重性層級是可接受的 (例如,無嚴重、有限高)。
- 補救時間範圍: 為不同嚴重性等級的漏洞設定修補服務水平協議,例如:嚴重等級在 7 天內修補,高等級在 30 天內修補。
- 例外處理程序: 建立工作流程,以便在無法立即補救時接受風險。
- 豁免追蹤: 維護已接受風險和其業務理由的審計記錄。
合規政策:
- 授權允許清單: 指定一律可接受的授權 (MIT、Apache 2.0、BSD)。
- 授權拒絕清單: 禁止與商業模式不相容的特定許可證(專有軟體的 GPL)。
- 審批工作流程: 要求對具有特定授權 (LGPL、MPL、自訂授權) 的相依性進行法律審查。
- 歸屬要求: 定義如何在分散式軟體中提供授權歸屬。
自動化強制執行
管道整合:
- 自動掃描: 在每一個建置及提取要求上自動執行 SCA 檢查。
- 優質大門: 設定管線閘道,以封鎖違反原則的組建或部署。
- 自動化補救:使用 GitHub Dependabot 等工具自動建立安全性更新的提取要求。
- 報告: 產生合規性報告以實現審計和管理可見性。
持續改進
指標追蹤:
- 平均補救時間 (MTTR): 衡量發現漏洞後修補的速度。
- 漏洞減少:追蹤隨時間遞減的漏洞計數。
- 合規率: 監控符合授權原則的相依性百分比。
- 覆蓋範圍: 確保 SCA 工具掃描所有應用程式和相依關係。
工藝細化:
- 誤判為真管理:調整工具,以透過設定和例外狀況減少誤判為真。
- 開發者培訓: 教育開發人員安全依賴項選擇和管理。
- 政策演變: 根據新興威脅和業務需求更新原則。
- 工具評估: 定期評估新的 SCA 工具和功能。
軟體組合分析提供了管理嚴重依賴開源元件的現代應用程式中的安全性和合規性風險所必需的自動化功能。 下一個單元會探討如何實作 GitHub Dependabot,這是整合至 GitHub 的特定 SCA 工具。