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-38361 — Aviso: CVE-2026-38361 múltiplas vulnerabilidades de DoS (CWE-400/CWE-670) em dash-uploader (Python/PyPI) | Kitploit
Ferramentas/GitHubGitHub/a1ohadance/cve-2026-38361
Análise de VulnerabilidadesExploraçãoSegurança WebTestes de PenetraçãoAprendizado e Educação
GitHuba1ohadance/cve-2026-38361

CVE-2026-38361

Aviso: CVE-2026-38361 múltiplas vulnerabilidades de DoS (CWE-400/CWE-670) em dash-uploader (Python/PyPI)

Ver Repositório
1há 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-38361: Múltiplas Vulnerabilidades de DoS Não Autenticadas em dash-uploader

CVE NVD CWE-400 CWE-670 Severity Patch Auth Version

PyPI Downloads
Total Downloads
License

Múltiplos problemas de Negação de Serviço (DoS) não autenticados em fohrloop/dash-uploader (Python, PyPI), incluindo (mas não se limitando a) queda do processo por falta de memória (OOM), truncamento de arquivos para zero bytes, esgotamento permanente de disco e contorno completo do limite documentado de max_file_size. Caminhos adicionais de abuso de recursos existem através do mesmo conjunto de parâmetros não sanitizados.

⚠️ Não há patch 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 sendo. O pacote ainda registra cerca de 28.000 downloads mensais.

Qualquer pessoa que execute o 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 no Plotly Dash. Consulte Mitigação para conhecer todas as opções.

