Ranjivost u biblioteci sa glavnom implementacijom SHA-3 algoritma

Identifikovana je ranjivost (CVE-3-2022) u implementaciji SHA-37454 (Keccak) kriptografske hash funkcije ponuđene u paketu XKCP (eXtended Keccak Code Package), što može dovesti do prelivanja bafera tokom obrade posebno formatiranih podaci. Problem je uzrokovan greškom u kodu određene SHA-3 implementacije, a ne ranjivosti u samom algoritmu. XKCP paket se reklamira kao službena implementacija SHA-3, razvijena uz pomoć Keccak razvojnog tima, a koristi se kao osnova za funkcije za rad sa SHA-3 u različitim programskim jezicima (na primjer, XKCP kod se koristi u Python hashlib modulu, Ruby paketu digest-sha3 i hash_* PHP funkcijama).

Prema istraživaču koji je identifikovao problem, on je bio u mogućnosti da iskoristi ranjivost da naruši kriptografska svojstva heš funkcije i pronađe prvu i drugu predsliku, kao i da odredi kolizije. Osim toga, najavljuje se izrada prototipa exploit-a, koji omogućava postizanje izvršavanja koda prilikom izračunavanja hash-a posebno dizajnirane datoteke. Potencijalno, ranjivost se također može koristiti za napad na algoritme za verifikaciju digitalnog potpisa koristeći SHA-3 (na primjer, Ed448). Planirano je da detalji o metodama napada budu objavljeni naknadno, nakon široko rasprostranjene eliminacije ranjivosti.

Još nije jasno kako ranjivost u praksi utiče na postojeće aplikacije, jer da bi se problem manifestovao u kodu, mora se koristiti ciklično heš računanje u blokovima, a jedan od obrađenih blokova mora imati veličinu od oko 4 GB (na najmanje 2 ^ 32 - 200 bajtova). Prilikom obrade ulaznih podataka odjednom (bez sekvencijalnog izračunavanja heša u dijelovima), problem se ne pojavljuje. Kao najjednostavniji način zaštite, predlaže se ograničavanje maksimalne veličine podataka uključenih u jednu iteraciju hash izračunavanja.

Ranjivost je uzrokovana greškom u blok obradi ulaznih podataka. Zbog pogrešne usporedbe vrijednosti sa tipom "int" utvrđuje se pogrešna veličina podataka na čekanju, što dovodi do upisivanja repa izvan dodijeljenog bafera. Konkretno, prilikom poređenja korišten je izraz "partialBlock + instance->byteIOIndex", što je, uz velike vrijednosti sastavnih dijelova, dovelo do prekoračenja cijelog broja. Osim toga, u kodu je bilo pogrešnog tipa "(unsigned int)(dataByteLen - i)", što je rezultiralo prelivom na sistemima sa 64-bitnim tipom size_t.

Primjer overflow koda: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())

izvor: opennet.ru

Dodajte komentar