觀點 · 資訊分享

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 題常見問題
標籤
#vm2#Node.js#沙盒逃逸#CVE-2026-47131#npm
vm2 一天公開 5 個沙盒逃逸漏洞,GitHub 多給 CVSS 10:用它跑外來程式碼的專案要升到 3.11.4

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

vm2 沙盒逃逸漏洞,升到 3.11.4資訊圖卡:用 vm2 跑不信任的程式碼,沙盒可被突破、在主機執行指令

先用白話講:沙盒是什麼?

想像你要請陌生人來家裡幫忙做事,但不想讓他碰到你的保險箱,所以把他關在一個透明玻璃房裡,只能用房裡的工具。這個玻璃房就是沙盒(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 分為最高。
  • 間接依賴:你沒直接安裝,但被你用的套件拉進來的套件。

資料來源

常見問題

vm2 是什麼?
一個 Node.js 套件,讓你在隔離的環境(沙盒)裡執行不可信的 JavaScript,常被用在外掛系統、線上程式碼執行等場景。
沙盒逃逸是什麼意思?
本來被關在沙盒裡的程式碼,找到辦法跑到沙盒外,取得主機上的權限,通常就能執行任意系統指令。
我該怎麼處理?
用 npm ls vm2 檢查專案(含間接依賴)有沒有用到;有的話升到 3.11.4 以上。如果你的服務真的要執行外來的程式碼,也建議再加一層更強的隔離,例如獨立程序、容器或專用的執行環境。
LINE