概要
JavaScriptサンドボックスライブラリである「vm2」(バージョン3.10.0以下)に、攻撃者がサンドボックスの保護を回避し、任意のコードをシステム権限で実行できる重大な脆弱性が発見されました。この欠陥はPromiseコールバック関数の不適切なサニタイズを悪用するもので、認証やユーザーインタラクションなしにリモートコード実行が可能になります。
脆弱性の詳細
npmの273,000以上のプロジェクトで利用されているvm2ライブラリは、信頼できないコードを隔離された環境で安全に実行するために設計されています。しかし、研究者patrik-simek氏によって特定されたこの脆弱性は、Promiseベースのサンドボックスエスケープ手法によって、その中核的なセキュリティ保証を根本から揺るがします。
- CVE ID: CVE-2026-22709
- アドバイザリ: GHSA-99p7-6v5w-7xg8
- パッケージ: vm2 (npm)
- 影響を受けるバージョン: ≤ 3.10.0
- パッチ適用済みバージョン: 3.10.2
- タイプ: サンドボックスエスケープ
- CVSSスコア: 9.8 / 10(重大)
攻撃手法
攻撃者は、非同期関数の戻り値を利用して、サニタイズされていないPromise.prototype.thenコールバックにアクセスします。これにより、lib/setup-sandbox.jsで実装されている意図されたサニタイズ層がバイパスされます。
この脆弱性は、Promiseの実装間でのコールバックサニタイズの一貫性の欠如に起因します。localPromise.prototype.thenコールバックは適切なサニタイズチェックを受けるのに対し、非同期関数によって返されるglobalPromiseオブジェクトは、これらの保護を完全に回避します。
攻撃者は、非同期関数の実行をトリガーする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/
