Modern Frontend CVEs

対象CVE: CVE-2026-92958

[重要] vm2の深刻な脆弱性:サンドボックスを迂回したホストファイルシステム書き込みの可能性

Node.jsのサンドボックスライブラリ`vm2`において、`fs`モジュールの利用を拒否しても`fs/promises`経由でホストファイルシステムへの書き込みが可能となる深刻な脆弱性が発見されました。これにより、サンドボックスのセキュリティ境界が破られる可能性があります。

はじめに:JavaScriptサンドボックス「vm2」とは?

`vm2`は、Node.js上で安全なJavaScriptサンドボックス環境を提供する人気のライブラリです。外部からの信頼できないコードやユーザー提供のスクリプトを、ホストシステムへの不正アクセスから隔離して安全に実行する目的で広く利用されています。

フロントエンド開発の文脈では、例えばサーバーサイドレンダリング(SSR)環境でユーザー提供のコンポーネントを実行したり、CI/CDプロセスで外部スクリプトを安全に実行したりする場面で、間接的に`vm2`が利用されている可能性もあります。サンドボックス環境は、特にセキュリティが重要視される場面でその真価を発揮します。

深刻な脆弱性 GHSA-6rh5-qq4q-97xh / CVE-2026-92958 の概要

今回発見された脆弱性(ID: `GHSA-6rh5-qq4q-97xh` / CVE: `CVE-2026-92958`)は、`vm2`のサンドボックスが持つセキュリティ境界を破る可能性があり、その深刻度は`high`と評価されています。この脆弱性は、サンドボックスの存在意義を根底から揺るがす危険性を秘めています。

具体的には、`NodeVM`の`require`オプションで`builtin: ['*', '-fs']`のようにファイルシステム(`fs`)へのアクセスを明示的に拒否しても、サンドボックス内のコードが`fs/promises`または`node:fs/promises`モジュールを介してホストOSのファイルシステムへ自由にファイルを作成・書き込みできてしまうというものです。

何が問題なのか?詳細な挙動と影響

通常、開発者は`vm2`の`require.builtin`設定で`['*', '-fs']`と指定することで、サンドボックス内から`require('fs')`をブロックし、ファイルシステムへのアクセスを阻止すると期待します。しかし、この設定では`require('fs/promises')`や`require('node:fs/promises')`がブロックされません。

この問題の根源は`vm2`の内部実装にあります。`builtin`の除外リスト(例:`-fs`)は厳密に「`fs`」という名前のモジュールのみを対象とし、`fs/promises`のようなサブパスや、`node:`プレフィックス付きのモジュールを別物として扱ってしまいます。さらに、`node:fs/promises`をブロックしても`fs/promises`がブロックされないなど、`node:`プレフィックスの扱いにも一貫性がありません。

このバイパスにより、サンドボックス内の悪意のあるコードは、ファイルシステムへのアクセスが許可されていないにも関わらず、ホストOS上で任意のファイルを作成・変更・削除(`writeFile`, `cp`, `mkdir`, `rename`, `rm`など)することが可能になります。これは、サンドボックスを導入した意図を完全に無効化してしまう非常に危険な状態です。

あなたのシステムは影響を受けますか?

この脆弱性は、Node.js環境で`vm2`ライブラリの`NodeVM`クラスを使用しており、特に以下の様な設定をしている場合に影響を受けます。

`new NodeVM({ require: { builtin: ['*', '-fs', '-child_process'] } })`

つまり、ビルトインモジュールのワイルドカード`'*'`を使用しつつ、ファイルシステムアクセスを`-fs`で明示的に拒否している構成が影響の対象です。

もしあなたのアプリケーションが、ユーザー提供のコードや外部の信頼できないスクリプトを`vm2`サンドボックス内で実行しており、かつ上記のような設定をしている場合は、直ちにプロジェクトを確認し、対策を講じる必要があります。

開発者への対策と推奨事項

この深刻な脆弱性に対する対策は以下の通りです。

<strong>1. `vm2`のバージョンアップ</strong><br>最も推奨される対策は、この脆弱性が修正された`vm2`の最新バージョンがリリースされ次第、速やかにアップデートすることです。`vm2`のリポジトリや関連するセキュリティアドバイザリを定期的にチェックし、最新情報を入手するようにしましょう。

<strong>2. 暫定的な回避策</strong><br>修正版がリリースされるまでの間、または設定をより厳密にするために、`fs`関連の全てのモジュールパスを明示的に拒否リストに追加することを強く推奨します。これにより、`fs`およびそのサブパス、`node:`プレフィックス付きの`fs`関連モジュールへのアクセスがすべてブロックされます。

```javascript new NodeVM({ require: { builtin: ['*', '-fs', '-fs/promises', '-node:fs', '-node:fs/promises', '-child_process'] } }); ```

<strong>3. セキュリティプラクティスの見直し</strong><br>サンドボックス環境は「絶対に安全」という保証はありません。常に最小権限の原則に従い、サンドボックス内で実行するコードの範囲を最小限に抑え、必要な機能のみを許可するよう設計を見直しましょう。また、依存ライブラリの定期的なセキュリティスキャンや、利用しているライブラリのセキュリティ情報のチェックを習慣化することが重要です。

まとめ

`vm2`のサンドボックスにおけるファイルシステム書き込み脆弱性は、サンドボックスのセキュリティ境界を迂回する可能性があり、その影響は非常に甚大です。信頼できないコードを扱うアプリケーションにおいては、深刻なセキュリティインシデントに繋がりかねません。

`vm2`を利用している日本のフロントエンドエンジニアの皆さんは、ご自身のプロジェクトがこの脆弱性の影響を受けないかを確認し、速やかに対策を講じるようお願いいたします。セキュリティ情報の継続的なチェックと依存ライブラリの適切な管理が、安全なアプリケーション開発の鍵となります。

← ブログ一覧に戻る