JavaScript テストフレームワーク Vitestに重大な脆弱性(VE-2026-47428,CVE-2026-47429,CVE未採番)

セキュリティニュース

投稿日時: 更新日時:

JavaScript テストフレームワーク Vitestに重大な脆弱性(VE-2026-47428,CVE-2026-47429,CVE未採番)

2026年6月1日、Vite(Viteを基盤とするJavaScriptビルドツール)向けテストフレームワーク「Vitest」の公式GitHubセキュリティアドバイザリに重大な脆弱性3件が同時に公開されました。最大のリスクは攻撃面の広さにあります。

Vitestの週間ダウンロード数は全世界で5,300万件に達しており、フロントエンド開発・フルスタック開発の現場に広く普及しています。

今回公開された脆弱性3件はいずれもCritical(CVSS 9.6〜9.8)に分類されており、VitestのUIサーバーまたはBrowserModeが動作している状態で攻撃者がリモートコード実行(RCE)を達成できる可能性があります。ただし重要な留保として、Vitestをデフォルト設定(localhost専用)で使用している場合は攻撃面が大幅に制限されます。脆弱性の主な影響は「VitestのUIサーバーをネットワークに公開している(--api.hostまたはapi.host設定を使用している)場合」、または「攻撃者が細工したURLにユーザーがブラウザでアクセスした場合」に集中しています。

本記事では3件の脆弱性の技術詳細・正確な修正バージョン(一部の報道で誤った情報が拡散しているため、GitHubの公式アドバイザリに基づいて整理)・今すぐ取るべき対応を解説します。

サマリー

  • 2026年6月1日、Vitest公式GitHubセキュリティアドバイザリに重大な脆弱性3件が公開(週間DL数:5,300万件)
  • CVE-2026-47428(GHSA-2h32-95rg-cppp、CVSS 9.6):BrowserModeのotelCarrierクエリパラメータ未サニタイズ→インラインスクリプトインジェクション→認証トークン窃取→vite.config.ts改ざん→RCE。発見者:tomohiro86
  • CVE-2026-47429(GHSA-5xrq-8626-4rwp、CVSS 9.8):Windows環境での/__vitest_attachment__のパストラバーサル+BrowserModeのreadFile/writeFileによる認証不要ファイル読み書き。発見者:sapphi-red
  • CDP経由RCE(GHSA-g8mr-85jm-7xhm、CVSS 9.8、CVE未採番):Chrome DevTools Protocol(CDP)インターフェースの直接公開→管理制限のバイパス→プロジェクトルートへの任意ファイルダウンロード→RCE
  • 安全な修正バージョン(3件すべてを解消):4.x系は4.1.8以降、3.x系は3.2.5以降、5.0ベータ系は5.0.0-beta.4以降
  • 新設された設定フラグ:allowWriteallowExec(ネットワーク公開時はデフォルトで無効化)
  • デフォルト設定(localhost専用)では攻撃面が大幅に制限されるが、CI/CD環境やチーム開発環境では注意が必要

Vitestとは—フロントエンド開発標準のユニットテストフレームワーク

Vitestは、ViteベースのプロジェクトのためのJavaScript・TypeScriptユニットテストフレームワークです。Jestと高い互換性を持ちながら、Viteの高速なHMR(Hot Module Replacement)を活かした高速なテスト実行を特徴とします。

週5,300万ダウンロードという数値は、npmレジストリのJavaScriptパッケージの中でも最大規模の部類に入ります。Vue.js・Nuxt.js・Reactを使ったプロジェクト、CI/CDパイプラインの自動テスト、フルスタック開発環境など、現代のフロントエンド開発のあらゆる場面で利用されています。

今回の脆弱性が特に懸念されるのは、VitestのUIサーバーがNode.jsプロセスとして開発者のマシン上またはCI/CDサーバー上で動作するため、RCEが達成されると開発者の認証情報・ソースコード・秘密鍵・CI/CDパイプライン全体が危険にさらされる点です。


CVE-2026-47428(CVSS 9.6)—otelCarrierパラメータの未サニタイズによるスクリプトインジェクション

