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
CVE-2026-38360 — Advisory: CVE-2026-38360 path traversal (CWE-22) no dash-uploader (Python/PyPI) | Kitploit
Ferramentas/GitHubGitHub/a1ohadance/cve-2026-38360
Análise de VulnerabilidadesAnálise de CódigoExploraçãoSegurança WebTestes de PenetraçãoAprendizado e Educação
GitHuba1ohadance/cve-2026-38360

CVE-2026-38360

Advisory: CVE-2026-38360 path traversal (CWE-22) no dash-uploader (Python/PyPI)

Ver Repositório
23há 4 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-38360: Path Traversal no dash-uploader

CVE NVD CWE Severity Patch Auth Version PyPI Downloads

Total Downloads
License

Path traversal não autenticado em fohrloop/dash-uploader (Python, PyPI) permitindo escrita arbitrária de arquivos, levando a (mas não se limitando a) Execução Remota de Código (RCE), sobrescrita de código fonte da aplicação, XSS armazenado e instalação persistente de backdoor.

⚠️ Nenhum patch está disponível, e nenhum será lançado

O repositório foi arquivado em 2025-07-19 sem mantenedor ativo. Todas as versões publicadas (0.1.0 até 0.7.0a2) são afetadas e continuarão assim. O pacote ainda tem aproximadamente 28.000 downloads mensais.

Qualquer um que execute dash-uploader em produção deve aplicar uma mitigação por conta própria. A correção recomendada é migrar para o componente dcc.Upload embutido do Plotly Dash. Veja Mitigação para opções completas.

