Sebezhetőség a könyvtárban az SHA-3 algoritmus fő implementációjával

Sebezhetőséget (CVE-3-2022) azonosítottak az XKCP-csomagban kínált SHA-37454 (Keccak) kriptográfiai hash funkció (eXtended Keccak Code Package) megvalósításában, amely puffertúlcsorduláshoz vezethet bizonyos csomagok feldolgozása során. formázott adatok. A problémát az SHA-3 egy adott implementációjának kódjában lévő hiba okozza, nem pedig magának az algoritmusnak a sebezhetősége. Az XKCP csomagot az SHA-3 hivatalos implementációjaként tartják számon, a Keccak fejlesztőcsapatának közreműködésével fejlesztették ki, és az SHA-3 függvények alapjaként szolgálnak különböző programozási nyelveken (pl. a Python hashlib XKCP kódot használ modul, a Ruby digest csomag sha3 és PHP hash_* függvények).

A problémát azonosító kutató szerint a sérülékenységet a hash függvény kriptográfiai tulajdonságainak megsértésére, valamint az első és a második előkép megtalálására, valamint az ütközések észlelésére tudta használni. Emellett bejelentették, hogy egy prototípus exploitot hoznak létre, amely lehetővé teszi a kód futtatását egy speciálisan megtervezett fájl hash-ének kiszámításakor. A sérülékenység felhasználható az SHA-3-at használó digitális aláírás-ellenőrző algoritmusok (például Ed448) megtámadására is. A támadási módszerek részleteit később, a sebezhetőség mindenhol megszüntetése után tervezik közzétenni.

Egyelőre nem világos, hogy a sérülékenység mennyire érinti a gyakorlatban a meglévő alkalmazásokat, hiszen ahhoz, hogy a probléma a kódban megnyilvánuljon, ciklikus hash számításokat kell alkalmazni blokkokban, és az egyik feldolgozott blokknak körülbelül 4 GB-osnak kell lennie (legalább 2^32 - 200 bájt). A bemeneti adatok egyszerre történő feldolgozásakor (a hash részenkénti szekvenciális kiszámítása nélkül) a probléma nem jelenik meg. A védelem legegyszerűbb módjaként a hash-számítás egy iterációjában szereplő adatok maximális méretének korlátozása javasolt.

A sérülékenységet a bemeneti adatok blokkfeldolgozásának hibája okozza. Az értékek „int” típussal való helytelen összehasonlítása miatt a függőben lévő adatok helytelen mérete kerül meghatározásra, ami ahhoz vezet, hogy a farok a lefoglalt pufferen túlra kerül. Az összehasonlítás különösen a „partialBlock + instance->byteIOIndex” kifejezést használta, ami egész számok túlcsordulásához vezetett az alkotórészek nagy értékeinél. Ezenkívül a kódban egy helytelen "(unsigned int)(dataByteLen - i)" típusú leadott volt, ami túlcsordulást okozott a 64 bites size_t típusú rendszereken.

Példakód, amely túlcsordulást okoz: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())

Forrás: opennet.ru

Hozzászólás