Nell'implementazione della funzione di hash crittografico SHA-3 (Keccak), proposta nel pacchetto XKCP (eXtended Keccak Code Package), è stata identificata una vulnerabilità (CVE-2022-37454) che può portare a un overflow del buffer durante l'elaborazione di dati specificamente formattati. Il problema è causato da un errore nel codice di una specifica implementazione di SHA-3 e non da una vulnerabilità intrinseca nell'algoritmo stesso. Il pacchetto XKCP è presentato come l'implementazione ufficiale di SHA-3, sviluppato con il contributo del team di programmatori di Keccak e utilizzato come base per le funzioni SHA-3 in vari linguaggi di programmazione (ad esempio, il codice XKCP è utilizzato nel modulo Python hashlib, nel pacchetto Ruby digest-sha3 e nelle funzioni PHP hash_*).
Secondo il ricercatore che ha scoperto il problema, è riuscito a sfruttare la vulnerabilità per compromettere le proprietà crittografiche della funzione di hash e trovare il primo e il secondo preimmagine, oltre a determinare collisioni. Inoltre, è stato annunciato lo sviluppo di un prototipo di exploit in grado di eseguire codice durante il calcolo dell'hash di un file appositamente formattato. Potenzialmente, la vulnerabilità può essere utilizzata anche per attacchi contro algoritmi di verifica delle firme digitali che utilizzano SHA-3 (ad esempio, Ed448). I dettagli delle tecniche di attacco saranno pubblicati in seguito, dopo la risoluzione della vulnerabilità in tutto il mondo.
È ancora poco chiaro quanto la vulnerabilità influisca sulle applicazioni esistenti nella pratica, poiché per manifestare il problema nel codice deve essere utilizzato un calcolo ciclico dell'hash in blocchi e uno dei blocchi elaborati deve avere una dimensione di circa 4 GB (non inferiore a 2^32 - 200 byte). Nel caso in cui i dati di input vengano elaborati in un'unica soluzione (senza calcolo sequenziale dell'hash a pezzi), il problema non si manifesta. Come metodo di protezione più semplice, si suggerisce di limitare la dimensione massima dei dati coinvolti in un'unica iterazione di calcolo dell'hash.
La vulnerabilità è causata da un errore nell'elaborazione dei dati in blocco. A causa di un confronto errato dei valori di tipo «int», viene determinata una dimensione errata dei dati che devono essere elaborati, il che porta alla scrittura di un tail oltre il buffer allocato. In particolare, nel confronto è stata utilizzata l'espressione «partialBlock + instance->byteIOIndex», che con valori elevati delle parti costitutive ha portato a un overflow intero. Inoltre, nel codice era presente una conversione di tipo errata «(unsigned int)(dataByteLen — i)», che ha causato overflow sui sistemi con tipo size_t a 64 bit.
Esempio di codice che provoca overflow: import hashlib h = hashlib.sha3_224() m1 = b»\x00″ * 1; m2 = b»\x00″ * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())
Fonte: opennet.ru
