Zranitelnost v knihovně s hlavní implementací algoritmu SHA-3

V implementaci kryptografické hašovací funkce SHA-3 (Keccak) nabízené v balíčku XKCP (eXtended Keccak Code Package) byla identifikována zranitelnost (CVE-2022-37454), která může vést k přetečení vyrovnávací paměti během zpracování speciálně formátovaných data. Problém je způsoben chybou v kódu konkrétní implementace SHA-3, nikoli zranitelností v samotném algoritmu. Balíček XKCP je nabízen jako oficiální implementace SHA-3, vyvinutá s pomocí vývojového týmu Keccak a používá se jako základ pro funkce pro práci s SHA-3 v různých programovacích jazycích (například XKCP kód se používá v modulu hashlib Pythonu, ve funkcích PHP digest-sha3 a hash_* balíčku Ruby).

Podle výzkumníka, který problém identifikoval, dokázal využít zranitelnosti k porušení kryptografických vlastností hashovací funkce a najít první a druhý předobraz a také určit kolize. Kromě toho je oznámeno vytvoření prototypu exploitu, který umožňuje dosáhnout spuštění kódu při výpočtu hashe speciálně navrženého souboru. Potenciálně může být zranitelnost také použita k útoku na algoritmy ověřování digitálního podpisu pomocí SHA-3 (například Ed448). Podrobnosti o metodách útoku se plánují zveřejnit později, po rozsáhlém odstranění této chyby zabezpečení.

Zatím není jasné, jak zranitelnost v praxi ovlivňuje stávající aplikace, protože aby se problém projevil v kódu, je nutné použít cyklický výpočet hashe v blocích a jeden ze zpracovávaných bloků musí mít velikost cca 4 GB (při alespoň 2 ^ 32 - 200 bajtů). Při jednorázovém zpracování vstupních dat (bez sekvenčního výpočtu hashe po částech) se problém neobjevuje. Jako nejjednodušší způsob ochrany se navrhuje omezit maximální velikost dat zahrnutých 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 nevyřízených dat, což vede k zapsání konce mimo přidělenou vyrovnávací paměť. Zejména při porovnávání byl použit výraz „partialBlock + instance->byteIOIndex“, což při velkých hodnotách součástí vedlo k přetečení celého čísla. Kromě toho bylo v kódu nesprávné typové obsazení "(unsigned int)(dataByteLen - i)", což mělo za následek přetečení na systémech s 64bitovým typem size_t.

Příklad kódu přetečení: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())

Zdroj: opennet.ru

Přidat komentář