[緊急] Node.jsサンドボックスvm2にCriticalなRCE脆弱性(CVE-2026-92935)
フロントエンドエンジニアが知るべきNode.jsサンドボックスの脅威
近年、フロントエンド開発はNode.jsを基盤としたエコシステムに大きく依存しています。ビルドツール(Webpack, Viteなど)、テストランナー、BFF(Backend For Frontend)など、開発から運用までNode.jsが幅広く活用されており、皆さんの日常業務に深く関わっているはずです。そのため、Node.js環境で動作するライブラリのセキュリティ脆弱性は、フロントエンド開発者にとっても決して他人事ではありません。今回は、Node.jsで信頼できないコードを隔離するためのサンドボックスライブラリ「vm2」に関する非常に深刻なリモートコード実行 (RCE) 脆弱性について解説します。
この脆弱性(GHSA-8hr7-r645-pc6w / CVE-2026-92935)はCriticalと評価されており、適切な対処を怠ると、皆さんの開発環境やプロダクションサーバーが乗っ取られる危険性があります。ぜひ最後までお読みいただき、速やかに対策を講じてください。
vm2とは?なぜサンドボックスが必要なのか
`vm2`は、Node.jsアプリケーション内で信頼できない外部のJavaScriptコードを安全に実行するためのサンドボックスライブラリです。例えば、ユーザーがアップロードしたスクリプトを実行したり、プラグインシステムで第三者のコードを動かしたりする際に、ホストシステムへの影響を防ぐ目的で使用されます。通常のNode.js環境では、`child_process`モジュールなどを使えば簡単にシステムコマンドを実行できてしまいますが、`vm2`はこれらの危険な操作を制限することで、安全な実行環境を提供することを目指しています。
脆弱性の概要と、なぜRCEに繋がるのか
今回の脆弱性は、`vm2`のサンドボックスが特定の誤った設定をしている場合に、そのセキュリティ境界を完全に破られてしまうというものです。具体的には、`NodeVM`インスタンスを生成する際に、`{nesting: true, require: []}`という、`require`オプションに空の配列を渡した場合に問題が発生します。
通常、`require`オプションは許可するNode.jsモジュールをオブジェクト形式で明示的に指定すべきです。しかし、`vm2`の内部チェックが、この空の配列を誤って「有効な設定」と判断してしまいます。この誤認が、サンドボックス内で実行されるコードに、ホスト側の`vm2`モジュールへのアクセスを許可してしまう原因となります。
攻撃者はこのアクセス権限を悪用し、サンドボックス内部で新たな`NodeVM`インスタンスを生成できます。そして、その新たなインスタンスでは`child_process`のようなシステムコマンド実行を可能にする危険なモジュールを自由に`require`できるように設定できてしまいます。これにより、サンドボックスの保護が完全に無効化され、ホストのファイルシステムの操作、ファイルの変更、さらにはサーバー上で任意のコマンドを実行するリモートコード実行 (RCE) が可能となります。これはサーバーが完全に攻撃者に乗っ取られるのと同等の、非常に深刻な事態を招きます。
あなたのプロジェクトは影響を受けますか?
以下の条件を**両方**満たす場合、あなたのNode.jsアプリケーションはこの脆弱性の影響を受けます。
1. `vm2`ライブラリを使用しており、特に`NodeVM`インスタンスを作成する際に、**`nesting: true`**という設定と共に、**`require: []`**のように`require`オプションに配列を渡している。
2. そのサンドボックス内で、信頼できない外部のJavaScriptコード(例えば、ユーザーが投稿したスクリプトや、外部プラグインなど)を実行する可能性がある。
例えば、特定のCI/CDパイプラインで動的に生成されたスクリプトを実行する際や、BFFでユーザー入力に基づくコードを評価するようなケースでは注意が必要です。
今すぐ取るべき対応策
この深刻な脆弱性からあなたのシステムを守るため、速やかに以下の対応を実施してください。
1. **vm2ライブラリを最新バージョンにアップデートしてください。**
この脆弱性はすでに修正されています。`package.json`を確認し、以下のコマンドで最新バージョンに更新することを強く推奨します。
`npm install vm2@latest` または `yarn upgrade vm2 --latest`
2. **`NodeVM`の`nesting`および`require`オプションの設定を見直してください。**
特に`require: []`のように配列を渡している箇所がないか、コードベースを検索し確認してください。`require`オプションは、許可するモジュールを**オブジェクト形式**で明示的に指定するように変更してください。例えば、`require: { external: true }` や `require: { builtin: ['assert'] }` のように、必要なモジュールだけを限定的に許可する設定にしてください。
3. **サンドボックスで実行されるコードの信頼性を常に評価してください。**
根本的な対策として、サンドボックス内で実行するコードが本当に信頼できるものか、その必要性があるのかを常に問い直すことが重要です。可能な限り、信頼できるソースからのコードのみを実行するようにしてください。
まとめ
今回の`vm2`の脆弱性は、Node.js環境におけるセキュリティの重要性を改めて浮き彫りにしました。フロントエンドエンジニアの皆さんも、Node.jsエコシステムに潜む潜在的なリスクを理解し、常に最新のセキュリティ情報にアンテナを張ることが求められます。ライブラリのアップデートと設定の見直しを速やかに実施し、安全な開発・運用環境を維持しましょう。