GitHub公式アドバイザリ(GHSA-2h32-95rg-cppp)によれば、発見者はtomohiro86氏です。

技術的な問題の核心:VitestのBrowserModeは/__vitest_test__/エンドポイントでotelCarrierクエリパラメータを処理しますが、このパラメータの値をサニタイズせずにインラインモジュールスクリプト内に直接挿入していました。JavaScriptのソースコードとして扱われるべきでないデータがそのままスクリプトとして評価されます。

攻撃チェーンは4段階です。まず攻撃者がURLに悪意あるJavaScriptをotelCarrierパラメータとして埋め込んだ細工済みURLを作成します。被害者がそのURLにブラウザでアクセスすると(または何らかの手段で訪問させると)、VitestのBrowserModeサーバーのオリジン内で任意のJavaScriptが実行されます。実行されたスクリプトがフレームワークの認証トークンを窃取し、そのトークンを使用してプロジェクトのvite.config.tsなどの設定ファイルを上書きします。次回のファイルリロード時にNode.jsが注入されたペイロードを内部ユーティリティ経由で実行します。

影響バージョン@vitest/browser 4.0.17以上4.1.6未満、5.0.0-beta.0以上5.0.0-beta.3未満。

CVSSが9.8でなく9.6の理由:攻撃にユーザーの操作(UI:Required)が必要なため、CVSS v3.1のスコアが9.6となっています。一部の報道で「CVSS 9.8」と記載されているケースは誤りです。


CVE-2026-47429(CVSS 9.8)—WindowsファイルトラバーサルとBrowserModeの認証不要ファイル操作

Windows固有の問題(パストラバーサル)/__vitest_attachment__エンドポイントのAPIハンドラーがisFileServingAllowed関数を誤った方法で使用しています。本来はファイルアクセス制限のためのチェックですが、WindowsのNTFS拡張パス構文(\?\)を使ったパス文字列により、この制限をバイパスしてプロジェクトディレクトリ外の任意ファイルを読み取ることが可能です。

PoC(概念実証)のcurlコマンドがアドバイザリで示されています(概念の理解のために記載:実行することは推奨しません)。

curl "http://localhost:51204/__vitest_attachment__?path=C:\path\to\project\?\..\..\secret.txt
     &contentType=text/plain&token=$TOKEN"

このコマンドはプロジェクトディレクトリの外にあるsecret.txtの内容を取得できることを示しています。Linuxでは?という名前のディレクトリが存在しないためエラーになるため、この問題はWindows環境に限定されます。

BrowserModeのファイル操作APIの問題:さらに、BrowserModeのreadFilewriteFilesaveSnapshotFile関数も認証不要でファイルの読み書きを行えることが確認されています。これは全プラットフォームで影響を受けます。

修正バージョン:vitest 4.1.0 / 3.2.5。ただし後述するCDP経由RCEも含めて3件すべてを解消するには4.1.8以降(4.x系)が必要です。

発見者はsapphi-red氏です。


CDP経由RCE(CVSS 9.8、CVE未採番)—Chrome DevTools Protocolの直接露出

GitHubアドバイザリID:GHSA-g8mr-85jm-7xhm。記事執筆時点でCVEは未採番で、国立脆弱性データベース(NVD)のエントリは「RESERVED」状態です。

技術的な問題:VitestのBrowserModeは内部でChrome DevTools Protocol(CDP)を活用していますが、このCDPインターフェースが外部から直接アクセス可能な形で公開されています。CDPは本来、ブラウザの開発者ツールとの通信に使用するもので、ファイルシステムへの書き込みや任意コードの実行を含む強力な操作が可能です。

このインターフェースが通常の管理制限フラグを完全にバイパスする形で公開されているため、外部の攻撃者がプロジェクトのルートディレクトリに悪意あるファイルを直接書き込み、フルRCEを達成することができます。この手法は標準的なアラートをトリガーしません。

修正バージョン@vitest/browser 4.1.8 / 3.2.5 / 5.0.0-beta.4。この脆弱性の修正のために4.1.8へのアップデートが必要であり、3件すべてを解消するためには4.1.8以降(4.x系)に更新してください。

