vm2 JavaScriptサンドボックスライブラリ(バージョン≤ 3.10.0)の重大な脆弱性により、攻撃者はサンドボックス保護を回避し、完全なシステム権限で 任意のコード を実行できます。
この欠陥はPromiseコールバック関数の不適切なサニタイズを悪用し、認証やユーザー操作なしにリモートコード実行を可能にします。
脆弱性の概要
npm上で273,000のプロジェクトに導入されているvm2ライブラリは、隔離された環境で信頼できないコードを安全に実行するよう設計されています。
しかし、研究者 patriksimek により特定されたこの欠陥は、Promiseベースのサンドボックス脱出手法によって、この中核となるセキュリティ保証を損ないます。
| 項目 | 値 |
|---|---|
| CVE ID | CVE-2026-22709 |
| アドバイザリ | GHSA-99p7-6v5w-7xg8 |
| パッケージ | vm2(npm) |
| 影響を受けるバージョン | ≤ 3.10.0 |
| 修正済みバージョン | 3.10.2 |
| 種類 | サンドボックス脱出 |
| CVSSスコア | 9.8 / 10 |
攻撃者はasync関数の戻り値を利用して、サニタイズされていないPromise.prototype.thenコールバックにアクセスし、lib/setup-sandbox.jsで実装された意図されたサニタイズ層を回避できます。
この脆弱性は、Promise実装間でコールバックのサニタイズが一貫していないことに起因します。
localPromise.prototype.thenのコールバックは適切なサニタイズチェックを受ける一方、async関数から返されるglobalPromiseオブジェクトはこれらの保護を完全に回避します。
攻撃者はこの不整合を悪用し、async関数の実行をトリガーするSymbolプロパティを持つエラーオブジェクトを構築して、サニタイズされていないglobalPromise.prototype.thenメソッドを露出させます。
この回避が成功すると、攻撃者はErrorコンストラクタのFunctionプロトタイプへ直接アクセスできるようになり、任意コード実行のインスタンス化が可能になります。
これにより、child_processモジュールの呼び出し、または制限なしの直接的なシステムコマンド実行を通じて、リモートコード実行が可能になります。
重大度が極めて高いのは、システム全体が侵害されるリスクを反映しています。vm2を用いて信頼できないコードを実行するアプリケーション(プラグインシステム、テンプレートサンドボックス、セキュリティ分析プラットフォームなど)は、直ちに悪用されるリスクに直面します。
この攻撃は認証、ユーザー操作、特権昇格を必要としないため、大規模に武器化するのが容易です。
組織は直ちにvm2をバージョン3.10.2以降へ更新する必要があります。パッチによりglobalPromise.prototype.thenのコールバックが適切にサニタイズされ、悪用チェーンが遮断されます。この脆弱性を軽減する回避策はなく、安全な運用のためにはパッチ適用が必須です。
翻訳元: https://gbhackers.com/critical-vm2-flaw-arbitrary-code-in-node-js/