Skip to content
KitploitKITPLOIT
FerramentasBlog
Log in
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-33936 — Vulnerabilidade de Negação de Serviço em ecdsa (PyPI) | Kitploit
Ferramentas/GitHubGitHub/0xmrma/cve-2026-33936
Análise de VulnerabilidadesAnálise de CódigoCriptografiaPapers e PesquisaAprendizado e Educação
GitHub0xmrma/cve-2026-33936

CVE-2026-33936

Vulnerabilidade de Negação de Serviço em ecdsa (PyPI)

Ver Repositório
111há 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-33936

Vulnerabilidade de Negação de Serviço em ecdsa (PyPI)

Introdução

Identifiquei e divulguei de forma responsável uma vulnerabilidade de severidade Moderada no python-ecdsa, uma biblioteca de criptografia Python amplamente utilizada, com 47,8 milhões de downloads no último mês.

Encontrei este problema ao revisar o python-ecdsa com uma pergunta muito específica em mente:

O que acontece se um DER malformado mentir sobre seu comprimento e o parser confiar nele além do devido?

Nesse caso, essa pergunta levou a um bug real.

Os auxiliares de análise DER em ecdsa.der aceitavam dados truncados nos casos em que o comprimento codificado declarava mais bytes do que os realmente presentes. Essa entrada malformada deveria ter sido rejeitada imediatamente. Em vez disso, ela podia avançar mais fundo na lógica de análise e, eventualmente, acionar um IndexError interno durante a análise de chaves.

Esse problema se tornou CVE-2026-33936.

Projeto: python-ecdsa no GitHub
Pacote: ecdsa (pip)
CVE: CVE-2026-33936

photo0

Cadeia de Ataque

attacker-controlled malformed DER → truncated length accepted as valid → parser continues past trust boundary → SigningKey.from_der() reaches internal exception path → unexpected IndexError / application-level DoS risk


O Que o python-ecdsa Faz

python-ecdsa é uma biblioteca Python amplamente utilizada para criptografia de curva elíptica.

Entre outras coisas, ela lida com:

  • análise de chaves
  • serialização de chaves
  • decodificação DER/ASN.1
  • fluxos de assinatura e verificação

Isso significa que seu código de análise fica diretamente sobre uma fronteira de segurança.

Sempre que uma biblioteca aceita material de chave fornecido externamente ou entrada binária estruturada, a correção não é apenas uma questão de qualidade. É uma propriedade de segurança.

Se uma entrada malformada é aceita quando deveria ser rejeitada, o código a jusante começa a fazer suposições sobre um estado inválido. É aí que os bugs deixam de ser “apenas erros de análise” e começam a se tornar vulnerabilidades.


Por Que Essa Superfície Merecia Ser Examinada

A análise DER é uma daquelas áreas em que pequenos erros de validação podem ter efeitos desproporcionais.

A classe de bug é direta:

  • o campo de comprimento diz uma coisa
  • o buffer real contém algo mais curto
  • o parser confia demais na declaração
  • o código posterior opera sobre um estado que nunca deveria ter existido

Esse é exatamente o tipo de falha de fronteira que vale a pena verificar em uma revisão de segurança.

Eu não estava procurando um comportamento criptográfico estranho aqui. Eu estava procurando falhas de confiança no tratamento de entradas estruturadas.

Esse era o lugar certo para procurar.


Causa Raiz

O problema raiz era a validação inadequada dos campos de comprimento DER ao analisar entradas malformadas ou truncadas.

Especificamente, ecdsa.der.remove_octet_string() aceitava entradas em que o comprimento DER declarado excedia o número de bytes realmente disponíveis no buffer.

Então, em vez de rejeitar um DER malformado como este:

  • comprimento declarado: 4096
  • bytes reais restantes: 3

o auxiliar aceitava a entrada e retornava o conteúdo truncado como se fosse válido.

Isso já é um bug.

Mas o impacto mais forte aparecia a jusante.

Como a entrada malformada era aceita em vez de rejeitada na fronteira, SigningKey.from_der() podia mais tarde alcançar um caminho de exceção interno e lançar:

