Ranljivost v knjižnici z glavno implementacijo algoritma SHA-3

Pri implementaciji kriptografske zgoščevalne funkcije SHA-3 (Keccak), ki je na voljo v paketu XKCP (eXtended Keccak Code Package), je bila ugotovljena ranljivost (CVE-2022-37454), ki lahko povzroči prekoračitev medpomnilnika pri obdelavi določenih podatkov. Težavo povzroča napaka v kodi določene izvedbe SHA-3 in ne ranljivost v samem algoritmu. Paket XKCP se oglašuje kot uradna izvedba SHA-3, ki je bila razvita s prispevki razvojne skupine Keccak in se uporablja kot osnova za funkcije SHA-3 v različnih programskih jezikih (npr. koda XKCP se uporablja v hashlibu Python modul, paket Ruby digest sha3 in funkcije PHP hash_*).

Po mnenju raziskovalca, ki je identificiral težavo, je lahko uporabil ranljivost za kršitev kriptografskih lastnosti zgoščevalne funkcije in našel prvo in drugo predsliko ter zaznal kolizije. Poleg tega je bilo napovedano, da bo ustvarjen prototip izkoriščanja, ki bo omogočal izvajanje kode pri izračunu zgoščene vrednosti posebej oblikovane datoteke. Ranljivost bi lahko potencialno uporabili tudi za napad na algoritme za preverjanje digitalnega podpisa, ki uporabljajo SHA-3 (na primer Ed448). Podrobnosti o metodah napada naj bi bile objavljene pozneje, potem ko bo ranljivost povsod odpravljena.

Ni še jasno, koliko ranljivost vpliva na obstoječe aplikacije v praksi, saj je, da se težava pokaže v kodi, treba uporabiti ciklične izračune zgoščevanja v blokih in mora biti eden od obdelanih blokov velik približno 4 GB (vsaj 2^32 - 200 bajtov). Pri hkratni obdelavi vhodnih podatkov (brez zaporednega izračuna zgoščevanja po delih) se težava ne pojavi. Kot najenostavnejši način zaščite je predlagana omejitev največje velikosti podatkov, vključenih v eno ponovitev izračuna zgoščevanja.

Ranljivost je posledica napake pri blokovni obdelavi vhodnih podatkov. Zaradi nepravilne primerjave vrednosti s tipom "int" je določena nepravilna velikost čakajočih podatkov, kar povzroči, da se rep zapiše izven dodeljenega medpomnilnika. Primerjava je zlasti uporabila izraz "partialBlock + instance->byteIOIndex", kar je privedlo do prekoračitve celega števila za velike vrednosti sestavnih delov. Poleg tega je v kodi prišlo do nepravilne pretvorbe tipa "(unsigned int)(dataByteLen - i)", kar je povzročilo prelivanje v sistemih s 64-bitnim tipom size_t.

Primer kode, ki povzroči prelivanje: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())

Vir: opennet.ru

Dodaj komentar