Skip to content
KitploitKITPLOIT
FerramentasExploitsBlog
Log in
Enviar
FerramentasExploitsBlog
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
CVE-2026-65320-fastcore — Documenta o CVE-2026-65320, uma travessia de caminho tar-slip em untar_dir() do fastcore, com uma prova de conceito inofensiva que demonstra escrita arbitrária de arquivos e execução de código. | Kitploit
Ferramentas/GitHubGitHub/rahulreddykarne/cve-2026-65320-fastcore
Análise de VulnerabilidadesAnálise de CódigoExploraçãoExploração de Aplicações WebPapers e PesquisaAprendizado e Educação
GitHubrahulreddykarne/cve-2026-65320-fastcore

CVE-2026-65320-fastcore

Documenta o CVE-2026-65320, uma travessia de caminho tar-slip em untar_dir() do fastcore, com uma prova de conceito inofensiva que demonstra escrita arbitrária de arquivos e execução de código.

Ver Repositório
há 1 diaAinda não revisado

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

CVE-2026-65320: Path Traversal (Tar Slip) no fastcore via untar_dir()

Severidade: Crítica, CVSS 3.1 9.8

Vetor (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Afetado: fastcore <= 2.2.30

Corrigido em: Não corrigido no momento da redação

CWE: CWE-22 (Limitação Imprópria de um Nome de Caminho a um Diretório Restrito, 'Path Traversal')

Componente: fastcore.xtras.untar_dir() → fastcore.xtras._unpack() → shutil.unpack_archive()

Runtime de alto risco: Python < 3.14 (Python 3.14 torna o filtro tar data seguro o padrão)

Reportado por: Rahul Karne

CNA: VulnCheck


Resumo

fastcore.xtras.untar_dir(fname, dest) é um helper documentado que extrai um arquivo tar "para dentro de dest".

Internamente, ele entrega o arquivo à função shutil.unpack_archive() da biblioteca padrão sem um filtro de extração, sem validar os caminhos dos membros do arquivo e sem qualquer verificação de contenção pós-extração.

Como resultado, um arquivo TAR cujos membros contenham sequências de travessia ../ ou caminhos absolutos pode gravar arquivos fora do diretório no qual o chamador pediu ao fastcore para extrair.

Um chamador que razoavelmente espera que untar_dir(fname, dest) confine tudo a dest em vez disso obtém gravação arbitrária de arquivos em qualquer lugar onde o processo possa gravar.


Impacto

Gravação arbitrária de arquivos sob a autoridade do processo que chama untar_dir().

Dependendo do que for sobrescrito, isso pode resultar em:

  • Execução de código — sobrescrever um arquivo Python que a aplicação importa posteriormente, como um plugin, hook de inicialização ou módulo importável, ou colocar um arquivo em um local de carregamento automático.
  • Adulteração de dados / configuração — sobrescrever arquivos de configuração, credenciais ou dados da aplicação.
  • Negação de serviço — corromper arquivos dos quais o serviço depende.

A prova de conceito demonstra a cadeia completa gravação → importação → execução de código de ponta a ponta, inteiramente dentro de um diretório de demonstração inofensivo.


Alcance

fastcore é uma dependência fundamental em todo o ecossistema fast.ai, incluindo:

  • fastai
  • nbdev
  • ghapi
  • Outros pacotes relacionados

Ele recebe dezenas de milhões de downloads por mês.

untar_dir() é a primitiva de extração por trás do fluxo de trabalho comum "baixar um arquivo, depois descompactá-lo", que segue o mesmo padrão geral do untar_data do fastai.

Qualquer caminho de código que forneça a untar_dir() um arquivo cujo conteúdo não seja totalmente confiável está exposto.


Detalhe Técnico

O código vulnerável existe em fastcore/xtras.py:

root@kitploit:~
def _unpack(fname, out):
    import shutil
    shutil.unpack_archive(str(fname), str(out))   # <-- no filter, no validation
    ls = out.ls()
    return ls[0] if len(ls) == 1 else out


def untar_dir(fname, dest, rename=False, overwrite=False, uid=-1, gid=-1):
    "untar `file` into `dest` ..."
    import tempfile, shutil
    dest = Path(dest)

    with tempfile.TemporaryDirectory() as d:
        out = Path(d) / remove_suffix(Path(fname).stem, '.tar')
        out.mkdir()

        ...

        src = _unpack(fname, out)      # extraction escapes `out` here

        ...

        shutil.move(str(src), dest)

        ...

        return dest

untar_dir() cria um diretório temporário interno de extração:

root@kitploit:~
<tempdir>/<random>/<archive-stem>/

Em seguida, chama _unpack(), que encaminha o arquivo diretamente para:

root@kitploit:~
shutil.unpack_archive()

Para arquivos TAR, isso acaba chamando tarfile.extractall().

No Python < 3.14, o comportamento padrão de extração é fully_trusted, o que significa que membros com travessia podem ser aceitos.

Por exemplo, um membro de arquivo como:

root@kitploit:~
../../../some/other/dir/file

é gravado em relação ao diretório de extração e, portanto, pode escapar dele.

Nada no fastcore:

  • Passa filter="data" onde há suporte.
  • Rejeita caminhos absolutos.
  • Rejeita caminhos com letra de unidade.
  • Rejeita caminhos UNC.
  • Rejeita componentes de caminho ...
  • Rejeita membros de symlink ou hardlink.
  • Verifica se cada caminho extraído permaneceu sob a raiz de extração pretendida antes de retornar sucesso.

Causa Raiz

untar_dir() trata shutil.unpack_archive() como se fosse um extrator de arquivos seguro e isolado.

Ele não é.

A documentação da biblioteca padrão do Python alerta que extrair arquivos não confiáveis pode criar arquivos fora do destino solicitado e recomenda filtragem segura de extração para arquivos TAR.

O fastcore nem passa um filtro de extração apropriado nem implementa uma proteção de contenção equivalente para as versões do Python que suporta.

Ele também não alerta os chamadores de untar_dir() sobre esse comportamento sensível à segurança.


Por Que Especificamente o Caminho TAR

Membros TAR podem conter strings de caminho arbitrárias.

Em versões afetadas do Python, tarfile.extractall() não neutraliza automaticamente sequências de travessia .. por padrão.

Gravar um membro com travessia em relação ao diretório temporário de extração do fastcore é, portanto, suficiente para escapar desse diretório e gravar em qualquer lugar onde o processo tenha permissão de gravação.

Uma primitiva confiável é a travessia relativa como:

root@kitploit:~
../../../target/file

Esta é a técnica usada pela prova de conceito.


Entrega Pela Rede

A entrada perigosa é o conteúdo do arquivo, não o caminho de destino escolhido pelo desenvolvedor.

Arquivos são frequentemente obtidos de locais externos ou semiconfiáveis, incluindo:

  • Pacotes de modelos
  • Arquivos de conjuntos de dados
  • Pacotes de plugins
  • Artefatos de CI/CD
  • Uploads de usuários
  • Uploads de parceiros
  • Downloads HTTP remotos

Qualquer serviço ou ferramenta que baixe um arquivo de uma fonte não confiável ou semiconfiável e subsequentemente o processe usando untar_dir() pode, portanto, estar acessível.

A PoC também inclui uma variante que serve o arquivo manipulado a partir de um endpoint HTTP controlado pelo atacante para demonstrar esse caminho de entrega.


Pré-condições de Exploração

A exploração bem-sucedida requer:

  1. A aplicação chama fastcore.xtras.untar_dir() em um arquivo cujo conteúdo é influenciado pelo atacante, como um arquivo enviado, baixado ou de outra forma não confiável.

  2. O runtime usa Python < 3.14, ou outra configuração onde um filtro seguro de extração TAR não é aplicado.

  3. Para escalar de gravação arbitrária de arquivos para execução de código, o processo posteriormente importa ou carrega um arquivo de um local alcançável pela travessia, como:

    • Um diretório de plugins
    • Um módulo Python importável
    • Um hook de inicialização
    • Outro local de arquivo de carregamento automático

Gravação arbitrária de arquivos e modificação de configuração/dados requerem apenas as condições 1 e 2.


Prova de Conceito

poc_fastcore_cna_demo.py invoca a API real fastcore.xtras.untar_dir().

A demonstração é intencionalmente inofensiva.

Todo arquivo criado pela PoC permanece dentro de um único diretório de demonstração especificado usando:

root@kitploit:~
--demo-root

A PoC não modifica arquivos reais do sistema e não acessa serviços de nuvem ou credenciais.

O Que a PoC Faz

  1. Imprime os detalhes do ambiente e o código-fonte vulnerável de _unpack() e untar_dir().

  2. Cria um layout de demonstração contendo:

    • Uma raiz de extração pretendida
    • Um diretório de aplicação separado:
      root@kitploit:~
      service_app/plugins/
      
  3. Cria:

root@kitploit:~
attacker_supplied_upload.tar

contendo membros de arquivo projetados para apontar fora da raiz de extração pretendida, incluindo membros com travessia e:

root@kitploit:~
service_app/plugins/startup_hook.py
  1. Chama um manipulador de upload simulado:
root@kitploit:~
def auto_extract_uploaded_archive(received_archive):
    return untar_dir(
        received_archive,
        intended_root,
        overwrite=True
    )
  1. Verifica que arquivos foram gravados fora do diretório de extração pretendido.

  2. Simula uma recarga do serviço importando o arquivo gravado pelo arquivo:

root@kitploit:~
startup_hook.py

O hook de inicialização inofensivo cria:

root@kitploit:~
SERVICE_RELOAD_MARKER

Isso demonstra a cadeia completa:

root@kitploit:~
Attacker-controlled archive
        ↓
Path traversal during extraction
        ↓
Arbitrary file write
        ↓
Write into importable / auto-loaded location
        ↓
Application loads attacker-controlled file
        ↓
Code execution

Configuração

Instale o pacote afetado:

root@kitploit:~
pip install fastcore

O problema foi confirmado através de:

root@kitploit:~
fastcore 2.2.30

A demonstração pode ser executada contra:

  • Uma cópia do fastcore instalada via pip
  • Uma árvore de código-fonte extraída localmente selecionada usando --source

Todas as gravações da PoC permanecem dentro do diretório especificado através de --demo-root.


Execução

Limpe qualquer saída anterior da PoC:

root@kitploit:~
python poc_fastcore_cna_demo.py --demo-root ./poc_fastcore --clean

Execute a demonstração:

root@kitploit:~
python poc_fastcore_cna_demo.py \
  --demo-root ./poc_fastcore \
  --source latest \
  --no-pause

Saída Esperada

Exemplo de saída abreviada:

root@kitploit:~
fastcore version:  2.2.30

Outside marker exists after extraction? True
Is outside marker inside intended extraction root? False

Relative traversal marker exists after extraction? True
Is relative traversal marker inside intended extraction root? False

Service plugin file exists after extraction? True
Service reload marker exists? True

POC WORKED: fastcore extracted attacker-controlled tar members outside the intended root.

Remediação

Para os Mantenedores do fastcore

1. Use Filtragem Segura de Extração TAR

Em versões suportadas do Python, use um filtro de extração seguro como:

root@kitploit:~
filter="data"

com shutil.unpack_archive() ou a operação de extração tarfile correspondente.


2. Valide os Membros do Arquivo Antes da Extração

Cada membro do arquivo deve ser verificado antes da extração.

Rejeite:

  • Caminhos absolutos
  • Caminhos com letra de unidade do Windows
  • Caminhos UNC
  • Caminhos contendo ..
  • Links simbólicos inseguros
  • Hard links inseguros

Os destinos dos links também devem ser resolvidos e validados antes da extração.


3. Imponha Contenção de Extração

Resolva cada caminho de destino antes de gravar e verifique se ele permanece abaixo da raiz de extração pretendida.

Conceitualmente:

root@kitploit:~
resolved_member_path
        ↓
must remain inside
        ↓
resolved_extraction_root

A extração deve falhar se o destino resolvido escapar da raiz de extração.


4. Adicione Testes de Regressão

Os testes de regressão devem cobrir pelo menos:

root@kitploit:~
../ traversal
absolute paths
Windows drive-letter paths
UNC paths
symbolic links
hard links

5. Documente as Expectativas de Segurança

Documente claramente se untar_dir() tem a intenção de processar com segurança arquivos não confiáveis.

Se a extração insegura for intencionalmente suportada, o comportamento seguro ainda deve ser o padrão.

O comportamento inseguro deve exigir opt-in explícito em vez de confiar silenciosamente no conteúdo do arquivo.


Orientação Temporária para Usuários

Até que uma correção no nível do pacote seja lançada:

  • Prefira Python 3.14+ quando aplicável.
  • Não passe arquivos não confiáveis diretamente para untar_dir().
  • Valide todos os membros do arquivo antes da extração.
  • Garanta que os caminhos extraídos não possam escapar do diretório de destino pretendido.
  • Trate arquivos baixados remotamente ou fornecidos pelo usuário como entrada controlada pelo atacante.

Considerações sobre o CVSS

O defeito técnico subjacente é uma vulnerabilidade de gravação arbitrária de arquivos causada por travessia de caminho em arquivos.

No entanto, a severidade final depende do ambiente de implantação e de como untar_dir() é exposto.

Cenário de Serviço Voltado à Rede

Um vetor representativo pode se aproximar de:

root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Resultado:

root@kitploit:~
9.8 — Critical

Cenário de Desenvolvedor / CLI

Se a exploração em vez disso exigir que um desenvolvedor baixe e extraia manualmente um arquivo, a interação do usuário e a complexidade do ataque podem ser maiores.

A pontuação CVSS resultante seria, portanto, materialmente menor.


Ressalvas

Dois fatores importantes devem ser considerados ao avaliar o problema.

Classe de Vulnerabilidade Existente

Esta é uma instância da classe de vulnerabilidade de extração insegura de TAR conhecida há muito tempo, associada a:

root@kitploit:~
CVE-2007-4559

Versões modernas do Python introduziram comportamento mais seguro de extração de arquivos.

Python 3.14 torna o filtro de extração data seguro o padrão.

Portanto, o ambiente primário afetado é o Python < 3.14.

No entanto, esses runtimes permanecem amplamente implantados.

Requisito de Arquivo Não Confiável

A vulnerabilidade se torna explorável quando um chamador fornece a untar_dir() um arquivo cujo conteúdo é controlado pelo atacante ou de outra forma não confiável.

Este relatório, portanto, trata o conteúdo do arquivo como a fronteira de segurança não confiável.

Um helper robusto de extração de arquivos deve falhar com segurança independentemente de como o arquivo foi obtido.


Cronograma de Divulgação

Substitua as datas de placeholder abaixo pelas datas reais de divulgação.

  • YYYY-MM-DD — Vulnerabilidade reportada aos mantenedores.
  • YYYY-MM-DD — Resposta do fornecedor / confirmação / sem resposta.
  • 2026-09-26 — Confirmado ainda não corrigido na versão mais recente (2.2.30); o código de extração permaneceu inalterado.

Crédito

Descoberto e reportado por Rahul Karne.


Referências

  • Documentação de untar_dir() do fastcore
    https://fastcore.fast.ai/xtras.html

  • Código-fonte de xtras.py do fastcore
    https://github.com/AnswerDotAI/fastcore/blob/main/fastcore/xtras.py

  • fastcore no PyPI
    https://pypi.org/project/fastcore/

  • Documentação de shutil.unpack_archive() do Python
    https://docs.python.org/3/library/shutil.html#shutil.unpack_archive

  • Filtros de extração do tarfile do Python
    https://docs.python.org/3/library/tarfile.html#extraction-filters

  • PEP 706 — Filtro para tarfile.extractall
    https://peps.python.org/pep-0706/

  • CWE-22 — Limitação Imprópria de um Nome de Caminho a um Diretório Restrito
    https://cwe.mitre.org/data/definitions/22.html

  • CVE-2007-4559 — Classe de vulnerabilidade de extração insegura de TAR
    https://nvd.nist.gov/vuln/detail/CVE-2007-4559


Sobre

Este repositório documenta uma descoberta de segurança de divulgação coordenada e fornece uma prova de conceito inofensiva e autocontida.

A PoC grava apenas dentro do diretório --demo-root especificado pelo usuário e não realiza ações destrutivas.

Qualquer funcionalidade de rede incluída na demonstração é limitada a uma demonstração local opcional.

Este material é fornecido para pesquisa de segurança defensiva e fins educacionais.


Imprensa

Consultas da mídia: [email protected]. PoC completa (servidor do atacante, arquivo de travessia, aplicação vítima) e detalhes técnicos adicionais disponíveis sob solicitação.

Baixar ferramenta