Node.js沙箱函式庫isolated-vm被 揭露 重大沙箱逃逸漏洞GHSA-864f-rcv7-6rh4,攻擊者可利用型別混淆問題,讓原本受隔離的JavaScript程式碼突破沙箱,進而影響執行沙箱的宿主行程(Host Process)。研究團隊不只讓宿主行程當機,也進一步做到控制流程劫持,也就是讓程式跳到指定位置執行函式。isolated-vm已在7.0.1與6.2.0修補漏洞。
isolated-vm用來安全執行不受信任的JavaScript,會替沙箱建立獨立的V8隔離環境,讓沙箱擁有自己的記憶體空間,不能直接存取宿主物件。此次漏洞並非V8隔離機制本身遭突破,而是發生在isolated-vm負責跨越隔離邊界傳送資料的C++介接程式碼。
沙箱逃逸漏洞出現在isolated-vm把資料從沙箱傳給宿主時的處理機制,當程式要直接轉移ArrayBuffer資料時,會透過ExternalCopy的transferList指定要傳送的內容。問題在於程式會讀取transferList清單兩次,第一次確認項目是否為ArrayBuffer,第二次實際使用時卻沒有重新檢查型別,而是直接當成ArrayBuffer處理。
攻擊者可設定JavaScript取值函式,讓同一個項目第一次讀取時回傳合法的ArrayBuffer,通過檢查後,第二次再換成其他內容。isolated-vm因此可能把錯誤資料當成ArrayBuffer使用,進而存取攻擊者可影響的記憶體位址,造成宿主行程當機或進一步改變程式執行方向。
研究團隊在概念驗證中,先讓宿主行程發生可控制位址的記憶體錯誤,再從緩衝區操作取得宿主位址資訊,建立假的記憶體控制結構,最後讓宿主行程跳轉至指定位置呼叫函式。完整攻擊程式並未公開。
isolated-vm每週下載量超過100萬次,也被用於自動化與AI代理執行程式碼的場景,包括Activepieces與Mastra,n8n也建議在隔離執行程式碼時採用isolated-vm。不過實際是否能利用漏洞,仍取決於宿主是否曾把Reference傳入沙箱,或是否會把攻擊者可控制的陣列交給transferList處理。
修補版本會在ExternalCopy複製資料期間禁止執行JavaScript,避免取值函式等機制在前後兩次讀取之間改變資料內容。使用7.x版本者應升級至7.0.1,6.x版本則應升級至6.2.0。