Skip to content
KitploitKITPLOIT
StrumentiExploitsBlog
Log in
Invia
StrumentiExploitsBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
CVE-2026-33936 — Vulnerabilità di Denial of Service in ecdsa (PyPI) | Kitploit
Strumenti/GitHubGitHub/0xmrma/cve-2026-33936
Analisi delle VulnerabilitàAnalisi del CodiceCrittografiaPaper e RicercaApprendimento e Formazione
GitHub0xmrma/cve-2026-33936

CVE-2026-33936

Vulnerabilità di Denial of Service in ecdsa (PyPI)

Vedi Repository
1116 mesi faNon ancora revisionato

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

CVE-2026-33936

Vulnerabilità Denial of Service in ecdsa (PyPI)

Introduzione

Ho identificato e divulgato in modo responsabile una vulnerabilità di gravità Moderata in python-ecdsa, una libreria Python di crittografia ampiamente utilizzata con 47,8M di download nell'ultimo mese.

Ho trovato questo problema mentre esaminavo python-ecdsa con una domanda molto specifica in mente:

Cosa succede se un DER malformato mente sulla propria lunghezza e il parser si fida troppo?

In questo caso, quella domanda ha portato a un bug reale.

Gli helper di parsing DER in ecdsa.der accettavano dati troncati nei casi in cui la lunghezza codificata dichiarava più byte di quelli effettivamente presenti. Quel input malformato avrebbe dovuto essere rifiutato immediatamente. Invece, poteva passare più a fondo nella logica di parsing e alla fine innescare un IndexError interno durante il parsing delle chiavi.

Quel problema è diventato CVE-2026-33936.

Progetto: python-ecdsa su GitHub
Pacchetto: ecdsa (pip)
CVE: CVE-2026-33936

photo0

Catena dell'Attacco

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


Cosa Fa python-ecdsa

python-ecdsa è una libreria Python ampiamente utilizzata per la crittografia a curve ellittiche.

Tra le altre cose, gestisce:

  • parsing delle chiavi
  • serializzazione delle chiavi
  • decodifica DER/ASN.1
  • flussi di lavoro di firma e verifica

Ciò significa che il suo codice di parsing si trova direttamente su un confine di sicurezza.

Ogni volta che una libreria accetta materiale di chiave fornito esternamente o input binario strutturato, la correttezza non è solo una questione di qualità. È una proprietà di sicurezza.

Se un input malformato viene accettato quando dovrebbe essere rifiutato, il codice a valle inizia a fare assunzioni basate su uno stato non valido. È lì che i bug smettono di essere "semplici errori di parsing" e iniziano a diventare vulnerabilità.


Perché Questa Superficie Meritava di Essere Esaminata

Il parsing DER è una di quelle aree in cui piccoli errori di validazione possono avere effetti sproporzionati.

La classe di bug è semplice:

  • il campo lunghezza dice una cosa
  • il buffer reale contiene qualcosa di più corto
  • il parser si fida troppo della dichiarazione
  • il codice successivo opera su uno stato che non sarebbe mai dovuto esistere

È esattamente il tipo di fallimento di confine che vale la pena verificare in una revisione di sicurezza.

Non stavo cercando comportamenti crittografici strani qui. Stavo cercando fallimenti di fiducia nella gestione di input strutturati.

Era il posto giusto dove guardare.


Causa Radice

Il problema alla radice era una validazione impropria dei campi di lunghezza DER durante il parsing di input malformati o troncati.

Nello specifico, ecdsa.der.remove_octet_string() accettava input in cui la lunghezza DER dichiarata superava il numero di byte effettivamente disponibili nel buffer.

Quindi, invece di rifiutare DER malformati come questo:

  • lunghezza dichiarata: 4096
  • byte rimanenti effettivi: 3

l'helper lo accettava e restituiva contenuto troncato come se fosse valido.

Questo è già un bug.

Ma l'impatto più forte si è manifestato a valle.

