[解説] `vm2`の深刻な脆弱性 (CVE-2026-92941) に注意:Node.jsプロセスの通信が危ない!
はじめに:`vm2`とは何か、なぜフロントエンドエンジニアに関係するのか
皆さん、こんにちは。フロントエンド開発者の皆さんの中には、Node.jsをサーバーサイド(BFFなど)、ビルドツール、テスト環境、SSR (Server Side Rendering) などで利用している方も多いでしょう。`vm2`は、Node.js環境で外部から与えられた信頼できないJavaScriptコードを安全に実行するためのサンドボックスライブラリです。例えば、ユーザーが提供したスクリプトやプラグインを分離された環境で実行する際に利用されます。
この`vm2`に、ホスト側のNode.jsプロセス全体の通信の信頼性を根底から覆す、極めて深刻な脆弱性が発見されました。直接`vm2`をアプリケーションに組み込んでいなくても、利用しているフレームワークやライブラリが内部で`vm2`を使用している可能性もあるため、この脆弱性とその対策について理解しておくことは非常に重要です。
脆弱性の概要と深刻度 (CVE-2026-92941, Critical)
今回報告された脆弱性 (GHSA-98xx-8mx4-x7cm / CVE-2026-92941) は、`vm2`のサンドボックスが意図した分離境界を越え、**ホストのNode.jsプロセスが信頼するSSL/TLS証明書発行局 (CA) のリストを攻撃者が勝手に変更できる**というものです。
これは「Critical(致命的)」と評価されており、本来安全であるべきHTTPSなどの通信が傍受・改ざんされ、パスワード、APIキー、個人情報といった重要な情報が攻撃者に盗まれる危険性があります。サンドボックスからの脱出は直接的ではないものの、その影響はセキュリティ上、非常に深刻です。
脆弱性の仕組みを技術的に深掘り
通常、`vm2`はサンドボックス内のコードがホスト環境に影響を与えないよう厳重に隔離します。しかし、この脆弱性は特定の条件下でその分離を破ります。
問題が発生するのは、`NodeVM`を作成する際に、組み込みモジュールとして**`tls`と`url`が明示的にサンドボックス内で利用することを許可されている場合**です。`tls`モジュールには、Node.jsプロセス全体で利用される信頼するCAリストを設定する`setDefaultCACertificates()`という関数が存在します。
攻撃者は、サンドボックス内でこの`tls.setDefaultCACertificates()`関数を呼び出すことで、ホストプロセス全体のCAリストを不正に書き換えることができます。さらに巧妙なのは、`URLSearchParams.getAll()`という、ホスト環境で実行される関数を悪用する点です。この関数を利用して、攻撃者はサンドボックスのチェックを回避しつつ、悪意のあるCA証明書データをホスト側の配列として生成させ、それを`tls.setDefaultCACertificates()`に渡すことで、サンドボックス内に閉じ込められるべき変更がホスト全体に影響を及ぼします。
この攻撃に必要なのは、`tls`と`url`モジュールへのアクセス権限だけで、ファイルシステム (`fs`) などの危険なモジュールへのアクセスは不要です。これが、本脆弱性の発見と対処を困難にしている一因です。
あなたのプロジェクトは影響を受けますか?
以下の条件に合致する場合、あなたのプロジェクトはこの脆弱性の影響を受ける可能性があります。
<ul><li>`vm2`ライブラリの**バージョン3.11.6**を使用している場合。</li><li>`NodeVM`を作成する際に、組み込みモジュールとして**`tls`と`url`が明示的に許可されている**場合。</li><li>影響を受けるNode.jsのバージョンは、**22.x系の22.19.0以降、または24.x系の24.5.0以降**です。</li></ul>
これらの条件を満たしているか、今一度プロジェクトの依存関係と`vm2`の設定を確認してください。
脆弱性がもたらす具体的なリスク
この脆弱性が悪用された場合、以下のような極めて深刻な事態が発生する可能性があります。
<ul><li><strong>通信の傍受・改ざん(Man-in-the-Middle攻撃):</strong> 攻撃者は、ホストのNode.jsプロセスが行うHTTPS通信などにおいて、自身が作成した偽の証明書を正規のものとして信頼させることができます。これにより、外部サービス(DB、API、認証プロバイダなど)との安全な通信が攻撃者によって傍受され、ログイン情報、APIキー、個人データなどの機密情報が盗まれたり、通信内容が改ざんされたりする危険性があります。</li><li><strong>サービス妨害 (Denial of Service):</strong> 正規の信頼するCAリストが削除されたり、不正な情報で上書きされてしまうため、攻撃とは無関係な他のHTTPS通信も証明書エラーで失敗し、サービスの機能停止や不安定化につながる可能性があります。</li><li><strong>直接的なコード実行はないが、極めて深刻:</strong> この脆弱性自体は、直接的にホスト上で任意のファイルを読み書きしたり、コマンドを実行したりするものではありません。しかし、ホストプロセスの「信頼」というセキュリティの根幹に関わる部分を操作できるため、結果として極めて深刻な情報漏洩やシステム乗っ取り(通信傍受による認証情報の窃取と悪用)のリスクに繋がります。</li></ul>
今すぐ取るべき対策
この脆弱性への対応は緊急性が非常に高いです。以下の対応を直ちに実施してください。
<ul><li><strong>vm2のアップデート:</strong> 最優先で、`vm2`ライブラリを脆弱性が修正された**最新バージョン(バージョン3.11.7以降、またはそれ以降の安定版)に直ちにアップデート**してください。`npm update vm2`や`yarn upgrade vm2`で更新できます。</li><li><strong>組み込みモジュール許可の見直し:</strong> もし可能であれば、`NodeVM`で`tls`および`url`モジュールへのアクセスを許可しない設定に見直すことを検討してください。アプリケーションの要件によっては完全に禁止するのが難しい場合もありますが、不必要なアクセス権限は常に最小限に留めるべきです。</li></ul>
まとめ
`vm2`のこの脆弱性は、サンドボックス環境の基本的なセキュリティ保証を損なうものであり、Node.jsアプリケーションにおける通信の信頼性を根本から揺るがす重大な問題です。フロントエンドエンジニアの皆さんも、自身が関わるNode.jsプロジェクトで`vm2`が使用されていないか確認し、速やかに対応を行うことが求められます。
常に最新のセキュリティ情報を追い、依存ライブラリのバージョン管理を徹底することが、安全な開発環境を維持する上で不可欠です。この記事が、皆さんのプロジェクトのセキュリティ強化の一助となれば幸いです。