V implementaciji kriptografske hash funkcije SHA-3 (Keccak), ki jo ponuja paket XKCP (eXtended Keccak Code Package), je bila odkrita ranljivost (CVE-2022-37454), ki lahko privede do prelivanja pomnilnika med obdelavo določeno oblikovanih podatkov. Težavo povzroča napaka v kodi konkretne implementacije SHA-3 in ne ranljivost samega algoritma. Paket XKCP se predstavlja kot uradna implementacija SHA-3, se razvija s sodelovanjem ekipe razvijalcev Keccak in se uporablja kot osnova v funkcijah za delo s SHA-3 v različnih programskih jezikih (na primer, koda XKCP se uporablja v Python modulu hashlib, Ruby paketu digest-sha3 in PHP funkcijah hash_*).
Po trditvah raziskovalca, ki je odkril težavo, mu je uspelo izkoristiti ranljivost za motnje v kriptografskih lastnostih hash funkcije ter za iskanje prvega in drugega predhodka, pa tudi za določanje kolizij. Poleg tega je bilo trdno o prototipu exploita, ki omogoča izvajanje kode pri izračunu hasha posebej oblikovanega datoteke. Potencialno se lahko ranljivost prav tako uporabi za napade na algoritme za preverjanje digitalnih podpisov, ki uporabljajo SHA-3 (na primer, Ed448). Podrobnosti metod izvajanja napadov bodo načrtovane za objavo pozneje, po tem, ko se ranljivost odstrani povsod.
Koliko ranljivost vpliva na obstoječe aplikacije v praksi, še ni jasno, saj za pojav težave v kodi mora biti uporabljeno ciklično izračunavanje hasha v blokih in eden od obdelanih blokov mora biti velik približno 4 GB (najmanj 2^32 - 200 bajtov). Pri obdelavi vhodnih podatkov vse hkrati (brez zaporednega izračunavanja hasha po delih) težava ne nastane. Kot najenostavnejša metoda zaščite se predlaga omejitev največje velikosti podatkov, ki sodelujejo v eni iteraciji izračunavanja hasha.
Ranljivost je povzročena z napako pri blokovni obdelavi vhodnih podatkov. Zaradi nepravila pri primerjavi vrednosti tipa 'int' je določen nepravilni velikost obdelovanih podatkov, kar vodi do pisanja 'tail'-a izven dodeljenega predpomnilnika. Še posebej je bilo pri primerjavi uporabljeno izraz 'partialBlock + instance->byteIOIndex', ki je pri velikih vrednostih sestavnih delov povzročilo celoštevilsko prelivanje. Poleg tega je v kodi bila napačna preobrazba tipov '(unsigned int)(dataByteLen - i)', kar je povzročilo prelivanje na sistemih z 64-bitno velikostjo tipa size_t.
Primer kode, ki povzroča prelivanje: 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
