Node.js

isolated-vm 嚴重漏洞分析:JavaScript 沙箱逃逸與主機遠端程式碼執行風險

作者

此內容精準地剖析了安全防禦中「膠水代碼」的脆弱性,將底層引擎的強固與介面層的缺陷做對比,具備極高的技術警示價值。然而,由於缺乏具體的 Exploit 代碼演示(基於安全考量),對於追求實作驗證的開發者而言,其分析僅止於理論路徑,缺乏可量化的風險驗證基準。

isolated-vm 嚴重漏洞分析:JavaScript 沙箱逃逸與主機遠端程式碼執行風險

在現代的 Node.js 應用開發中,執行來自外部或不可信的 JavaScript 程式碼是一項高風險操作。為了在不危及主系統安全的前提下運行這些程式碼,開發者通常會使用沙箱技術。isolated-vm 便是其中一個廣泛採用的開源函式庫,它允許開發者在獨立的 V8 Isolate 中運行 JavaScript。所謂的 V8 Isolate,是指 Google V8 引擎的一個獨立實例,每個 Isolate 擁有自己的堆疊記憶體(Heap)和狀態,彼此之間完全隔離,不會共享數據,也不會互相干擾。這種機制確保了即使沙箱內的程式碼崩潰或嘗試惡意操作,也不會直接影響到主程式的運行。

然而,根據 The Hacker News 報導,安全研究機構 Endor Labs 最近在 isolated-vm 中發現了一個嚴重的安全漏洞(編號 GHSA-864f-rcv7-6rh4)。該漏洞影響了 7.0.0 及其之前的所有版本,可能導致受限的 JavaScript 程式碼突破沙箱邊界,直接對主機進程造成記憶體損壞,甚至達成遠端程式碼執行(Remote Code Execution, RCE),讓攻擊者完全掌控運行該函式庫的伺服器。

漏洞的核心原因在於資料傳輸的邊界處理。由於 V8 Isolate 之間是完全隔離的,主 Node.js 執行緒無法直接將 JavaScript 物件傳遞給工作 Isolate。為了實現受控的數據交換,isolated-vm 提供了一個名為 ExternalCopy 的類別,其作用是在主機 Isolate 與客體 Isolate 之間對 JavaScript 物件進行序列化(Serialization,將物件轉為可傳輸格式)與反序列化(Deserialization,將格式還原為物件)。

研究人員 Cristian-Alexandru Staicu 發現,ExternalCopy 在處理 transferList 選項時存在類型混淆(Type Confusion)問題。類型混淆是指程式將一種類型的數據誤認為另一種類型來處理,這會導致記憶體讀寫位置偏移。攻擊者只要擁有一個 ivm.Reference(這是主機授予沙箱獲取能力的最標準方式),就能利用此缺陷觸發記憶體損壞。在最簡單的情況下,這會導致主機進程發生段錯誤(Segmentation Fault, SIGSEGV)而崩潰,造成阻斷服務(DoS);但在更複雜的攻擊路徑中,攻擊者可以藉此劫持主機的控制流(Control Flow Hijack),從而實現從客體沙箱到主機環境的完全逃逸。

這起漏洞揭示了一個關鍵的技術教訓:安全邊界往往不是崩潰在最強大的防禦原語上,而是崩潰在連接這些原語的膠水代碼中。在這次事件中,V8 引擎本身的 Isolate 隔離機制依然穩固,並沒有被突破。真正失效的是用 C++ 編寫的綁定層(Binding Layer),也就是負責在 V8 邊界之間搬運數值的封裝代碼。這說明即使底層的安全基石足夠強大,如果負責數據交換的介面存在邏輯缺陷,整個安全體系依然會被瓦解。

目前,isolated-vm 的維護者已在 6.2.0 和 7.0.1 版本中修復了此漏洞。對於所有在生產環境或開發環境中使用該函式庫的開發者,應立即更新至最新版本。由於該漏洞的影響力極大,詳細的漏洞利用路徑(Exploit)已被暫時保密,以防止惡意行為者在用戶更新前利用此漏洞發動攻擊。對於依賴沙箱機制來處理不可信輸入的系統而言,這次事件提醒開發者,任何跨越信任邊界的數據交換過程都是潛在的攻擊面,必須經過極其嚴格的類型檢查與記憶體管理。

本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。