vm2 Node.js Sandbox ライブラリの 11 件の脆弱性:任意のコード実行などの可能性

Critical vm2 Node.js Library Flaws Enable Arbitrary Code Execution Attacks

2026/05/07 gbhackers — vm2 に存在する、Critical なサンドボックス・エスケープの脆弱性群が公開された。Node.js で広く使用されるサンドボックス・ライブラリである、vm2 の脆弱性を悪用する攻撃者は、隔離された実行環境から脱出してホスト・システム上で任意のコマンド実行を可能にする。 数日前から、メンテナーである patriksimek が 11 件のアドバイザリを公開している。一連の脆弱性は、vm2 バージョン 3.11.0/3.11.1 で修正されている。ただし、バージョン 3.11.1 では、最新の 2 件の脆弱性に対するパッチが未提供である。 

信頼できない JavaScript コードをサンドボックス環境で実行する npm パッケージとして、vm2 はマルチ・テナント環境/プラグイン・システム/CI/CD ツールなどで広く利用されている。しかし、VM.run()/NodeVM.run() 内のコードは、ホスト・システムへアクセスできないという従来のセキュリティ前提は、今回の脆弱性群により完全に破綻した。 

その深刻さを裏付けるように、今回の 11 件の脆弱性は、CVSS v3.1 で Critical と評価されている。その中の、複数の脆弱性においては、完全なリモート・コード実行 (RCE) を実証する PoC エクスプロイトも公開されている。

vm2 Node.js ライブラリの欠陥

脆弱性の大半は vm2 内部の “Bridge” メカニズムの欠陥に起因するものである。この機構は、サンドボックスとホスト JavaScript コンテキストの間で受け渡される、オブジェクト参照を管理するものだ。 

lookupGetter/Buffer.apply/util.inspect/Promise species/SuppressedError/WebAssembly の try_table 命令などの、内部 JavaScript プリミティブを操作する攻撃者は、ホスト側オブジェクトへの参照を取得できる。

そのため、Function.prototype への参照が取得された場合には、サンドボックスではなくホスト・コンテキストで実行される、新たな関数の生成が可能になってしまう。 さらに、ホストの process オブジェクトが取得されると、child_process.execSync() などを自由に呼び出すことで任意のコマンド実行が引き起こされる。

CVEAdvisoryAffected VersionsPatched VersionReporter
CVE-2026-24118GHSA-grj5-jjm8-h35p≤ 3.10.43.11.0XmiliaH
CVE-2026-24120GHSA-qvjj-29qf-hp7p≤ 3.10.33.10.5XmiliaH
CVE-2026-24781GHSA-v37h-5mfm-c47c≤ 3.10.33.11.0XmiliaH
CVE-2026-26332GHSA-55hx-c926-fr95≤ 3.10.43.11.0
CVE-2026-26956GHSA-ffh4-j6h5-pg66≤ 3.10.43.10.50x5t
CVE-2026-43997GHSA-47×8-96vw-5wg6≤ 3.10.53.11.0c0rydoras
CVE-2026-43999GHSA-947f-4v7f-x2v8v3.10.53.11.0bugbunny-research
CVE-2026-44005GHSA-vwrp-x96c-mhwq3.9.6–3.10.53.11.0hongancalif
CVE-2026-44006GHSA-qcp4-v2jj-fjx8≤ 3.10.53.11.0c0rydoras
CVE-2026-44007GHSA-8hg8-63c5-gwmx≤ 3.11.03.11.1akshatgit
CVE-2026-44008GHSA-9qj6-qjgg-37qq≤ 3.11.1NoneXmiliaH
CVE-2026-44009GHSA-9vg3-4rfj-wgcm≤ 3.11.1NoneXmiliaH
注目すべき脆弱性

脆弱性 CVE-2026-26956 は、Node.js v25 環境の WebAssembly における JSTag 例外処理の悪用を許すものである。 具体的には、Symbol から文字列への変換時に TypeError を発生させる JavaScript 関数をインポートし、try_table 命令を介して V8 の C++ レイヤで例外を捕捉することが可能になる。それにより、サニタイズされていないホスト領域のエラー・オブジェクトが取得され、vm2 の JavaScript レイヤ保護機構が完全に回避される。 

脆弱性 CVE-2026-43999 は、NodeVM のビルトイン許可リストに存在するロジック不備であり、開発者が builtin: [‘*’, ‘-child_process’] を設定した場合であっても、module が暗黙的に含まれるという問題を引き起こす。Module._load() はホスト・コンテキストで動作するため、結果として child_process を含む任意モジュールがロード可能となり、許可リスト全体が無効化されてしまう。

さらに、脆弱性 CVE-2026-44007 は、”nesting: true” を使用する全アプリケーションに影響を及ぼす。”require: false” の設定であっても、サンドボックスに vm2 が注入されるため、サンドボックス化されたスクリプトから require(‘vm2’) を呼び出すことで完全な RCE が成立する。

その一方で、脆弱性 CVE-2026-44008/CVE-2026-44009 は、情報が公開された時点で未修正の状況にあり、3.11.1 を含む全バージョンに影響を及ぼす。そのため、vm2 を利用する組織は、これらの未修正の脆弱性に対処するパッチ提供状況を GitHub リポジトリで継続的に監視すべきである。それと並行して、3.11.1 への速やかなアップグレードも不可欠である。 

その一方で、外部入力に対して vm2 サンドボックスを公開しているアプリケーションについては、完全な修正が提供されるまで、深刻なリスクにさらされている状態として扱うべきである。

頻発するサンドボックス・エスケープの状況を踏まえ、セキュリティ・チームにとって必要なことは、isolated-vm や Deno の permission モデルなどの、より堅牢な代替手段への移行を検討することだ。