<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    構建模塊化調用圖以實現NodeJS應用的安全掃描

    VSole2022-06-29 06:39:48
    原文標題: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 上面的提升也能夠幫助我們更好的解決一些問題,整體方法具有極好的效果,但實驗個人認為還不夠豐富,并且其中一些小問題可能還需要繼續說明一些。

    函數調用node
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    由此可以推測,之前找到的main.node,可能就是解密模塊。此時找到了AES的算法常量,前兩個是重復的,可能是插件問題。只能去問度娘了,搜索一下AES加密解密原理與 C 實現代碼。
    高達40%的npm包依賴的代碼至少包含一個公開漏洞,因此如何解決 Node.js 應用的安全性檢測是一個十分重要的問題。
    NPM上發布了170多萬個Node.js庫,以促進軟件開發。正如對比安全所揭示的,第三方庫出現在當今軟件的大多數(79%)中。然而,任何事物都有兩面性。雖然使用庫可以減少開發成本和時間,但這些集成庫在實踐中對軟件生態系統構成了新的安全威脅,這些庫中的漏洞可能會使依賴它們的軟件不斷面臨安全風險。之前的工作已經調查了整個NPM生態系統的脆弱性影響,而他們的方法要么只是靜態地考慮直接依賴性,或者基于依賴
    漏洞信息CVE-2021-26411 該漏洞存在于iexplore.exe mshtml.dll模塊,在JS9引擎處理dom對象時,由于未對nodevalue對象的有效性做判斷,所導致的UAF漏洞,該漏洞可實現RCE。
    最近遇到webpack類型的網站越來越多,所以在B站學習了一下,今天來實戰一波。
    target_func: sark.Function 類型,表示要查找交叉引用關系的目標函數對象。max_depth: int 類型,表示查找引用關系的最大深度。② 然后根據 include_data_xref 的設置,獲取該函數中所有的引用 refes。③ 遍歷函數的所有引用 ref,如果該引用 ref 指向目標函數,則在有向圖 G 中通過 add_edge 函數添加一條從當前函數到目標函數的邊,并返回 True。④ 如果引用指向另一個函數,則遞歸調用 find_cross_refs 函數查找兩個函數之間的交叉引用關系。⑤ 如果所有引用遍歷完,仍然沒有找到交叉引用,則返回 False。
    本篇針對該JS中的字符串混淆進行還原。字符串是如何混淆的解密方式想要對字符串反混淆就要先分析該樣本是如何對字符串進行混淆的。而處于全局作用域的_0x1f1a68實際上也是對另一個函數的調用。
    目前的檢測器以JavaScript為唯一的目標語言,然而忽略了WebAssembly可能帶來的攻擊。論文提出了第一個通過將計算的部分移動到WebAssembly中來逃避靜態JavaScript惡意軟件檢測的技術。技術的核心是將JavaScript中實現惡意行為的片段翻譯為WebAssembly。通過實驗評估,該方法可以有效逃逸最先進的基于學習的靜態惡意軟件檢測。
    字符串是 JavaScript 中的重要數據類型
    企業安全規劃建設過程中,往往會涉及到開發的代碼安全,而更多可以實現落地的是源代碼安全審計中,使用自動化工具代替人工漏洞挖掘,并且可以交付給研發人員直接進行安全自查,同時也更符合SDL的原則,此外可以顯著提高審計工作的效率。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类