Poiché l'input malformato veniva accettato invece di essere rifiutato al confine, SigningKey.from_der() poteva successivamente raggiungere un percorso di eccezione interno e sollevare:

IndexError: index out of bounds on dimension 1

Questo è importante perché non è il tipo di errore che un chiamante si aspetta da un input malformato. Il comportamento corretto è un rifiuto pulito del parsing, come UnexpectedDER o ValueError.

Quindi la vulnerabilità non era "esiste un IndexError" in isolamento.

La vera vulnerabilità era questa:

  • i campi di lunghezza DER malformati non venivano validati correttamente
  • l'input troncato attraversava il confine di parsing
  • il codice a valle colpiva un percorso di eccezione interno come conseguenza

È una singola catena di bug, non due problemi non correlati.


Perché Questo È un Problema di Sicurezza, Non Solo Scarsa Igiene del Parsing

Un parser che rifiuta input malformati non è un miglioramento estetico. È parte del modello di sicurezza.

La distinzione importante qui non è se l'input fosse non valido. Ovviamente lo era.

La distinzione importante è come la libreria si è comportata di fronte a un input non valido.

C'è una differenza reale tra:

  • rifiutare DER malformati in modo pulito al confine, e
  • accettare DER malformati, continuare più a fondo e crashare con un'eccezione interna

Il primo è un comportamento robusto.

Il secondo crea un rischio a livello applicativo se il software analizza DER non attendibili e presume che i guasti della libreria rimangano entro i tipi di eccezione previsti.

Ecco perché è stato correttamente classificato come vulnerabilità piuttosto che semplicemente come un bug di qualità del parser.


Prova di Concetto

Ho usato due PoC perché dimostravano due parti diverse della stessa catena di bug.

PoC 1: DER troncato accettato

Il primo PoC ha mostrato che remove_octet_string() accettava DER troncati la cui lunghezza dichiarata superava il buffer disponibile.

Questo ha stabilito il fallimento di validazione centrale:

  • il buffer era più corto della lunghezza codificata
  • l'helper avrebbe dovuto rifiutarlo
  • non lo ha fatto

PoC 2: percorso di eccezione interno deterministico

Il secondo PoC ha mostrato l'effetto a valle più importante: DER malformati forniti a SigningKey.from_der() innescavano deterministicamente un IndexError interno prima della correzione.

Questo ha stabilito l'impatto rilevante per la sicurezza:

  • l'input malformato attraversava il confine
  • il parsing continuava troppo a lungo
  • il codice della libreria sollevava un'eccezione interna invece di un errore di parsing pulito

È un risultato molto più forte di "il parser ha accettato byte strani".

Mostra un fallimento di confine più una reale conseguenza operativa.


Perché i PoC Sono Stati Scelti in Questo Modo

Il primo PoC dimostra la causa radice.

Il secondo PoC dimostra l'impatto.

Questa suddivisione è importante.

Molti report si fermano a:

"questo parser accetta dati malformati."

È utile, ma non sempre sufficiente per mostrare perché il bug sia importante.

In questo caso, il report più forte era:

  • i DER malformati vengono erroneamente accettati
  • quella accettazione non è autonoma
  • può propagarsi in un percorso di eccezione interno instabile nel parsing delle chiavi

Questo rende la storia di sicurezza molto più chiara.


Analisi della Correzione

La correzione è stata minima e corretta.

La patch ha aggiunto la stessa regola di sicurezza mancante già utilizzata in remove_sequence():

la lunghezza dichiarata deve rientrare nel buffer disponibile

Il controllo è stato applicato a:

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

Una volta aggiunti quei controlli dei limiti, i DER malformati/troncati venivano rifiutati immediatamente con:

UnexpectedDER: Length longer than the provided buffer

E il PoC che in precedenza innescava IndexError non raggiungeva più il percorso di eccezione interno. Falliva in modo pulito durante il parsing, che è esattamente ciò che sarebbe dovuto accadere dall'inizio.

Questo è il tipo di correzione che si vuole vedere in una vulnerabilità di parsing:

Scarica lo strumento