CVE IDCVE-2026-38361 (NVD)
VulnerabilidadeConsumo Descontrolado de Recursos (CWE-400), Implementação de Fluxo de Controle Sempre Incorreta (CWE-670)
CVSS 3.17.5 / Alta (AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/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-38360 (travessia de caminho na mesma biblioteca)

Descrição

O manipulador HTTP do dash-uploader aceita requisições POST não autenticadas com parâmetros controlados pelo atacante que fluem para alocação de memória, operações de arquivo e criação de diretórios, sem verificações de limites, sem limites de taxa e sem mecanismo de limpeza. Quatro problemas independentes no mesmo caminho de código:

1. Crash por OOM (verificado)

Verificado em um sistema com 7,7 GB: 5 requisições POST simultâneas com resumableTotalChunks=30000000 acionaram o OOM killer do Linux em 2 segundos. O log do kernel confirma:

root@kitploit:~
Out of memory: Killed process 24203 (python3) total-vm:8302276kB, anon-rss:7068012kB

Cada requisição aloca aproximadamente 2,9 GB por meio de uma list comprehension sobre range(1, resumableTotalChunks + 1). O processo do servidor é encerrado e a aplicação fica completamente indisponível até reinicialização manual.

2. Truncamento de arquivo (verificado)

Um arquivo contendo 42 bytes de dados foi reduzido a 0 bytes por meio de uma única requisição POST com resumableTotalChunks=0. A causa raiz é o all() do Python retornar True para iteráveis vazios, o que engana o manipulador de upload fazendo-o tratar zero partes como um upload concluído. O arquivo existente é excluído via os.unlink() e substituído por um arquivo vazio.

3. Acúmulo de uploads abandonados (verificado)

10 diretórios temporários órfãos com arquivos de partes foram criados e persistidos indefinidamente no disco. Uma busca em todo o código-fonte por cleanup, ttl, expire, garbage, purge, cron, schedule e periodic retornou zero resultados. A única chamada de limpeza (shutil.rmtree) é executada exclusivamente em uploads concluídos. Não há mecanismo para recuperar espaço em disco de sessões incompletas.

4. Contorno do max_file_size (verificado)

O servidor aceitou uma parte de 5 MB para um arquivo declarando resumableTotalSize=999999999999 (~999 GB) com HTTP 200. O parâmetro max_file_size é passado apenas para o componente React JavaScript. O servidor nunca verifica o tamanho do arquivo, o tamanho da parte, o Content-Length ou o MAX_CONTENT_LENGTH do Flask. Um desenvolvedor que defina max_file_size=10 não tem proteção no lado do servidor.

Código vulnerável

root@kitploit:~
# dash_uploader/httprequesthandler.py
def _post(self):
    resumableTotalChunks = request.form.get("resumableTotalChunks", type=int)   # attacker-controlled, no bounds
    ...
    chunk_paths = [
        os.path.join(temp_dir, get_chunk_name(resumableFilename, x))
        for x in range(1, resumableTotalChunks + 1)                              # unbounded; e.g. 30M -> ~2.9 GB -> OOM
    ]
    upload_complete = all([os.path.exists(p) for p in chunk_paths])              # all([]) is True -> truncation when chunks=0
    if upload_complete:
        target_file_name = os.path.join(temp_root, resumableFilename)
        if os.path.exists(target_file_name):
            os.unlink(target_file_name)                                          # existing file deleted
        with open(target_file_name, "ab") as target_file:
            for p in chunk_paths:                                                # empty list -> empty file written
                ...

O mesmo caminho de código produz tanto o OOM (resumableTotalChunks grande) quanto a primitiva de truncamento de arquivo (resumableTotalChunks=0).

Vetores de ataque

Um atacante envia requisições POST não autenticadas para o endpoint /API/resumable.

  • Crash por OOM: 5 requisições simultâneas com resumableTotalChunks=30000000 alocam ~2,9 GB cada, acionando o OOM killer.
  • Esgotamento de disco: iniciar uploads mas nunca concluí-los; arquivos temporários órfãos se acumulam para sempre.
  • Truncamento de arquivo: enviar resumableTotalChunks=0; o all([])=True do Python engana o servidor fazendo-o sobrescrever o arquivo alvo com conteúdo vazio.
  • Contorno de limite de tamanho: qualquer limite de tamanho definido pelo desenvolvedor é aplicado apenas no JavaScript do cliente, portanto uma requisição HTTP direta o contorna completamente.

Nenhuma autenticação ou privilégio é necessário.

Impacto

  • Crash do processo do servidor via OOM killer do Linux acionado por alocação de memória sem limites a partir de um único parâmetro POST controlado pelo usuário (resumableTotalChunks)
  • Esgotamento permanente de disco por meio de sessões de upload abandonadas que nunca são limpas (não existe TTL, coleta de lixo ou mecanismo de expiração no código-fonte)
  • Esgotamento de inodes do sistema de arquivos por meio da criação de diretórios com profundidade arbitrária através de os.makedirs() com resumableIdentifier não sanitizado
  • Destruição de dados por truncamento de arquivo para zero bytes causado pelo all() do Python retornando True para iteráveis vazios quando resumableTotalChunks=0
  • Contorno de todas as restrições de tamanho de arquivo porque max_file_size é aplicado apenas no JavaScript do lado do cliente, enquanto o manipulador do lado do servidor não realiza nenhuma validação de tamanho e nunca define o MAX_CONTENT_LENGTH do Flask

Componentes afetados

  • dash_uploader/httprequesthandler.py (método BaseHttpRequestHandler._post)
  • dash_uploader/upload.py (função Upload, parâmetro max_file_size)
  • dash_uploader/configure_upload.py (sem MAX_CONTENT_LENGTH)

Mitigação

⚠️ Não há patch disponível, e o projeto está arquivado

Opções para usuários com implantações atuais, em ordem de preferência:

  1. Migre para dcc.Upload, o componente oficial de upload distribuído com o Plotly Dash. Ele não possui parâmetro de contagem de partes, nenhum estado temporário em disco e respeita o MAX_CONTENT_LENGTH do Flask. Nenhum dos quatro problemas aqui se aplica. Mais adequado para arquivos pequenos e médios. Para uploads muito grandes, consulte o item 2.
  2. Crie um pequeno manipulador de upload em Flask com aplicação explícita de limite de tamanho por requisição (MAX_CONTENT_LENGTH), limites para qualquer contagem de partes fornecida pelo cliente e uma lista de permissões para nomes de arquivo aceitos.
  3. Se continuar usando o dash-uploader, defina o MAX_CONTENT_LENGTH do Flask no nível da aplicação (a biblioteca não o faz) e rejeite entradas no nível da aplicação ou do proxy reverso quando qualquer uma das seguintes condições for verdadeira:
    • resumableTotalChunks <= 0
    • resumableTotalChunks exceder um limite razoável (por exemplo, 10.000)
    • resumableTotalSize exceder o max_file_size configurado pelo desenvolvedor
  4. Adicione um limite de taxa no endpoint de upload na camada do proxy reverso ou WAF para mitigar o vetor de OOM por requisições concorrentes.
  5. Limpe periodicamente os diretórios temporários órfãos com uma tarefa cron externa, já que a biblioteca não possui limpeza interna.

Linha do tempo da divulgação

DataEvento
2026-03-19Vulnerabilidades descobertas durante pesquisa de segurança em uma implantação de produção.
2026-03-22Solicitação de CVE submetida à MITRE.
2026-05-07CVE-2026-38361 atribuído pela MITRE.
2026-05-07Aviso público publicado.
2026-05-09Registro do CVE publicado no banco de dados de CVEs da MITRE e na 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.
  • Versão publicada mais recente: 0.6.1 (linha estável). Pré-lançamentos vão até 0.7.0a2.
  • Dependência obrigató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 na NVD, no GitHub Advisory Database, na Snyk e no OSV em 2026-03-19).

Referências

  • https://www.cve.org/CVERecord?id=CVE-2026-38361
  • https://nvd.nist.gov/vuln/detail/CVE-2026-38361
  • https://github.com/fohrloop/dash-uploader
  • https://github.com/fohrloop/dash-uploader/blob/stable/dash_uploader/httprequesthandler.py
  • https://github.com/fohrloop/dash-uploader/issues/153
  • https://pypi.org/project/dash-uploader/
  • https://pypistats.org/packages/dash-uploader
  • https://libraries.io/pypi/dash-uploader
  • https://pepy.tech/project/dash-uploader
  • https://cwe.mitre.org/data/definitions/400.html
  • https://cwe.mitre.org/data/definitions/670.html
  • https://docs.python.org/3/library/functions.html#all

Descobridor

Muhammad Fitri Bin Mohd Sultan

Baixar ferramenta