Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-33936 — Vulnerabilidad de denegación de servicio en ecdsa (PyPI) | Kitploit
Herramientas/GitHubGitHub/0xmrma/cve-2026-33936
Análisis de VulnerabilidadesAnálisis de CódigoCriptografíaPapers e InvestigaciónAprendizaje y Educación
GitHub0xmrma/cve-2026-33936

CVE-2026-33936

Vulnerabilidad de denegación de servicio en ecdsa (PyPI)

Ver Repositorio
122hace 6 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-33936

Vulnerabilidad de denegación de servicio en ecdsa (PyPI)

Introducción

Identifiqué y divulgué de forma responsable una vulnerabilidad de severidad Moderada en python-ecdsa, una biblioteca de criptografía de Python ampliamente utilizada con 47,8 millones de descargas en el último mes.

Encontré este problema mientras revisaba python-ecdsa con una pregunta muy concreta en mente:

¿Qué ocurre si un DER malformado miente sobre su longitud y el analizador se fía demasiado de ella?

En este caso, esa pregunta condujo a un error real.

Las funciones auxiliares de análisis DER en ecdsa.der aceptaban datos truncados en casos donde la longitud codificada declaraba más bytes de los que realmente estaban presentes. Esa entrada malformada debería haberse rechazado de inmediato. En su lugar, podía pasar a mayor profundidad en la lógica de análisis y, finalmente, desencadenar un IndexError interno durante el análisis de claves.

Ese problema se convirtió en CVE-2026-33936.

Proyecto: python-ecdsa en GitHub
Paquete: ecdsa (pip)
CVE: CVE-2026-33936

photo0

Cadena 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


Qué Hace python-ecdsa

python-ecdsa es una biblioteca de Python ampliamente utilizada para criptografía de curva elíptica.

Entre otras cosas, se encarga de:

  • análisis de claves
  • serialización de claves
  • decodificación DER/ASN.1
  • flujos de trabajo de firma y verificación

Eso significa que su código de análisis se sitúa directamente en un límite de seguridad.

Siempre que una biblioteca acepta material de claves suministrado externamente o entrada binaria estructurada, la corrección no es solo una cuestión de calidad. Es una propiedad de seguridad.

Si se acepta una entrada malformada cuando debería rechazarse, el código posterior empieza a hacer suposiciones sobre un estado inválido. Ahí es donde los errores dejan de ser «solo equivocaciones de análisis» y empiezan a convertirse en vulnerabilidades.


Por Qué Esta Superficie Merecía la Pena Examinarse

El análisis DER es una de esas áreas donde los pequeños errores de validación pueden tener efectos desproporcionados.

La clase de error es sencilla:

  • el campo de longitud dice una cosa
  • el búfer real contiene algo más corto
  • el analizador se fía demasiado de esa afirmación
  • el código posterior opera sobre un estado que nunca debería haber existido

Ese es exactamente el tipo de fallo de límite que merece la pena comprobar en una revisión de seguridad.

No estaba buscando comportamientos criptográficos extraños aquí. Buscaba fallos de confianza en el manejo de entradas estructuradas.

Ese era el lugar adecuado para mirar.


Causa Raíz

El problema raíz fue la validación inadecuada de los campos de longitud DER al analizar entradas malformadas o truncadas.

En concreto, ecdsa.der.remove_octet_string() aceptaba entradas donde la longitud DER declarada superaba el número de bytes realmente disponibles en el búfer.

Así, en lugar de rechazar el DER malformado como este:

  • longitud declarada: 4096
  • bytes restantes reales: 3

la función auxiliar lo aceptaba y devolvía contenido truncado como si fuera válido.

Eso ya es un error.

Pero el impacto más fuerte se manifestaba más adelante.

Debido a que la entrada malformada se aceptaba en lugar de rechazarse en el límite, SigningKey.from_der() podía alcanzar más tarde una ruta de excepción interna y lanzar:

