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-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
14há 5 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:

root@kitploit:~
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:

root@kitploit:~
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

Também adicionei testes de regressão focados para garantir que essa classe exata de DER malformado continue sendo rejeitada.

Os novos testes cobrem a rejeição de comprimento truncado para:

  • remove_octet_string
  • remove_constructed
  • remove_implicit

Isso foi importante porque o bug não era sobre um caminho de execução estranho. Era sobre uma regra de validação que precisava se manter consistente entre os auxiliares DER relacionados.

Depois que a correção e os testes foram adicionados, toda a suíte passou localmente:

root@kitploit:~
python -m pytest -q
# 2018 passed, 5 skipped

Isso importa no trabalho real de divulgação.

Uma correção é muito mais forte quando vem acompanhada de testes que fixam a fronteira.


Severidade e Classificação

Esta vulnerabilidade foi razoavelmente classificada como Moderada.

O impacto principal aqui é disponibilidade / robustez, não confidencialidade ou integridade.

A classificação do aviso foi:

  • CWE-20: Validação Incorreta de Entrada
  • CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L

Isso faz sentido.

A alegação não é que DER malformado permite que um atacante execute código. A alegação é que DER malformado poderia acionar exceções internas inesperadas em software que analisa material DER não confiável usando esta biblioteca.

Esse é um bug de análise real e defensável, no estilo DoS.


Divulgação

Este problema foi relatado de forma privada por meio do GitHub Security Advisories.

O relatório incluía:

  • o bug de validação
  • um reprodutor determinístico de IndexError a jusante
  • um patch mínimo
  • testes de regressão
  • resultados de verificação local

O mantenedor validou o problema, solicitou que a correção fosse acompanhada de testes unitários, e a correção coordenada prosseguiu pelo fluxo de trabalho do fork privado temporário do GHSA.

Durante o processo do CVE, o GitHub inicialmente recusou a atribuição porque o texto do aviso parecia descrever mais de uma vulnerabilidade. O esclarecimento foi simples:

tratava-se de uma vulnerabilidade única com uma única causa raiz — validação incorreta do comprimento DER — e o IndexError em SigningKey.from_der() era uma consequência a jusante dessa mesma aceitação de entrada malformada, não um problema separado e independentemente corrigível.

Esse esclarecimento foi suficiente, e o problema foi atribuído:

CVE-2026-33936


O Que Este Bug Realmente Ensina

A lição aqui não é “DER é complicado”.

Todo mundo já sabe que DER é complicado.

A lição real é esta:

a entrada estruturada malformada deve ser rejeitada exatamente no ponto em que o parser sabe que ela é inválida.

Se você errar essa fronteira, o código posterior acaba operando com suposições que não são mais confiáveis.

É assim que erros de análise de baixo nível se tornam problemas de segurança.

Este bug também reforça algo importante sobre relatórios e triagem:

  • a causa raiz importa
  • o caminho de impacto importa
  • e conectar os dois de forma limpa importa ainda mais

“Entrada malformada aceita” foi o começo da história.

“Entrada malformada aceita, e depois propagada para um caminho de exceção interno durante a análise de chaves” foi a história completa.

Essa distinção ajudou a apresentar o caso de forma clara e correta.


Pontos-Chave

  • parsers DER são fronteiras de segurança
  • campos de comprimento malformados devem ser validados contra o buffer real
  • aceitar entrada estruturada truncada já é um bug
  • isso se torna uma vulnerabilidade mais forte quando a análise a jusante alcança caminhos de exceção internos
  • a rejeição limpa na análise faz parte do comportamento seguro
  • correções mínimas de validação mais testes de regressão são exatamente o que você quer na correção de bugs de parser

Considerações Finais

Esta vulnerabilidade não era sobre criptografia exótica.

Era sobre um parser confiando em entrada malformada por mais tempo do que deveria.

Um campo de comprimento DER truncado cruzou a fronteira, passou pela validação quando deveria ter sido rejeitado e, eventualmente, causou travamentos na análise de chaves.

É por isso que isso se tornou CVE-2026-33936.

Corrigido ao aplicar verificações adequadas de limites de comprimento DER nos parsers auxiliares afetados.

photo0
Baixar ferramenta