ID CVECVE-2026-38360 (NVD)
VulnerabilidadePath Traversal (CWE-22)
CVSS 3.19.8 / Crítico (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
Produtodash-uploader
Versões afetadas0.1.0 até 0.7.0a2 (todas as 18 versões)
Versão corrigidanenhuma (projeto arquivado em 2025-07-19)
Vetor de ataqueRemoto, não autenticado
DescobridorMuhammad Fitri Bin Mohd Sultan
Atribuído porMITRE, 2026-05-07
RelacionadoCVE-2026-38361 (DoS na mesma biblioteca)

Descrição

Três parâmetros controlados pelo usuário de request.form.get() em dash_uploader/httprequesthandler.py são passados diretamente para os.path.join() e os.makedirs() sem qualquer saneamento ou validação:

  1. upload_id (linha 57 → linha 161, BaseHttpRequestHandler.get_temp_root): controla o diretório de destino. Um atacante pode enviar upload_id=../../../../usr/local/lib/python3.10/site-packages e os arquivos são escritos no diretório de pacotes do Python.

  2. resumableFilename (linha 51 → linha 108, BaseHttpRequestHandler._post): controla o nome final do arquivo. Um atacante pode atravessar para fora do diretório de upload através do nome do arquivo mesmo com um upload_id legítimo.

  3. resumableIdentifier (linha 54 → linha 64, BaseHttpRequestHandler._post): usado com os.makedirs() para criar o diretório temporário. Um atacante pode criar diretórios arbitrários em qualquer lugar do sistema de arquivos.

O endpoint de upload (/API/dash-uploader por padrão) não requer autenticação. O hook http_request_handler adicionado na v0.5.0 permite verificações pré-requisição via post_before(), mas o método vulnerável _post() lê todos os parâmetros diretamente de request.form após o hook retornar. O hook não pode sanear parâmetros antes da biblioteca processá-los. Um desenvolvedor que adiciona autenticação via hook ainda está vulnerável a path traversal de um usuário autenticado.

Código vulnerável

root@kitploit:~
# dash_uploader/httprequesthandler.py
def _post(self):
    resumableFilename = request.form.get("resumableFilename", default="error", type=str)
    resumableIdentifier = request.form.get("resumableIdentifier", default="error", type=str)
    upload_id = request.form.get("upload_id", default="", type=str)
    ...
    temp_root = self.get_temp_root(upload_id)                          # upload_id flows in here
    temp_dir = os.path.join(temp_root, resumableIdentifier)            # raw user input -> os.path.join
    if not os.path.isdir(temp_dir):
        os.makedirs(temp_dir)                                          # raw user input -> os.makedirs

def get_temp_root(self, upload_id):
    return os.path.join(self.upload_folder, upload_id)                 # no sanitization: ../../ escapes upload_folder

Três sinks de traversal independentes compartilham a mesma causa raiz: valores do formulário chegam a os.path.join e os.makedirs sem validação.

Vetores de ataque

Um atacante remoto não autenticado envia uma requisição HTTP POST multipart para o endpoint de upload. Ao injetar sequências de path traversal (../) no parâmetro de formulário upload_id, o atacante controla o diretório de destino do arquivo enviado. Por exemplo, upload_id=../../../../usr/local/lib/python3.10/site-packages escreve arquivos no diretório de pacotes do Python, permitindo RCE na próxima inicialização do interpretador via auto-execução de .pth.

Nenhuma autenticação, token de sessão ou token CSRF é necessário. Dois parâmetros adicionais (resumableFilename e resumableIdentifier) fornecem vetores de traversal independentes através do mesmo endpoint. A configuração padrão da biblioteca conforme mostrado na documentação oficial de início rápido é explorável com um único comando curl.

Impacto

Escrita arbitrária de arquivos em qualquer diretório gravável pelo processo do servidor. Isso se traduz em Execução Remota de Código (RCE) através de várias primitivas conhecidas:

Primitivas RCE

  • Arquivo Python .pth colocado em site-packages. Executa código fornecido pelo atacante na próxima inicialização do interpretador.
  • Injeção de sitecustomize.py ou usercustomize.py. Executa em toda inicialização do Python.
  • Sobrescrita de um módulo Python importável no diretório de pacotes da aplicação. Executa na próxima importação ou reciclagem de worker.
  • Sobrescrita do ponto de entrada WSGI/ASGI (ex.: app.wsgi, wsgi.py). Executa na próxima recarga de worker.
  • Drop-in no Cron (/etc/cron.d/, /etc/cron.hourly/, spool de crontab do usuário) quando o processo tem os privilégios necessários. Execução agendada.
  • Drop-in de unit systemd ou unit de usuário (/etc/systemd/system/, ~/.config/systemd/user/). Executa na próxima inicialização do serviço ou reinicialização.
  • Injeção de /etc/ld.so.preload quando o processo é executado como root. Pré-carrega código do atacante em toda execução binária subsequente.
  • Sobrescrita de arquivo de inicialização do shell (~/.bashrc, ~/.profile, ~/.bash_profile). Executa no próximo login interativo do usuário da aplicação.
  • Anexo a ~/.ssh/authorized_keys. Concede acesso SSH persistente ao host como o usuário da aplicação.

Impacto na camada web

  • XSS armazenado no domínio do host ao sobrescrever JavaScript servido (por exemplo, JS do framework Dash em site-packages), afetando todos os usuários em cada carregamento de página até que a aplicação seja reiniciada
  • Sobrescrita de código fonte da aplicação (um backdoor silencioso e persistente que sobrevive a deploys normais quando o mecanismo de deploy não sobrescreve completamente os caminhos afetados)

Impacto no sistema de arquivos

  • Criação arbitrária de diretórios em qualquer lugar que o processo possa alcançar, via os.makedirs() com o parâmetro resumableIdentifier não saneado (utilizável para exaustão de inodes ou para preparar escritas em árvores de diretórios inexistentes)
  • Substituição de arquivos entre usuários em diretórios de upload compartilhados, levando a envenenamento de dados entre inquilinos da mesma aplicação

Componente afetado

  • dash_uploader/httprequesthandler.py
  • BaseHttpRequestHandler.get_temp_root()
  • BaseHttpRequestHandler._post()

Mitigação

⚠️ Nenhum patch está disponível, e o projeto está arquivado

Opções para usuários atualmente implantados, em ordem de preferência:

  1. Migre para dcc.Upload, o componente de upload oficial enviado com Plotly Dash. Os arquivos chegam no callback como uma string base64; nenhum manipulador de escrita no sistema de arquivos é exposto e nenhum caminho de destino controlado pelo cliente existe, então a classe de bug aqui não se aplica. Mais adequado para arquivos pequenos e médios. Para uploads muito grandes, veja o item 2.
  2. Crie um pequeno manipulador de upload Flask usando werkzeug.utils.secure_filename() e um diretório de destino hardcoded no servidor. Nunca aceite valores de upload_id, nome de arquivo ou identificador fornecidos pelo cliente como componentes de caminho.
  3. Se continuar a usar dash-uploader, coloque o endpoint de upload atrás de autenticação E valide upload_id, resumableFilename e resumableIdentifier contra uma lista de permissões estrita (por exemplo, apenas UUIDs) em uma camada que reescreva ou rejeite a requisição antes que o manipulador da biblioteca a veja. O hook http_request_handler da biblioteca NÃO impede o traversal porque os parâmetros são lidos de request.form após o hook retornar; o saneamento deve acontecer acima da biblioteca.
  4. Na camada de proxy reverso ou WAF, rejeite qualquer requisição ao endpoint de upload onde qualquer campo de formulário contenha .., variantes codificadas (%2e%2e, ..%2f, %2e%2e%2f) ou caminhos absolutos.

Cronograma de divulgação

DataEvento
2026-03-17Vulnerabilidade descoberta durante pesquisa de segurança em uma implantação de produção.
2026-03-19Solicitação de CVE submetida ao MITRE.
2026-05-07CVE-2026-38360 atribuído pelo MITRE.
2026-05-07Aviso público publicado.
2026-05-09Registro CVE publicado no banco de dados CVE do MITRE e no NVD.

Contexto do pacote

  • Aproximadamente 28.000 downloads mensais no PyPI (27.756 nos 30 dias anteriores a 2026-05-07, com volume diário sustentado apesar do arquivamento do repositório). Fonte: pypistats.org.
  • Última versão publicada: 0.6.1 (linha estável). Pré-lançamentos estendem-se a 0.7.0a2.
  • Dependência necessária: dash. Dependência opcional: pyyaml. Licença: MIT.
  • 11 pacotes dependentes, 6 repositórios dependentes.
  • 153 estrelas no GitHub.
  • Repositório arquivado em 2025-07-19 (Issue #153).
  • Nenhum CVE anterior (verificado contra NVD, GitHub Advisory Database, Snyk, OSV em 2026-03-19).

Referências

  • https://www.cve.org/CVERecord?id=CVE-2026-38360
  • https://nvd.nist.gov/vuln/detail/CVE-2026-38360
  • https://github.com/fohrloop/dash-uploader
  • https://pypi.org/project/dash-uploader/
  • https://pypistats.org/packages/dash-uploader
  • https://github.com/fohrloop/dash-uploader/blob/stable/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/blob/dev/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/issues/153
  • https://cwe.mitre.org/data/definitions/22.html

Descobridor

Muhammad Fitri Bin Mohd Sultan

Baixar ferramenta