I genomförandet av hash-funktionen SHA-3 (Keccak), som erbjuds i paketet XKCP (eXtended Keccak Code Package), har en sÄrbarhet (CVE-2022-37454) upptÀckts som kan leda till en buffertöverskridning vid bearbetning av vissa formaterade data. Problemet orsakas av ett fel i koden för den specifika implementationen av SHA-3, och inte av sÄrbarheten i sjÀlva algoritmen. Paketet XKCP presenteras som den officiella implementationen av SHA-3, utvecklas med deltagande av Keccak-utvecklarteamet och anvÀnds som grund i funktioner för att arbeta med SHA-3 i olika programmeringssprÄk (till exempel anvÀnds koden frÄn XKCP i Python-modulen hashlib, Ruby-paketet digest-sha3 och PHP-funktionerna hash_*).
Enligt forskaren som upptÀckte problemet lyckades denne anvÀnda sÄrbarheten för att bryta mot de kryptografiska egenskaperna hos hash-funktionen och hitta första och andra preimage, samt bestÀmma kollisioner. Dessutom rapporterades att en prototyp av en exploiter finns, som gör det möjligt att utföra kod vid berÀkning av hash av en specifikt formaterad fil. Potentiellt kan sÄrbarheten ocksÄ anvÀndas för attacker mot algoritmer som verifierar digitala signaturer som anvÀnder SHA-3 (till exempel Ed448). Det planeras att publicera detaljer om attackmetoder senare, efter att sÄrbarheten har ÄtgÀrdats allmÀnt.
Hur mycket sĂ„rbarheten pĂ„verkar befintliga applikationer i praktiken Ă€r fortfarande oklart, eftersom problemet i koden mĂ„ste involvera cyklisk hashberĂ€kning blockvis och en av de bearbetade blocken mĂ„ste ha en storlek av omkring 4 GB (minst 2^32 â 200 byte). NĂ€r ingĂ„ngsdata bearbetas pĂ„ en gĂ„ng (utan sekventiell hashberĂ€kning i delar) uppstĂ„r problemet inte. Som den enklaste metoden för skydd föreslĂ„s att begrĂ€nsa den maximala storleken pĂ„ data som ingĂ„r i en enda iteration av hashberĂ€kningen.
SÄrbarheten orsakas av ett fel vid blockbearbetning av indata. PÄ grund av ett felaktigt jÀmförelse av vÀrden av typen "int" bestÀms en felaktig storlek pÄ de data som vÀntar pÄ bearbetning, vilket leder till att svansen skrivs utanför den tilldelade bufferten. Specifikt anvÀndes uttrycket "partialBlock + instance->byteIOIndex" vid jÀmförelsen, vilket vid stora vÀrden pÄ delarna ledde till ett heltalsöverskridande. Dessutom fanns det en felaktig typkonvertering i koden "(unsigned int)(dataByteLen - i)", vilket ledde till överskridande pÄ system med 64-bitars typ av size_t.
Exempel pÄ kod som leder till överskridande: import hashlib h = hashlib.sha3_224() m1 = b"" * 1; m2 = b"" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())
KĂ€lla: opennet.ru
