Modern Frontend CVEs

対象CVE: GHSA-p63j-vcc4-9vmv

[緊急解説] Vitestの深刻な脆弱性 (GHSA-p63j-vcc4-9vmv) と対応策

Vitestのブラウザモードに、ファイルアクセス権限をバイパスしてローカルファイルシステムにアクセスできるCriticalな脆弱性が発見されました。特に`allowWrite: false`設定時やAPIが公開されている環境下では深刻な影響があるため、速やかなバージョンアップが求められます。

はじめに:Vitestユーザーへの重要なお知らせ

フロントエンド開発において、テストは品質を保証する上で不可欠なプロセスです。Vitestは、その高速性とモダンな機能で多くの開発者に支持されています。しかし、この度Vitestのブラウザモード(`@vitest/browser`)において、非常に深刻な脆弱性(GHSA-p63j-vcc4-9vmv)が報告されました。この脆弱性は、設定によってはファイルシステムへの不正なアクセスを許してしまうため、日本のフロントエンドエンジニアの皆様にはその内容と対策を理解し、迅速な対応を取っていただくことを強く推奨します。

脆弱性の概要:`allowWrite`をバイパスする危険性

この脆弱性は、Vitestのブラウザモードが提供する特定の「コマンド」に起因します。これらのコマンドは、Node.js側で実行され、スクリーンショットの取得、Playwrightトレースの管理、ファイルのアップロードなど、ローカルファイルシステムにアクセスする機能を持っています。

問題なのは、これらのコマンドの一部が、通常ファイルアクセスを制御する`allowWrite`という権限ゲートのチェックを適切に行わずに、ブラウザ側から渡されたファイルパスに対して操作を実行してしまう点です。さらに、パスの妥当性検証も不十分であったため、プロジェクトディレクトリ外の任意のファイルパスにもアクセスが可能でした。

`allowWrite: false`は、通常、信頼できないテストコードからのファイルシステムへのアクセスをブロックするために使用されますが、この脆弱性はその保護を完全にバイパスしてしまいます。攻撃者は、テストランナーが動作するNode.jsプロセスの権限で、ファイルシステムの読み取り、作成、上書き、削除を自由に行うことが可能でした。

具体的な影響とリスクシナリオ

この脆弱性がもたらす影響は多岐にわたりますが、特に深刻なのは以下のケースです。

最も懸念されるのは、**任意ファイル読み取り**です。`upload`や`annotateTraces`コマンドが悪用されると、テストコードが実行されている環境(開発者のPCやCI/CDサーバーなど)上の任意のファイルを読み取り、その内容をブラウザに公開することができてしまいます。これにより、APIキー、認証情報、設定ファイルなどの機密情報が漏洩するリスクがあります。

また、`takeScreenshot`、`screenshotMatcher`、`stopChunkTrace`コマンドによる**任意パスへのファイル書き込み**、そして`deleteTracing`コマンドによる**任意ファイル削除**も可能です。これらの書き込みは攻撃者がファイルの内容を任意に指定できるものではありませんが(PNG画像やトレースアーカイブに限定)、システム上の重要なファイルを破壊したり、サービス運用に影響を与えたりする可能性があります。

この脆弱性は、特に以下のような環境で深刻なリスクとなります。

<ul><li><strong>`test.api.host`が設定されている、または開発サーバーが外部からアクセス可能な場合:</strong> Vitest APIがネットワークに公開されていると、外部の攻撃者がこのAPIを介してファイルシステム操作を行う可能性があります。`allowWrite: false`を設定している場合でも、この保護がバイパスされます。</li><li><strong>信頼できないテストコードを実行する場合:</strong> 外部から取得したnpmパッケージなどに悪意のあるテストコードが含まれていた場合、開発者のマシンやCI/CD環境のファイルシステムに不正アクセスされる可能性があります。</li></ul>

対処法:速やかなバージョンアップが必須

この脆弱性はCriticalな深刻度であり、速やかな対応が求められます。根本的な解決策は、Vitestを修正済みのバージョンにアップデートすることです。

修正は、ファイルアクセスを行う全てのプロバイダーコマンドに`allowWrite`チェックと、プロジェクトルートへのパス制限を追加することで行われました。これにより、クライアントから供給される絶対パスや`../`によるパストラバーサルが拒否されるようになります。

<strong>推奨される対応:</strong>

Vitestを、この脆弱性が修正された最新バージョンにアップデートしてください。具体的にどのバージョンで修正されたかは、Vitestの公式アナウンスやGitHubのリリースノートをご確認ください。通常、マイナーバージョンやパッチバージョンで修正がリリースされます。

```bash npm update vitest @vitest/browser # または yarn upgrade vitest @vitest/browser ```

まとめ

Vitestのブラウザモードにおける今回の脆弱性は、開発環境やCI/CD環境のセキュリティを脅かす重大な問題です。特に、機密情報の漏洩やシステム破壊のリスクを避けるためにも、速やかなバージョンアップを強く推奨します。日頃からソフトウェアのセキュリティ情報に注意を払い、常に最新の安全なバージョンを使用する習慣をつけましょう。

この情報が、日本のフロントエンドエンジニアの皆様の安全な開発の一助となれば幸いです。

← ブログ一覧に戻る