通過NPM生態系統中的依賴樹揭開脆弱性傳播及其演化的神秘面紗
1. 背景介紹
NPM上發布了170多萬個Node.js庫,以促進軟件開發。正如對比安全所揭示的,第三方庫出現在當今軟件的大多數(79%)中。然而,任何事物都有兩面性。雖然使用庫可以減少開發成本和時間,但這些集成庫在實踐中對軟件生態系統構成了新的安全威脅,這些庫中的漏洞可能會使依賴它們的軟件不斷面臨安全風險。之前的工作已經調查了整個NPM生態系統的脆弱性影響,而他們的方法要么只是靜態地考慮直接依賴性,或者基于依賴關系進行間接依賴的可達性分析,這可能會引入不準確的傳遞依賴關系,從而導致誤報漏洞警告。現存的研究方法還沒有提供一個精確的依賴關系。尤其是軟件依賴關系之間的內部復雜關系,在很大程度上削弱了其分析的影響,并限制了進一步的解決方案(即精確修復)的提出。盡管一些現有的SCA工具(如Snyk和Blackduck)支持對用戶項目進行NPM依賴性分析,但大多數工具都是從實際安裝中檢索依賴樹,而不是從靜態推理中檢索依賴樹。此外,由于語義版本控制的靈活性,依賴關系以及依賴關系中的漏洞實際上會隨著時間的推移而發生動態變化。因此,盡管現有工作也調查了漏洞的影響,在沒有靜態和精確的依賴關系解決方案的情況下,大規模分析依賴關系中存在的漏洞傳播的演變仍然是一個挑戰,更不用說在防止漏洞動態引入依賴項方面獲得實用的解決方案。
2. 論文主要成果
- 實現了一個依賴約束解析器來解決NPM依賴約束的多樣性,并在此基礎上構建了一個完整的依賴漏洞知識圖(DVGraph),以捕獲所有NPM包(超過114萬個庫和1094萬個版本)之間的依賴關系,以及來自NVD的800多個已知CVE(常見漏洞和暴露),進一步的支持對漏洞傳播的分析
- 提出了一種基于DVGraph的新算法(DTResolver),可以靜態、精確地解析任意安裝時間的依賴樹,精度高達90%以上,并通過大約100k個代表性軟件包進行了驗證
- 進一步對依賴樹中的脆弱性傳播進行了實證研究。首先,我們研究了NPM依賴解析帶來的依賴樹的特征,在此基礎上,我們分析了依賴樹中漏洞傳播的影響和特征,特別是傳遞依賴的漏洞。此外,我們還將研究擴展到時間維度,以研究依賴樹中漏洞傳播隨時間的演變,揭示依賴樹中引入漏洞的原因,以及可能的解決方案
3. 實驗架構
包括依賴漏洞知識圖構建、依賴樹解析、漏洞路徑識別及其驗證、大規模實證研究以及對經驗教訓和解決方案的討論,以及可能的研究方向
Overview of our work
4. DVGraph的構建
為了支持高精度和高效率的大規模依賴漏洞分析,我們設計并實現了一套數據處理平臺,以構建和維護完整而精確的依賴漏洞圖DVGraph(基于neo4j)。
下圖為改數據處理平臺的框架:
Metadata Pipeline:將數據保存在元數據庫中
CVE Pipeline:從NVD數據集收集CVE數據
CVE Triage Pipeline:手工標記CVE數據的對應的受影響的庫和版本
Graph Pipeline:解析新來的元數據和映射的CVE數據,計算要在DVGraph上執行的操作(即添加、更改和刪除節點和邊),并最終執行這些操作
5. 依賴樹解析和脆弱路徑識別
5.1 依賴樹解析
目前還沒有一個考慮到特定于平臺的依賴關系解決規則,可能導致不準確的依賴關系解析。本文目標是實現靜態解析與NPM在實際安裝過程中動態解析和安裝的依賴樹一致的依賴樹,以便我們能夠準確有效地識別依賴樹中的漏洞和脆弱路徑,而無需實際安裝。
為了提高精度,同時保持效率,我們提出了一種基于DVGraph的依賴解析算法(DTResolver),可以在不安裝的情況下,對任意數據軟件包依賴解析的過程中,識別并找出所有依賴中含有安全漏洞的組件及相應的依賴引入路徑
Dependency Tree Resolution
此外由于NPM中廣泛使用依賴約束條件(版本范圍)而不是固定版本進行依賴定義,導致依賴安裝結果隨著時間可能發生變化
如下圖中,在B@1.0.1發布后,A@1.0.0的安裝過程中,對B的依賴將解析成新發布的版本而不是原有的B@1.0.0, 圖中C@1.0.1的發布亦是如此。因此我們在DTResolver的基礎上進一步增加了時間約束,使其能夠支持在給定項目從其發布前到DVGraph更新時間內任意時刻的依賴樹模擬解析。
An example of vulnerability propagation evolution via dependency tree changes
5.2 脆弱路徑識別
給出了脆弱點和路徑的示例 通過反向深度優先搜索(DFS)實現了一個脆弱路徑提取器,以徹底查找依賴樹中從脆弱點到根節點的依賴關系
6. 大規模實證研究
以下兩個方面分析NPM中安全漏洞的影響:
- 漏洞如何影響NPM生態系統?漏洞如何通過依賴關系樹傳播影響根包(root packages)?
- 漏洞傳播如何在依賴樹中發展?依賴關系樹的變化如何影響漏洞傳播的演變?
6.1 通過依賴樹傳播漏洞
- 據統計證明,漏洞廣泛存在于NPM包的依賴關系中(整個生態系統中有19.96%的庫的四分之一版本)
- 第三方庫的最新版本(16.17%)仍然存在通過依賴關系受到漏洞影響的潛在風險。
- 其他用戶使用的易受攻擊的庫中,有相當一部分(超過100個)仍然有易受攻擊的最新版本
- 一些有影響力的已知CVE廣泛存在于大部分包的依賴樹中
- 包通常受到多個漏洞的影響,每個漏洞通過多個漏洞路徑影響根包(平均一個漏洞引入8個漏洞路徑)
- 漏洞仍然廣泛存在于受影響庫版本的直接依賴關系中(超過30%),即使是最新版本
- 在易受攻擊的路徑上也存在中心性,即大多數易受攻擊的路徑都會通過有限的直接依賴關系,這可以用來切斷易受攻擊的路徑
6.2 依賴樹中的漏洞傳播演化
- 隨著時間的推移,已知的漏洞正在對NPM生態系統造成更大的影響。它們不僅影響到更多的庫版本,而且還影響到依賴樹中更脆弱的點
- 大多數CVE(93%)在被發現之前已經被引入依賴樹,這些CVE的固定版本(87%)也大多在CVE發布之前發布
- 依賴樹中只有60%的CVE被DTC自動刪除,即使如此,每個CVE刪除仍需要一年以上的時間
- 過時的維護(提供者)和不合適的依賴約束(使用者)是阻礙依賴樹中漏洞自動移除的主要原因。應該采取更多的對策和解決方案來避免、監控甚至糾正這些不良做法
有限性
首先,依賴關系中的漏洞可能永遠不會影響根包,因為可能永遠無法訪問這些易受攻擊的功能。這只能通過基于依賴樹和調用圖分析易受攻擊的函數調用路徑來進一步解決。我們將此作為我們未來的工作。其次,CVE和庫版本的映射是手動標記的,這可能會導致數據錯誤標記,合作的作者已將數據與現有CVE交叉驗證,以緩解此類威脅。第三,我們無法區分包含缺失依賴項的安裝,這可能會使基本事實不準確,我們只接受依賴項中成功安裝的包作為驗證中的基本事實。第四,由于計算成本過高,在分析漏洞傳播時,我們忽略了具有超過1k條漏洞路徑的版本。總的來說,這樣的版本只占2.01%,這只能對我們的結果造成有限的偏差。