Modern Frontend CVEs

対象CVE: CVE-2026-92938

[注意喚起] Node.jsサンドボックスvm2の致命的な脆弱性 (GHSA-6w8r-xxw2-g3hx / CVE-2026-92938)

Node.jsのコードを安全に実行するためのサンドボックスライブラリvm2に、サンドボックスを完全に迂回して任意のネイティブコードが実行されるCriticalな脆弱性が見つかりました。この脆弱性の詳細、フロントエンド開発者への影響、そして今すぐ取るべき対策について解説します。

はじめに:vm2とは何か? なぜ重要なのか?

皆さん、こんにちは! 日々進化するWeb技術を追いかける中で、セキュリティは常に重要なテーマですよね。今回は、Node.js環境でコードを安全に実行するためのサンドボックスライブラリ「vm2」に関する非常に深刻な脆弱性について解説します。

vm2は、特にユーザーが提供する信頼できないコード(例えば、プラグイン、カスタムスクリプト、オンラインエディタでのコード実行など)を、システム全体に影響を与えずに実行したい場合に広く利用されています。Node.jsでサーバーサイドのロジックやビルドスクリプトなどを扱うフロントエンドエンジニアの皆さんにとっても、無縁ではありません。このライブラリがサンドボックスとして機能しなくなるということは、システムの安全性にとって致命的な問題を引き起こす可能性があります。

深刻度Critical! vm2サンドボックスエスケープの概要

今回報告された脆弱性 (GHSA-6w8r-xxw2-g3hx / CVE-2026-92938) は、vm2のバージョン3.11.6以前に存在し、深刻度は「Critical」と評価されています。その本質は、vm2のサンドボックス機構を完全に迂回し、Node.jsのホストプロセス上で任意のネイティブコードを実行できてしまうというものです。

具体的には、サンドボックス内の攻撃者が、ホストプロセスの権限でファイルシステムへのアクセス、ネットワーク通信、さらには他のプロセスへの干渉など、あらゆる操作を行えるようになることを意味します。これは、サンドボックスが提供するセキュリティモデルの根幹を揺るがす、極めて危険な脆弱性です。

脆弱性の技術的な詳細:なぜサンドボックスが破られたのか?

では、この脆弱性がどのようにして発生するのか、その技術的なメカニズムを深掘りしていきましょう。

この脆弱性は、vm2の設定で`node:sqlite`モジュールが明示的に許可されているか、`builtin: ['*']`として全ての組み込みモジュールが許可されている場合に発生します。

vm2は、サンドボックス内で`require('node:sqlite')`のような形式で組み込みモジュールを要求された場合、ホストプロセスの実際の`node:sqlite`モジュールをロードし、それを`vm.readonly()`でラップしてサンドボックスに提供します。しかし、ここで問題となるのは、`vm.readonly()`がプロパティの書き換えを防ぐものの、関数呼び出し自体はホストの権限で実行されてしまう点です。

vm2のモジュールリゾルバーに巧妙なバグがありました。サンドボックス内のコードが`require('node:node:sqlite')`という形式でモジュールを要求すると、vm2はこれを`node:sqlite`として解釈し、最終的にホストプロセスの`node:sqlite`モジュールがサンドボックスに公開されてしまいます。

公開された`node:sqlite`モジュールには、`DatabaseSync`クラスが含まれています。攻撃者はこれを利用してインメモリデータベースを作成し、`allowExtension: true`オプションを有効にすることができます。さらに、`DatabaseSync`オブジェクトの`loadExtension()`メソッドを呼び出すことで、任意のネイティブライブラリ(例: `.dylib`, `.so`, `.dll`ファイル)をNode.jsホストプロセスにロードし、実行させることが可能です。

攻撃者は、サンドボックス内で実行されるJavaScriptコードとともに、悪意のあるネイティブライブラリをプラグインパッケージ内に含めることができます。そして、CommonJSの`__dirname`プロパティを利用して、自身がバンドルしたネイティブライブラリへのパスを簡単に特定し、`loadExtension()`に渡すことができます。これにより、サンドボックス内のJavaScriptから、ホストプロセスの権限でネイティブコードが実行されてしまうのです。

フロントエンドエンジニアへの影響と関連性

「vm2はバックエンドのライブラリだから関係ない」と思われた方もいるかもしれません。しかし、現在のフロントエンド開発はNode.js環境と密接に結びついており、以下のようなシナリオで間接的に影響を受ける可能性があります。

この脆弱性が悪用されると、ビルドサーバー、開発サーバー、本番サーバーなど、Node.jsアプリケーションが動作するホスト環境が乗っ取られ、機密情報の漏洩、データの改ざん、システムの破壊といった重大な被害につながる可能性があります。

今すぐできる対策

この非常に危険な脆弱性から身を守るために、以下の対策を速やかに実施してください。

まとめ

vm2のサンドボックスを迂回するこの脆弱性は、Node.js環境におけるセキュリティの重要性を改めて浮き彫りにしました。フロントエンド開発者の皆さんも、自身の開発環境やプロジェクトの依存関係に潜むリスクを意識し、迅速な対策を講じることが不可欠です。

常に最新の情報をキャッチアップし、安全な開発プラクティスを心がけることで、より堅牢なWebアプリケーションを構築していきましょう。

← ブログ一覧に戻る