濫用隱藏屬性來攻擊 Node.js 生態系統
1 背景介紹
現如今,由于跨平臺特性和高性能的JavaScript執行等特點,Node.js被廣泛的應用在服務端和桌面應用程序當中。而在過去幾年當中,用的更多的動態腳本語言(PHP、Ruby等)已經被發現在共享對象時是不安全的,然而Node.js并未很好的規避該安全風險。
作者首次引入了對象共享與客戶端服務器通信之間的問題。同時作者確認 CWE-915 也同樣存在于 JavaScript 與 Node.js 中。為了證明該安全問題,作者引入了一種先進的攻擊手段:HPA 攻擊,并在進一步的研究中發現這種攻擊與現有的 PHP 和 Ruby 中的攻擊并不相同。
圖1-1 HPA 攻擊示例
2 論文主要貢獻
作者該篇文章主要做出了以下貢獻:
- 提出 hidden property abusing 攻擊形式,并且證明其具有安全威脅
- 設計了一個自動化 HPA 漏洞檢測與利用代碼編寫工具——LYNX
- 評估并證明了真實場景下的 HPA 問題會導致嚴重安全影響
3 隱藏屬性濫用
圖3-1 攻擊路徑圖
上圖介紹了一個遠程攻擊者是如何利用 HPA 完成了攻擊。
圖3-2 攻擊對比
上圖對比了兩種攻擊異同。
4 LYNX 設計
圖4-1 LYNX 總覽
輸入: Node.js 程序
輸出: Exploit 文件
識別隱藏屬性: 發現屬性攜帶者 --> 定位候選隱藏屬性 --> 候選剪枝
生成 HPA 利用代碼: 生成利用代碼模板 --> 探索攻擊結果
4.1 識別隱藏屬性
作者依賴于一個發現:有文檔的參數通常會被一個調度器(例如 if-else 語句)一同處理。
未使用的參數與使用的參數被同一調度器處理:從 API 參數中記錄使用的屬性,然后找出與使用的屬性位于同一調度器中的隱藏屬性候選對象。未使用的參數與使用的參數被不同調度器處理:檢查所有的對象并查看是否有被同一調度器處理,如果存在則從結果中移除。
圖4-2 完整示例
4.2 生成 HPA 利用代碼
漏洞利用模版生成
本文直接利用原始對象作為模版,并在對象中插入屬性。
探索攻擊路徑
作者總結了以下 6 種敏感函數觸發點(Sink):
- 敏感數據庫查詢方法
- 敏感文件系統操作方法
- 代碼執行接口
- 模塊引用結果
- 全局方法或變量
- 循環條件
圖4-3 LYNX 敏感觸發點
5 評估實驗及分析
5.1 識別階段
實現在四種更可能接收到輸入的程序類別上完成了實驗,共收集了 102 個 Node.js 程序,其中 91 個是 Node.js 模塊,11 個為 web 程序。實驗效果如下:
圖5-1 識別實驗效果
- #PC:屬性攜帶者( property carriers )的數目
- #HP:候選隱藏屬性( hidden property candidates )的數目
- #DA:有文檔的參數( detected documented arguments )的數目
5.2 利用攻擊階段
圖5-2 利用實驗效果
- Reported:LYNX 認為是脆弱的敏感點
- Exploitable:LYNX 利用并且被手工確認的敏感點
- Missed:LYNX 第一階段檢測出但第二階段未被利用的隱藏屬性
5.3 HPA脆弱性影響分析
圖5-3 脆弱性檢測效果
上圖展現了真實場景下的 HPA 攻擊,分別破壞了 Node.js 生態系統的保密性( Confidentiality )、完整性( Integrity )、可用性( Availability )。
6 總結與展望
盡管 LYNX 取得了不錯的成績,但是還面臨以下局限性。
- LYNX 需要外界輸入(例如模塊測試用例和用戶交互等)
- 同其他動態分析工具相同,存在漏報
- 并沒有涵蓋Node.js生態系統中存在的所有輸入通道