V implementaci kryptografické hash-funkce SHA-3 (Keccak), navržené v balíčku XKCP (eXtended Keccak Code Package), byla zjištěna zranitelnost (CVE-2022-37454), která může vést k přetečení bufferu při zpracování určitě formátovaných dat. Problém je způsoben chybou v kódu konkrétní implementace SHA-3, nikoli zranitelností samotného algoritmu. Balíček XKCP je prezentován jako oficiální implementace SHA-3, vyvíjený za účasti týmu vývojářů Keccak a používán jako základ v funkcích pro práci s SHA-3 v různých programovacích jazycích (například kód XKCP se používá v Python modulu hashlib, Ruby balíčku digest-sha3 a PHP funkcích hash_*).
Podle tvrzení výzkumníka, který problém odhalil, se mu podařilo využít zranitelnost k narušení kryptografických vlastností hash-funkce a k nalezení prvního a druhého předobrazu, stejně jako k určení kolizí. Dále byla oznámena výroba prototypu exploit, který umožňuje dosažení vykonání kódu při výpočtu hash speciálně formátovaného souboru. Potenciálně může být zranitelnost také využita k útokům na algoritmy ověřování digitálních podpisů používajících SHA-3 (například Ed448). Podrobnosti metod provádění útoků budou zveřejněny později, po celoplošném odstranění zranitelnosti.
Jak moc zranitelnost ovlivňuje existující aplikace v praxi zatím není jasné, protože k tomu, aby se problém projevil v kódu, musí být aplikováno cyklické výpočty hash bloky a jeden z zpracovávaných bloků musí mít velikost přibližně 4 GB (nejméně 2^32 — 200 bajtů). Při zpracování vstupních dat najednou (bez sekvenčního výpočtu hash po částech) se problém neprojevuje. Jako nejjednodušší metoda ochrany se navrhuje omezit maximální velikost dat, která se účastní v jedné iteraci výpočtu hash.
Zranitelnost je způsobena chybou při blokovém zpracování vstupních dat. Kvůli nesprávnému porovnání hodnot s typem „int“ je určena nesprávná velikost dat, která mají být zpracována, což vede k přepsání konce vyhrazeného bufferu. Konkrétně se při porovnávání používal výraz „partialBlock + instance->byteIOIndex“, který při velkých hodnotách součástí vedl k přetečení celého čísla. Kromě toho v kódu bylo přítomno nesprávné převádění typů „(unsigned int)(dataByteLen - i)“, což vedlo k přetečení na systémech s 64bitovým typem size_t.
Příklad kódu, který vede k přetečení: import hashlib h = hashlib.sha3_224() m1 = b"" * 1; m2 = b"" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())
Zdroj: opennet.ru
