觀點 · 資訊分享
vm2 一天公開 5 個沙盒逃逸漏洞,GitHub 多給 CVSS 10:用它跑外來程式碼的專案要升到 3.11.4
Node.js 沙盒套件 vm2 在 5 月 29 日公開至少 5 個沙盒逃逸漏洞(CVE-2026-47131、47137、47140、47208、47210),GitHub 公告評級為 Critical,都在 3.11.4 修正。
- 發布
- 2026-05-30
- 篇幅
- 約 4 分鐘 · 1,783 字
- 結構
- 7 節 + 3 題常見問題
- 標籤

一句話看懂:Node.js 的沙盒套件 vm2 在 5 月 29 日一口氣公開 5 個沙盒逃逸漏洞,GitHub 評為 Critical,全部在 3.11.4 修正。

先用白話講:沙盒是什麼?
想像你要請陌生人來家裡幫忙做事,但不想讓他碰到你的保險箱,所以把他關在一個透明玻璃房裡,只能用房裡的工具。這個玻璃房就是沙盒(Sandbox)。
沙盒逃逸就是這個陌生人發現玻璃有縫,鑽了出來,直接走到你家客廳。對程式來說,就是外來程式碼跳出隔離環境,在主機上執行任意指令。
發生什麼事
vm2 是一個 Node.js 套件,用來在沙盒裡執行不可信的 JavaScript。GitHub 的安全公告在 5 月 29 日(UTC)連續公開了至少 5 個沙盒逃逸漏洞,全部評級 Critical:
| CVE | GitHub 評分 | 簡述 |
|---|---|---|
| CVE-2026-47131 | 10 | 一般沙盒逃逸,可執行任意程式碼 |
| CVE-2026-47208 | 10 | 透過 Promise 的 species 機制逃逸 |
| CVE-2026-47137 | 10 | 繞過 CVE-2023-37903 的舊修補,漏洞在設定省略 require 時發生 |
| CVE-2026-47210 | 9.8 | 透過 WebAssembly JSPI 相關 Promise 逃逸 |
| CVE-2026-47140 | 10 | NodeVM 的內建模組黑名單漏了 process 等項目 |
公告列出的受影響版本都是 3.11.3 以前(含),修正版本都是 3.11.4。
為什麼一次這麼多個?
公告沒有說明為什麼會集中公開。從內容看,這些洞各有不同成因:有的是 Promise 處理的邊角情況,有的是設定檢查寫得不夠嚴謹(用 === false 判斷,但沒傳設定時值是 undefined),有的是黑名單漏列。這也呼應了一個老問題:沙盒是用「列舉要擋的東西」來防守,漏一個就破功。
給開發者的技術細節
- 檢查:
npm ls vm2可以看專案與間接依賴有沒有用到 - 升級:升到
[email protected]以上;間接依賴要等上游更新,或用overrides(npm)、resolutions(yarn)、pnpm.overrides強制指定 - 如果執行外來程式碼是服務的核心功能,除了升級,建議再加上作業系統層級的隔離,例如獨立低權限程序、容器、專用的執行環境,並限制網路與檔案存取
- 官方公告含有重現程式碼,本文刻意不收錄
我的看法
接案時常遇到客戶想做「讓使用者自己寫一小段規則或公式」的功能,第一個念頭往往就是找個沙盒套件包起來。這次事件提醒我,沙盒套件不是萬靈丹:它的防線是在語言層級自己畫的,只要有一個邊角漏掉,就會被突破。
實務上我會先問:這段外來程式碼真的需要完整的 JavaScript 嗎?如果只是算公式,用受限的運算式解析器會比開沙盒安全得多。真的要跑程式碼,也要假設沙盒遲早會被突破,所以外面再包一層程序或容器隔離。
名詞小辭典
- 沙盒(Sandbox):把程式關在受限的環境裡執行,限制它能碰的資源。
- RCE(遠端程式碼執行):攻擊者讓目標機器執行自己指定的程式碼。
- CVSS:漏洞嚴重度評分,0 到 10 分,10 分為最高。
- 間接依賴:你沒直接安裝,但被你用的套件拉進來的套件。