Në implementimin e funksionit hash kriptografik SHA-3 (Keccak), i ofruar në paketën XKCP (eXtended Keccak Code Package), është gjetur një dobësi (CVE-2022-37454), e cila mund të çojë në mbushjen e tamponit gjatë përpunimit të të dhënave me një format të caktuar. Problemi ngjall nga një gabim në kodin e implementimit të veçantë të SHA-3, dhe jo nga një dobësi në vetë algoritmin. Paketa XKCP paraqitet si implementimi zyrtar i SHA-3, zhvillohet me pjesëmarrjen e ekipit të zhvilluesve Keccak dhe përdoret si bazë në funksionet për punë me SHA-3 në gjuhë të ndryshme programimi (p.sh., kodi XKCP përdoret në modulën hashlib në Python, paketën digest-sha3 në Ruby dhe funksionet hash_* në PHP).
Sipas deklaratës së hulumtuesit që zbuloi problemin, ai ka arritur ta përdorë dobësinë për të shkelur pronat kriptografike të funksionit hash dhe për të identifikuar pre-emrat e parë dhe të dytë, si dhe për të përcaktuar kolizionet. Për më tepër, është deklaruar se është krijuar një prototip eksploati që lejon ekzekutimin e kodit gjatë llogaritjes së hash-it të një skedari të formatuar në mënyrë të veçantë. Potencialisht, dobësia gjithashtu mund të përdoret për sulme ndaj algoritmeve të verifikimit të nënshkrimeve digjitale që përdorin SHA-3 (p.sh., Ed448). Detajet e metodave të realizimit të sulmeve do të publikohen më vonë, pas eliminimit të gjithanshëm të dobësisë.
Sa i përket ndikimit të dobësisë në aplikacionet ekzistuese, ende nuk është e qartë, pasi për të manifestuar problemin, kodi duhet të aplikojë llogaritjen ciklike të hash-it në blloqe dhe një nga blloqet e përpunuara duhet të ketë një madhësi rreth 4 GB (jo më pak se 2^32 – 200 bajt). Gjatë përpunimit të të dhënave hyrëse në një herë (pa llogaritje sekondare të hash-it), problemi nuk manifeston. Si një metodë e thjeshtë mbrojtjeje, propozohet të kufizohet madhësia maksimale e të dhënave që marrin pjesë në një iteracion të llogaritjes së hash-it.
Dobësia shkaktohet nga një gabim gjatë përpunimit të bllokuar të të dhënave hyrëse. Për shkak të një krahasimi të gabuar të vlerave me tipin «int», përcaktohet një madhësi e gabuar e të dhënave që priten të përpunohen, që çon në shkrimin e pjesës mbetur jashtë tamponit të alokuar. Në veçanti, gjatë krahasimit, u përdor shprehja «partialBlock + instance->byteIOIndex», e cila me vlera të mëdha të përbërëseve shkaktonte një mbushje të numrit të plotë. Për më tepër, në kod kishte një kthim të gabuar të tipit «(unsigned int)(dataByteLen — i)», që çonte në mbushje në sistemet me tipin 64-bit size_t.
Shembulli i kodit që shkakton mbushjen: import hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())
Burimi: opennet.ru
