Modern Frontend CVEs

対象CVE: CVE-2026-43998

[緊急解説] vm2の重大なサンドボックスエスケープ脆弱性 (CVE-2026-43998) について

vm2ライブラリに、シンボリックリンクの悪用によりホストOS上で任意のコードを実行できるサンドボックスエスケープ脆弱性 (CVE-2026-43998) が発見されました。特にpnpmやnpm workspacesを利用する環境では攻撃経路が形成されやすく、早急な対応が求められます。

はじめに:なぜこの脆弱性が重要なのか

日本のフロントエンドエンジニアの皆さん、こんにちは。今回は、Node.js環境でサンドボックス機能を提供する人気ライブラリ `vm2` に発見された、非常に深刻な脆弱性について解説します。

`vm2` は、信頼できないコードを安全な隔離環境(サンドボックス)で実行するために利用されます。例えば、ユーザーが送信したコードを実行するサービス、プラグインシステム、あるいは一部のビルドツールやテスト環境などで利用されている場合があります。しかし、今回報告された <a href="https://github.com/advisories/GHSA-cp6g-6699-wx9c" target="_blank" rel="noopener noreferrer">GHSA-cp6g-6699-wx9c</a> / <a href="https://nvd.nist.gov/vuln/detail/CVE-2026-43998" target="_blank" rel="noopener noreferrer">CVE-2026-43998</a> は、このサンドボックスの主要な防御メカニズムを完全に無効化し、ホストOS上で任意のコード実行(RCE: Remote Code Execution)を可能にしてしまう重大な問題です。

特に、現代のフロントエンド開発で一般的な `pnpm`、`npm workspaces`、`npm link` といったツールを利用している環境では、この攻撃経路が形成されやすいため、非常に高いリスクを伴います。ご自身のプロジェクトで `vm2` を利用している場合は、すぐにこの情報を確認し、適切な対策を講じる必要があります。

脆弱性の概要と仕組み (CVE-2026-43998)

`vm2` の `NodeVM` クラスは、サンドボックス化されたコードがホストOSのファイルシステムに勝手にアクセスできないよう、`require.root` というパス制限を設けています。これは、サンドボックス内のコードが、許可されたルートディレクトリ内のモジュールのみを読み込めるようにするための重要な防御機構です。

しかし、この制限にはシンボリックリンク(特定のファイルやディレクトリを指し示すショートカットのようなもの)を悪用したバイパス経路が存在しました。問題の核心は、パスの「検証時」と「実際のモジュール読み込み時」の動作の不一致にあります。

この動作の差を利用することで、攻撃者はサンドボックス内で、許可されたルートディレクトリ内にあると「見せかけた」シンボリックリンクを作成できます。このシンボリックリンクは実際にはルートディレクトリ外の任意のモジュールを指しており、`require()` がそれを解決してホストOSの権限で読み込み、実行できてしまうのです。

この脆弱性の深刻度は「高」(CVSS 8.5)と評価されており、以下のような影響が考えられます。

どんな環境が危険?特にフロントエンド開発者は要注意!

この脆弱性が特に危険なのは、現代のJavaScript開発で広く利用されている以下の環境で、攻撃経路が自動的に満たされやすいためです。

もしあなたのプロジェクトがこれらのツールを使い、かつ `vm2` を利用している場合(例えば、ビルド時のプラグイン実行、テストコードのサンドボックス化、CI/CD環境でのスクリプト実行など)、システム乗っ取りのリスクに晒されている可能性が高いです。早急な対応が求められます。

今すぐ取るべき対応策

根本的な解決策は、パスの検証を行う前に、シンボリックリンクを解決して実際のファイルシステム上のパスで確認することです。これにより、検証フェーズと実行フェーズで参照するパスが一致し、サンドボックスの境界が正しく機能するようになります。

`DefaultFileSystem` クラスに `realpath` メソッドを追加し、`fs.realpathSync` を使ってシンボリックリンクを解決するように変更します。そして、`isPathAllowed` メソッドでパスを検証する際、および `vm2` の初期化時に `rootPaths` を設定する際に、この `realpath` メソッドを使って実際のパスを取得してから検証を行うようにします。

<b>実装のポイント:</b>

<b>注意点:</b> `fs.realpathSync` はファイルシステムへの追加の呼び出しを伴うため、パフォーマンスへの影響を最小限に抑えるために、リアルパスの解決結果をキャッシュするなどの対策も検討してください。

`Resolver.makeExtensionHandler` 内で、`filename` をチェックする際に `fs.realpathSync(filename)` を使ってシンボリックリンクを解決し、そのリアルパスに対してもアクセスチェックを行うように修正します。

<b>注意点:</b> この方法は、`makeExtensionHandler` をバイパスするカスタムリゾルバーなど、すべてのケースを保護できるわけではありません。可能であれば、オプション1を優先してください。

<b>補足:</b> vm2のバージョンアップによってこの脆弱性が修正されている可能性もあります。まずは利用している `vm2` のバージョンを確認し、修正済みの最新バージョンが存在する場合は、そちらへのアップグレードを最優先で検討してください。

まとめ

`vm2` のサンドボックスエスケープ脆弱性 (CVE-2026-43998) は、シンボリックリンクの特性を悪用し、ホストOS上で任意のコード実行を可能にする非常に危険な問題です。特に `pnpm` や `npm workspaces` を使用するフロントエンド開発環境では、そのリスクが顕著になります。

ご自身のプロジェクトで `vm2` を利用している場合は、ただちに利用状況を確認し、上記で推奨した対策、特にパス検証前にシンボリックリンクを解決するアプローチを導入するか、修正済みバージョンへのアップグレードを行ってください。定期的な依存関係のセキュリティチェックを怠らず、常に最新のセキュリティ情報にアンテナを張るようにしましょう。

安全な開発環境を維持するために、ご協力をお願いいたします。

← ブログ一覧に戻る