正確な修正バージョン一覧—

CVE / アドバイザリ 対象パッケージ 修正済みバージョン(4.x系)
CVE-2026-47428(GHSA-2h32-95rg-cppp) @vitest/browser 4.1.6以降
CVE-2026-47429(GHSA-5xrq-8626-4rwp) vitest 4.1.0以降
CDP経由RCE(GHSA-g8mr-85jm-7xhm) @vitest/browser 4.1.8以降

3件すべてを解消する推奨バージョン:

  • 4.x系:4.1.8以降
  • 3.x系:3.2.5以降
  • 5.0ベータ系:5.0.0-beta.4以降

4.1.0〜4.1.7で止めると、CDP経由RCEが残ることに注意してください。


今すぐ取るべき対応

Step 1:インストールされているバージョンの確認

npm ls vitest
npm ls @vitest/browser

または直接・推移的依存を含めてチェック:

npm list vitest --all
npm audit

Step 2:アップデートの実施

npm update vitest @vitest/browser
# または直接バージョン指定
npm install [email protected] @vitest/[email protected]

Step 3:ネットワーク公開設定の確認

vite.config.tsまたはvitest.config.tsに以下のような設定がある場合は即座に見直してください:

// 危険な設定例(ネットワークに公開)
export default defineConfig({
  test: {
    api: { host: '0.0.0.0' } // または --api.host オプション
  }
})

デフォルト(localhostのみ)設定にし、ネットワーク公開が必要な場合は新設されたallowWrite: falseallowExec: falseフラグを確認してください。

Step 4:CI/CDパイプラインのVitest設定の確認

GitHub Actions・Jenkins・CircleCI等でVitestをネットワーク公開している設定がないかを確認してください。CI環境は外部からのアクセスがない場合が多いですが、マルチテナント環境や内部ネットワークへのアクセスが可能な攻撃者にとってはリスクになります。


新設されたセキュリティ設定

今回のアップデートでVitestに新しいセキュリティ設定が追加されました。

allowWrite:書き込み操作(ファイルの作成・変更)を許可するかどうかを制御します。APIサーバーがlocalhost以外のホストにバインドされている場合、デフォルトで無効化されます。

allowExec:コード実行操作を許可するかどうかを制御します。同様にネットワーク公開時はデフォルトで無効化されます。

これらのフラグが無効の場合、Vitest UIはブラウザ内のコード編集とテストファイルの実行がオフになる「読み取り専用モード」で動作します。


FAQ

Q. デフォルト設定のVitestを使っている場合は影響を受けますか? A. 影響が大幅に限定されます。VitestのUIサーバーはデフォルトでlocalhost(127.0.0.1)のみにバインドされます。この設定の場合、CVE-2026-47429(パストラバーサル)やCDP経由RCEは外部から直接到達できません。ただしCVE-2026-47428(スクリプトインジェクション)は、localhostで動作中のVitestに対して攻撃者が細工したURLにユーザーをアクセスさせることで悪用できる可能性があります。いずれにせよ、アップデートを実施することを強く推奨します。

Q. npm auditでこの脆弱性が表示されますか? A. はい、影響を受けるバージョンのvitestまたは@vitest/browserを使用している場合、npm auditでアラートが表示されます。ただしCDP経由RCEはCVEが未採番のため、アドバイザリIDであるGHSA-g8mr-85jm-7xhmで検索してください。

Q. 本番環境のサーバーは影響を受けますか? A. VitestはJavaScriptのユニットテストフレームワークであり、本番環境に含まれることは通常ありません。影響を受けるのは開発者の作業環境(ローカルマシン)・CI/CDパイプライン・チーム共有のテスト環境です。本番サーバーへの直接的な影響はありませんが、CI/CDパイプラインへの侵入はサプライチェーン攻撃のエントリポイントになり得ます。

Q. Jestを使っている場合も影響を受けますか? A. Jestは今回の脆弱性とは無関係です。VitestはJestとAPI互換性を持ちますが、内部実装は別物であり今回の脆弱性もVitest固有のものです。


参考情報