SHA-3 algoritmi põhirakenduse haavatavus raamatukogus

XKCP (eXtended Keccak Code Package) paketis pakutava krüptograafilise räsifunktsiooni SHA-3 (Keccak) juurutamisel on tuvastatud haavatavus (CVE-2022-37454), mis võib põhjustada puhvri ületäitumise spetsiaalselt vormindatud materjalide töötlemisel. andmeid. Probleemi põhjustab konkreetse SHA-3 juurutuse koodi viga, mitte algoritmi enda haavatavus. XKCP paketti peetakse SHA-3 ametlikuks juurutuseks, mis on välja töötatud Keccaki arendusmeeskonna abiga ja seda kasutatakse SHA-3-ga töötamise funktsioonide aluseks erinevates programmeerimiskeeltes (näiteks XKCP koodi kasutatakse Pythoni hashlib moodulis, Ruby paketi digest- sha3 ja hash_* PHP funktsioonides).

Probleemi tuvastanud teadlase sõnul suutis ta haavatavust kasutada räsifunktsiooni krüptograafiliste omaduste rikkumiseks ning esimese ja teise eelpildi leidmiseks, samuti kokkupõrgete määramiseks. Lisaks teatatakse prototüübi exploiti loomisest, mis võimaldab saavutada koodi täitmist spetsiaalselt disainitud faili räsi arvutamisel. Võimalik, et haavatavust saab kasutada ka digitaalallkirja kontrollimise algoritmide ründamiseks, kasutades SHA-3 (näiteks Ed448). Ründemeetodite üksikasjad on plaanis avaldada hiljem, pärast haavatavuse laialdast kõrvaldamist.

Praegu pole veel selge, kuidas haavatavus praktikas olemasolevaid rakendusi mõjutab, kuna probleemi koodis avaldumiseks tuleb kasutada tsüklilist räsiarvutust plokkides ning üks töödeldud plokkidest peab olema umbes 4 GB suurune (at vähemalt 2 ^ 32 - 200 baiti). Sisendandmete korraga töötlemisel (ilma räsi osade kaupa arvutamiseta) probleemi ei ilmne. Lihtsaima kaitsemeetodina tehakse ettepanek piirata räsiarvutuse ühes iteratsioonis kaasatud andmete maksimaalset suurust.

Haavatavuse põhjuseks on viga sisendandmete plokktöötlusel. Väärtuste ebaõige võrdlemise tõttu tüübiga "int" määratakse ootel olevate andmete vale suurus, mis viib selleni, et saba kirjutatakse väljapoole eraldatud puhvrit. Eelkõige kasutati võrdlemisel väljendit "partialBlock + instance->byteIOIndex", mis komponentide suurte väärtustega põhjustas täisarvu ülevoolu. Lisaks sisaldas kood vale tüübiülekannet "(unsigned int)(dataByteLen - i)", mis põhjustas 64-bitise size_t tüübiga süsteemides ületäitumise.

Ülevoolukoodi näide: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())

Allikas: opennet.ru

Lisa kommentaar