XKCP (eXtended Keccak Code Package) -paketissa tarjotun SHA-3 (Keccak) -kryptografisen tiivistefunktion toteutuksessa on tunnistettu haavoittuvuus (CVE-2022-37454). Tämä haavoittuvuus voi johtaa puskurin ylivuotoon käsiteltäessä erityisesti muotoiltua dataa. Ongelman aiheuttaa tietyn SHA-3-toteutuksen koodissa oleva virhe, ei itse algoritmin haavoittuvuus. XKCP:tä mainostetaan SHA-3:n virallisena toteutuksena, joka on kehitetty Keccak-kehitystiimin kanssa, ja sitä käytetään SHA-3-funktioiden perustana useissa ohjelmointikielissä (esimerkiksi XKCP-koodia käytetään Python-moduulissa hashlib, Ruby-paketissa digest-sha3 ja PHP-funktioissa hash_*).
Haavoittuvuuden löytäneen tutkijan mukaan he onnistuivat hyödyntämään haavoittuvuutta rikkoakseen tiivistefunktion kryptografisia ominaisuuksia, löytääkseen ensimmäisen ja toisen esikuvan sekä havaitakseen törmäyksiä. He ilmoittivat myös prototyypin hyödyntämistyökalun luomisesta, joka mahdollistaa koodin suorittamisen laskettaessa erityisesti muodostetun tiedoston tiivistettä. Haavoittuvuutta voitaisiin mahdollisesti käyttää myös SHA-3-algoritmia (esimerkiksi Ed448) käyttävien digitaalisen allekirjoituksen vahvistusalgoritmien hyökkäämiseen. Hyökkäysmenetelmien yksityiskohdat on tarkoitus julkaista myöhemmin, kun haavoittuvuus on laajalti korjattu.
On epäselvää, missä määrin tämä haavoittuvuus vaikuttaa olemassa oleviin sovelluksiin käytännössä, koska koodin on käytettävä syklisiä lohkohajautuslaskelmia, jotta ongelma ilmenisi, ja yhden käsiteltävien lohkojen on oltava kooltaan noin 4 Gt (vähintään 2^32 - 200 tavua). Kun kaikki syöttötiedot käsitellään kerralla (ilman hajautusarvon laskemista peräkkäin paloina), ongelma ei ilmene. Yksinkertaisin ehdotettu lieventämismenetelmä on rajoittaa yhteen hajautuslaskelmien iteraatioon liittyvän datan enimmäiskokoa.
Haavoittuvuuden aiheuttaa virhe syötetietojen lohkokäsittelyssä. Virheellisen "int"-tyypin arvojen vertailun vuoksi käsiteltävän datan koko määritetään virheellisesti, mikä johtaa loppukirjoitukseen varatun puskurin yli. Tarkemmin sanottuna vertailussa käytettiin lauseketta "partialBlock + instance->byteIOIndex", joka komponenttien arvojen ollessa suuria johti kokonaisluvun ylivuotoon. Lisäksi koodissa oli virheellinen tyyppimuunnos "(unsigned int)(dataByteLen - i)", mikä johti ylivuotoon järjestelmissä, joissa oli 64-bittinen size_t-tyyppi.
Esimerkki koodista, joka aiheuttaa ylivuodon: import hashlib h = hashlib.sha3_224() m1 = b»\x00» * 1; m2 = b»\x00» * 4294967295; h.update(m1) h.update(m2) print(h.hexdigest())
Lähde: opennet.ru