IndexError: index out of bounds on dimension 1

Eso importa porque no es el tipo de fallo que un llamador espera de una entrada malformada. El comportamiento correcto es un rechazo limpio de análisis, como UnexpectedDER o ValueError.

Por lo tanto, la vulnerabilidad no era «existe IndexError» de forma aislada.

La vulnerabilidad real era esta:

  • los campos de longitud DER malformados no se validaban correctamente
  • la entrada truncada cruzaba el límite de análisis
  • el código posterior alcanzaba una ruta de excepción interna como consecuencia

Eso es una sola cadena de errores, no dos problemas no relacionados.


Por Qué Esto Es un Problema de Seguridad, No Solo una Mala Higiene de Análisis

Que un analizador rechace entrada malformada no es una mejora cosmética. Es parte del modelo de seguridad.

La distinción importante aquí no es si la entrada era inválida. Por supuesto que era inválida.

La distinción importante es cómo se comportó la biblioteca ante una entrada inválida.

Hay una diferencia real entre:

  • rechazar el DER malformado limpiamente en el límite, y
  • aceptar el DER malformado, continuar a mayor profundidad y fallar con una excepción interna

Lo primero es un comportamiento robusto.

Lo segundo crea riesgo a nivel de aplicación si el software analiza DER no confiable y asume que los fallos de la biblioteca se mantienen dentro de los tipos de excepción esperados.

Por eso esto se clasificó adecuadamente como una vulnerabilidad y no meramente como un error de calidad del analizador.


Prueba de Concepto

Usé dos PoCs porque demostraban dos partes diferentes de la misma cadena de errores.

PoC 1: DER truncado aceptado

El primer PoC mostró que remove_octet_string() aceptaba DER truncado cuya longitud declarada superaba el búfer disponible.

Eso estableció el fallo de validación central:

  • el búfer era más corto que la longitud codificada
  • la función auxiliar debería haberlo rechazado
  • no lo hizo

PoC 2: ruta de excepción interna determinista

El segundo PoC mostró el efecto posterior más importante: el DER malformado suministrado a SigningKey.from_der() desencadenaba de forma determinista un IndexError interno antes de la corrección.

Eso estableció el impacto relevante para la seguridad:

  • la entrada malformada cruzó el límite
  • el análisis continuó demasiado lejos
  • el código de la biblioteca lanzó una excepción interna en lugar de un error de análisis limpio

Ese es un resultado mucho más sólido que «el analizador aceptó bytes raros».

Muestra un fallo de límite más una consecuencia operativa real.


Por Qué Se Eligieron los PoCs de Esta Manera

El primer PoC prueba la causa raíz.

El segundo PoC prueba el impacto.

Esa división importa.

Muchos informes se detienen en:

«este analizador acepta datos malformados».

Eso es útil, pero no siempre es suficiente para mostrar por qué el error importa.

En este caso, el informe más sólido fue:

  • el DER malformado se acepta incorrectamente
  • esa aceptación no es autocontenida
  • puede propagarse a una ruta de excepción interna con caídas durante el análisis de claves

Eso hace que la historia de seguridad sea mucho más clara.


Análisis de la Corrección

La corrección fue mínima y acertada.

El parche añadió la misma regla de seguridad faltante que ya se usaba en remove_sequence():

la longitud declarada debe caber dentro del búfer disponible

Esa comprobación se aplicó a:

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

Una vez añadidas esas comprobaciones de límites, el DER malformado/truncado se rechazaba de inmediato con:

UnexpectedDER: Length longer than the provided buffer

Y el PoC que anteriormente desencadenaba IndexError ya no alcanzaba la ruta de excepción interna. Fallaba limpiamente durante el análisis, que es exactamente lo que debería haber ocurrido desde el principio.

Este es el tipo de corrección que quieres ver en una vulnerabilidad de analizador:

Descargar herramienta