Ievainojamība bibliotēkā ar galveno SHA-3 algoritma ieviešanu

XKCP pakotnē (eXtended Keccak Code Package) piedāvātās kriptogrāfijas jaucējfunkcijas SHA-3 (Keccak) ieviešanā ir konstatēta ievainojamība (CVE-2022-37454), kas, apstrādājot noteiktus datus, var izraisīt bufera pārpildīšanu. Problēmu izraisa kļūda konkrētas SHA-3 ieviešanas kodā, nevis paša algoritma ievainojamība. XKCP pakotne tiek uzskatīta par oficiālu SHA-3 ieviešanu, kas izstrādāta ar Keccak izstrādes komandas ieguldījumu un tiek izmantota kā pamats SHA-3 funkcijām dažādās programmēšanas valodās (piemēram, XKCP kods tiek izmantots Python hashlib. modulis, Ruby digest pakotne sha3 un PHP hash_* funkcijas).

Kā norāda pētnieks, kurš identificēja problēmu, viņš varēja izmantot ievainojamību, lai pārkāptu jaucējfunkcijas kriptogrāfiskās īpašības un atrastu pirmo un otro priekšattēlu, kā arī atklātu sadursmes. Turklāt tika paziņots, ka tiks izveidots prototipa exploit, kas ļaus izpildīt kodu, aprēķinot speciāli izstrādāta faila hash. Ievainojamību var izmantot arī, lai uzbruktu digitālā paraksta pārbaudes algoritmiem, kas izmanto SHA-3 (piemēram, Ed448). Sīkāku informāciju par uzbrukuma metodēm plānots publicēt vēlāk, kad ievainojamība visur būs novērsta.

Pagaidām nav skaidrs, cik lielā mērā ievainojamība ietekmē esošās lietojumprogrammas praksē, jo, lai problēma izpaustos kodā, ir jāizmanto cikliskie jaukšanas aprēķini blokos un vienam no apstrādātajiem blokiem jābūt aptuveni 4 GB lielam (vismaz 2^32 - 200 baiti). Apstrādājot ievades datus uzreiz (bez secīgi nerēķinot hash pa daļām), problēma neparādās. Kā vienkāršākā aizsardzības metode ir ierosināts ierobežot maksimālo datu apjomu, kas tiek iesaistīts vienā hash aprēķina iterācijā.

Ievainojamību izraisa kļūda ievades datu bloķēšanas apstrādē. Nepareizas vērtību salīdzināšanas ar veidu "int" dēļ tiek noteikts nepareizs neapstiprināto datu lielums, kā rezultātā aste tiek ierakstīta ārpus piešķirtā bufera. Jo īpaši salīdzināšanā tika izmantots izteiciens “partialBlock + instance->byteIOIndex”, kas izraisīja veselu skaitļu pārplūdi lielām sastāvdaļu vērtībām. Turklāt kodā bija nepareiza tipa apraide "(unsigned int)(dataByteLen - i)", kas izraisīja pārplūdi sistēmās ar 64 bitu size_t tipu.

Koda piemērs, kas izraisa pārpildīšanu: importēt hashlib h = hashlib.sha3_224() m1 = b"\x00" * 1; m2 = b"\x00" * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())

Avots: opennet.ru

Pievieno komentāru