構建模塊化調用圖以實現NodeJS應用的安全掃描
原文標題:Modular Call Graph Construction for Security Scanning of Node.js Applications
原文作者:Benjamin Barslev Nielsen, Martin Toldam Torp, Anders M?ller
原文鏈接:https://cs.au.dk/~amoeller/papers/jam/paper.pdf
原文來源:ISSTA'21
筆記作者:NING@SecQuan
筆記小編:cherry@SecQuan
1 背景介紹
現如今大多數的 Node.js 應用都會采用大量的第三方庫來幫助實現其功能,據調查顯示,一個典型的 Node.js 應用 90% 的代碼都來自第三方庫。而這些第三方庫的來源是當下最大的軟件庫 NPM ,其擁有超過 100 萬個 JavaScript 包,但不幸的是在這些包直接存在著嚴重的依賴關系,高達 40% 的 npm 包依賴的代碼至少包含一個公開漏洞,因此如何解決 Node.js 應用的安全性檢測是一個十分重要的問題。
我們期望的安全檢測是當程序依賴于包含已知安全漏洞的庫時能夠給出警告。當下安全檢測工具主要有 Dependabot, npm audit, Snyk 等,但這些工具有一個共同的特性,就是只從 package.json 中尋找包依賴,不看程序源代碼,無法判斷程序是否真的使用了庫中有漏洞的部分,導致出現很多 false-positive(假陽性),因此本文的作者便提出了構建調用圖的方法來做更加準確的安全檢測。
2 論文主要貢獻
作者該篇文章主要做出了以下貢獻:
- 提出了一種分析工具 JAM ,可以有效地將 JavaScript 項目構建相應的模塊化調用圖
- 提出了一種概念驗證的工具,能夠根據調用圖進行安全掃描
- 對比 npm audit ,在 12 個 Node.js 應用的掃描當中,該工具能夠減少 81% 的假陽性,并且在重用調用圖的基礎上,分析時間也大大減小
- 對比當前 SOTA 模型 js-callgraph ,該方法在精度、準度和分析時間都有很大提升
3 動機及挑戰
針對一個 npm 應用 writex 1.0.4,作者首先使用 npm audit 工具進行了安全掃描并獲取了 5 個不同的安全建議,但是在作者手動進行源碼驗證時,發現其中只有一個安全建議是有效的,因此發現該工具存在極大的假陽性。而之所以會存在上述情況,以下述代碼為例:

圖3-1 示例代碼
該代碼片段首先 lib.js 模塊執行了一個 filter 函數,而該函數以 iteratee 函數作為參數,并返回另一個函數。這個函數通過接收 arr 作為參數,并遍歷其中元素分別傳遞給 iteratee 函數,最終返回一個經過 iteratee 函數處理過的數組。
通過該片段可以發現,JS 代碼極為靈活,存在著多種的調用方式,因此直接靜態分析是比較困難的,主要概括為:
- 模塊公共接口是通過 module.exports 對象來寫入屬性,以完成動態構造
- 存在高階函數的使用,即函數作為參數或者返回值
- 構造函數的直接使用
4 方法
整個方法共分為三個階段。這里可能不能很好的講解清楚,具體可以詳細看一下論文。這里一些專有名詞的翻譯如下:
- module summary:模塊概要
- call edges:調用邊
- VersionRange:版本范圍
- Scanner:掃描器
- API-pattern:API 模式
- Access Path:可達路徑
4.1 模塊概要構建
1.構建概要
為每個模塊(file f)構造一個概要 ,而不考慮模塊之間的調用關系, 包含:

其中:Loc = ,Prop:屬性名,Var:變量名/參數,Exp:表達式

圖4-1 AccessPath
2.表達式分析
對文件中每個表達式進行如下操作:別名分析、可達路徑分析、概要構建。
4.2 調用圖構建
1. 合并概要
合并 Node.js 應用所有模塊的模塊概要,例如:
2. 調用圖定義
其中 V:各函數定義的Loc,E:調用邊, :標注函數調用的訪問路徑,用于解析對高階函數的參數調用等。
3. 調用圖生成
提出一些約束規則,通過迭代地求解規則生成的約束來求解調用圖。
4.3 安全檢測
1. 建立 npm 漏洞庫中已知安全漏洞的模式

圖4- API模式
2. 如果待分析應用依賴于版本范圍內某個包

圖4- findNodes算法
findNodes:根據 API 模式和模塊概要查找存在漏洞的函數在 f 中的位置。
3. 掃描器從入口點檢查這些函數是否在應用程序的調用圖中可達
如果可達,系統給出警告信息和調用路徑。
5 評估實驗及分析
實驗選擇了 12 個 Node.js 應用,這些應用使用 npm audit 工具檢測往往存在 1 個及以上的警告,下面通過回答三個問題來證實其工具的有效性。
RQ1: 與安全檢測工具 npm audit 對比怎么樣呢?

圖5-1 安全檢測結果對比
- precision: 從 24% 提升到 61%
- recall: 實現 100%
- FP: 下降了 81%
RQ2&RQ3: 與調用圖構建工具 js-callgraph 對比怎么樣呢?

圖5-2 調用圖構建結果對比
這里的 precision 指的是只有唯一被調用者的調用點所占的百分比。
- precision: 從 58.64% 提升到 84.35%
- recall: 從 48.16% 提升到 98.62%
- analysis time:大幅縮減至 0.1 秒級
6 總結與展望
作者針對其方法所帶來的貢獻進行了簡要概括但未提及相關的不足,而針對未來針對調用圖可能的研究目標包括:
- 代碼變化的影響分析
- IDE工具中的代碼導航和重構
個人認為從實驗數據來看,本文所使用的圖構建方法相比現有技術有著很大的提升,在召回率、精度、時間方法都取得了巨大的進步,是值得我們學習思考的;此外在 FP 上面的提升也能夠幫助我們更好的解決一些問題,整體方法具有極好的效果,但實驗個人認為還不夠豐富,并且其中一些小問題可能還需要繼續說明一些。