IndexError: index out of bounds on dimension 1

Isso é relevante porque não é o tipo de falha que um chamador espera de uma entrada malformada. O comportamento correto é uma rejeição limpa de análise, como UnexpectedDER ou ValueError.

Portanto, a vulnerabilidade não era “IndexError existe” isoladamente.

A vulnerabilidade real era esta:

  • os campos de comprimento DER malformados não eram validados corretamente
  • a entrada truncada cruzava a fronteira de análise
  • o código a jusante atingia um caminho de exceção interno como consequência

Isso é uma única cadeia de bug, não dois problemas não relacionados.


Por Que Isso É um Problema de Segurança, Não Apenas Falta de Higiene na Análise

Um parser rejeitar uma entrada malformada não é uma melhoria cosmética. É parte do modelo de segurança.

A distinção importante aqui não é se a entrada era inválida. É claro que era inválida.

A distinção importante é como a biblioteca se comportou diante de uma entrada inválida.

Há uma diferença real entre:

  • rejeitar DER malformado de forma limpa na fronteira, e
  • aceitar DER malformado, avançar mais fundo e travar com uma exceção interna

O primeiro é um comportamento robusto.

O segundo cria risco no nível da aplicação se o software analisa DER não confiável e presume que as falhas da biblioteca permanecem dentro dos tipos de exceção esperados.

É por isso que isso foi corretamente classificado como uma vulnerabilidade, em vez de meramente um bug de qualidade de parser.


Prova de Conceito

Usei duas PoCs porque elas demonstraram duas partes diferentes da mesma cadeia de bug.

PoC 1: DER truncado aceito

A primeira PoC mostrou que remove_octet_string() aceitava DER truncado cujo comprimento declarado excedia o buffer disponível.

Isso estabeleceu a falha central de validação:

  • o buffer era mais curto que o comprimento codificado
  • o auxiliar deveria ter rejeitado a entrada
  • não rejeitou

PoC 2: caminho de exceção interno determinístico

A segunda PoC mostrou o efeito a jusante mais importante: DER malformado fornecido a SigningKey.from_der() acionava deterministicamente um IndexError interno antes da correção.

Isso estabeleceu o impacto relevante para a segurança:

  • a entrada malformada cruzou a fronteira
  • a análise avançou além do devido
  • o código da biblioteca levantou uma exceção interna em vez de um erro de análise limpo

Esse é um resultado muito mais forte do que “o parser aceitou bytes estranhos”.

Mostra uma falha de fronteira além de uma consequência operacional real.


Por Que as PoCs Foram Escolhidas Dessa Forma

A primeira PoC prova a causa raiz.

A segunda PoC prova o impacto.

Essa divisão é importante.

Muitos relatórios param em:

“este parser aceita dados malformados.”

Isso é útil, mas nem sempre suficiente para mostrar por que o bug é importante.

Neste caso, o relatório mais forte era:

  • DER malformado é aceito indevidamente
  • essa aceitação não é autocontida
  • ela pode se propagar para um caminho de exceção interno que gera travamentos na análise de chaves

Isso torna a narrativa de segurança muito mais clara.


Análise da Correção

A correção foi mínima e correta.

O patch adicionou a mesma regra de segurança ausente já usada em remove_sequence():

o comprimento declarado deve caber no buffer disponível

Essa verificação foi aplicada a:

  • remove_constructed()
  • remove_implicit()
  • remove_octet_string()

Assim que essas verificações de limites foram adicionadas, DER malformado/truncado era rejeitado imediatamente com:

UnexpectedDER: Length longer than the provided buffer

E a PoC que anteriormente acionava IndexError não alcançava mais o caminho de exceção interno. Ela falhava de forma limpa durante a análise, que é exatamente o que deveria ter acontecido desde o início.

Este é o tipo de correção que você quer ver em uma vulnerabilidade de parser:

  • estreita
  • explícita
  • diretamente ligada à fronteira de confiança
  • fácil de entender
  • reforçada com cobertura de testes de regressão

Sem redesenho. Sem ambiguidade. Apenas validação correta onde ela estava ausente.


Testes de Regressão

Baixar ferramenta