[緊急警告] vm2のサンドボックスを破る致命的な脆弱性 (GHSA-5h3f-q97h-ccvc)について
はじめに
Node.jsのアプリケーションで、安全に信頼できないコードを実行するためのサンドボックスライブラリとして広く利用されている「vm2」において、重大な脆弱性(GHSA-5h3f-q97h-ccvc / CVE-2026-100721)が報告されました。この脆弱性は「Critical」と評価されており、サンドボックス化された環境をバイパスして、ホストOS上で任意のコードが実行される可能性を秘めています。
本記事では、日本のフロントエンドエンジニアの皆様に向けて、この脆弱性の技術的な詳細、影響、そして推奨される対策について解説します。
vm2とは?なぜフロントエンドエンジニアに関係するのか?
vm2は、Node.jsのV8仮想マシン上で動作する強力なサンドボックスライブラリです。外部からの入力やプラグインなど、信頼できないJavaScriptコードを、システムリソースや他のコードから隔離された安全な環境で実行するために利用されます。
フロントエンドエンジニアの皆様は直接vm2を使用する機会は少ないかもしれませんが、以下のシナリオで間接的に影響を受ける可能性があります。
<ul><li><strong>Node.jsベースのバックエンドAPI/BFF:</strong> サーバーサイドレンダリング(SSR)やAPIゲートウェイなどで、ユーザー提供のスクリプトやカスタムロジックをサンドボックス内で実行している場合。</li><li><strong>ビルドツールやCI/CDパイプライン:</strong> Node.jsで動作するビルドシステムやCI/CDツールが、外部のプラグインやユーザー定義のスクリプトをvm2で隔離して実行している場合。</li><li><strong>開発環境のサプライチェーンリスク:</strong> 依存するライブラリやフレームワークが内部的にvm2を使用しており、その脆弱性が開発環境や本番環境に波及する可能性。</li></ul>
このように、vm2の脆弱性は直接的な利用の有無に関わらず、Node.jsエコシステムを利用する多くの開発者にとって無視できないリスクとなります。
脆弱性の詳細:サンドボックスバイパスのメカニズム
この脆弱性は、vm2の<code>NodeVM</code>が提供するカスタムモジュール解決(<code>customResolve</code>)機能の実装に存在します。特に、<code>require.external</code>オプションとカスタムリゾルバーを組み合わせて使用している場合に問題が発生します。
通常、<code>NodeVM</code>では、サンドボックス内のゲストコードがホスト環境のモジュールにアクセスする際、<code>require.external</code>で明示的に許可されたモジュールのみがロードされます。また、カスタムリゾルバーを使用することで、開発者が独自のロジックでモジュールのパスを解決し、サンドボックスに許可させることができます。
しかし、この脆弱性では、カスタムリゾルバーが解決したモジュールパスが内部的に<code>this.externals</code>というリストに追加される際、そのパスが正規表現として<code>^<path></code>(パスの先頭にマッチ)の形式で登録されます。ここで重要なのは、正規表現の終端を示す<code>$</code>や、パスの区切り文字を考慮するような境界条件が適切に設定されていない点です。
この不備により、以下のような攻撃が成立します。
<ol><li><strong>許可されたモジュールのロード:</strong> 攻撃者は、カスタムリゾルバーによって明示的に許可されたモジュール(例: <code>foo</code>)をサンドボックス内でロードします。カスタムリゾルバーはこれをホスト上の<code>/tmp/vm2-prefix-case/node_modules/foo</code>と解決し、vm2はこのパスを<code>^/tmp/vm2-prefix-case/node_modules/foo</code>という正規表現で許可リストに追加します。</li><li><strong>プレフィックス共有モジュールの不正なロード:</strong> 次に、攻撃者は、上記で許可されたパスとプレフィックスを共有する、しかし本来は許可されていない別のファイル(例: <code>/tmp/vm2-prefix-case/node_modules/foo2/index.js</code>)を絶対パスでロードしようとします。</li><li><strong>サンドボックスバイパス:</strong> vm2は、このパスが既存の正規表現<code>^/tmp/vm2-prefix-case/node_modules/foo</code>にマッチすると誤認し、<code>foo2/index.js</code>のロードを許可してしまいます。<code>foo2/index.js</code>はホストコンテキストで実行され、<code>child_process</code>のような危険なモジュールを通じて、ホストOS上で任意のコマンドを実行することが可能になります。</li></ol>
これにより、ゲストコード(信頼されていないサンドボックス内のコード)が、本来アクセスを許されていないホストプロセスのファイルにアクセスし、実行権限を奪うことが可能になります。これは、典型的な「サンドボックスエスケープ」の脆弱性であり、非常に危険です。
攻撃が成立する条件と影響
この脆弱性が悪用されるためには、いくつかの前提条件があります。
<ul><li>Node.jsアプリケーションが<code>vm2</code>を使用している。</li><li><code>NodeVM</code>インスタンスが、<code>require.external</code>オプションとカスタムリゾルバーを組み合わせて使用している。</li><li><code>context: 'host'</code>が設定されている。</li><li>ホストのファイルシステム上に、許可されたパスとプレフィックスを共有する、悪意のあるまたは悪用可能なファイルが存在する。</li></ul>
この脆弱性が悪用された場合、以下のような極めて深刻な影響が生じる可能性があります。
<ul><li><strong>サンドボックスからの脱出(Sandbox Escape):</strong> 隔離されたはずのゲスト環境からホスト環境へのアクセスを許してしまう。</li><li><strong>リモートコード実行(RCE):</strong> ホストOS上で任意のコマンドを実行され、システムの完全な制御を奪われる可能性。これにより、機密情報の漏洩、データの破壊・改ざん、サービス停止など、取り返しのつかない被害が生じる可能性があります。</li><li><strong>システムリソースの不正利用:</strong> ホストのCPU、メモリ、ネットワークリソースなどが不正に利用される。</li></ul>
CVSSv3.1の評価では「Critical」とされており、攻撃の複雑さは低く、特別な権限やユーザー操作なしで悪用される可能性があるため、非常に危険です。
具体的な対策と推奨事項
現状、この脆弱性に対する公式の修正パッチは提供されていないと報告されています(「Patched versions: none identified by the tested evidence.」)。しかし、今後のセキュリティアップデートで修正される可能性が高いため、以下の対策を検討してください。
vm2の公式開発元から修正版がリリースされ次第、直ちに最新バージョンにアップデートしてください。アップデートにより、この脆弱性が修正されるだけでなく、他の既知のセキュリティ問題も解決される可能性があります。
<code>npm install vm2@latest</code> または <code>yarn upgrade vm2 --latest</code>
修正版がリリースされるまでの間、またはアップデートが困難な場合は、以下の点を再評価してください。
<ul><li><strong>カスタムリゾルバーの使用を最小限に:</strong> 可能であれば、カスタムリゾルバーの使用を避けるか、そのロジックを極めて厳密にレビューし、解決するパスが意図した範囲に限定されることを確認してください。</li><li><strong><code>require.external</code>の厳格化:</strong> 外部モジュールの許可リスト(<code>require.external.modules</code>)を必要最小限に絞り込み、ワイルドカードなどの緩い設定は避けてください。</li><li><strong><code>context: 'host'</code>の使用を避ける:</strong> <code>context: 'host'</code>はサンドボックス内でホストのモジュールを直接ロードできるため、セキュリティリスクが高まります。可能な限り<code>context: 'sandbox'</code>を使用するか、代替の安全な通信手段(例: メッセージパッシング)を検討してください。</li><li><strong>最小権限の原則:</strong> vm2を実行するNode.jsプロセスに与えるOSレベルの権限を最小限に制限してください。もしサンドボックスが破られたとしても、攻撃の影響範囲を限定できます。</li></ul>
依存ライブラリのセキュリティ脆弱性情報は常にチェックし、ビルドパイプラインやCI/CD環境でのセキュリティ強化にも努めてください。自動化された脆弱性スキャンツール(Dependabot, Snykなど)の導入も有効です。
まとめ
vm2のGHSA-5h3f-q97h-ccvc / CVE-2026-100721は、サンドボックス環境の信頼性を根底から揺るがす重大な脆弱性です。Node.jsアプリケーションでvm2を、特にカスタムリゾルバーや<code>require.external</code>オプションを組み合わせて使用している場合は、ご自身のサービスやシステムのセキュリティ体制に深刻な影響を与える可能性があります。
この情報を参考に、速やかにシステムの確認と、適切な対策の実施を進めていただきますようお願い申し上げます。常に最新のセキュリティ情報を収集し、継続的な対応を行うことが、安全なアプリケーション開発には不可欠です。