SHA-3-algoritmin päätoteutuksen kirjaston haavoittuvuus

Haavoittuvuus (CVE-3-2022) on tunnistettu XKCP-paketin (eXtended Keccak Code Package) tarjoaman SHA-37454 (Keccak) -skriptografisen hajautustoiminnon toteutuksessa, joka voi johtaa puskurin ylivuotoon tiettyjen tiedostojen käsittelyn aikana. muotoiltu tieto. Ongelma johtuu virheestä tietyn SHA-3-toteutuksen koodissa, ei itse algoritmin haavoittuvuudesta. XKCP-pakettia mainostetaan SHA-3:n virallisena toteutuksena, joka on kehitetty Keccak-kehitystiimin panoksella ja jota käytetään SHA-3-toimintojen perustana useilla ohjelmointikielillä (esim. XKCP-koodia käytetään Python hashlibissa moduuli, Ruby digest -paketti sha3 ja PHP hash_* -funktiot).

Ongelman tunnistaneen tutkijan mukaan hän pystyi käyttämään haavoittuvuutta rikkomaan hash-funktion kryptografisia ominaisuuksia ja löytämään ensimmäisen ja toisen esikuvan sekä havaitsemaan törmäyksiä. Lisäksi ilmoitettiin, että luodaan prototyyppihyökkäys, joka mahdollistaisi koodin suorittamisen erityisesti suunnitellun tiedoston hajautusarvoa laskettaessa. Haavoittuvuutta voidaan mahdollisesti käyttää myös SHA-3:a käyttävien digitaalisten allekirjoitusten vahvistusalgoritmeihin (esimerkiksi Ed448) hyökkäämiseen. Hyökkäysmenetelmien yksityiskohdat on tarkoitus julkaista myöhemmin, kun haavoittuvuus on poistettu kaikkialta.

Vielä ei ole selvää, kuinka paljon haavoittuvuus käytännössä vaikuttaa olemassa oleviin sovelluksiin, sillä jotta ongelma ilmenisi koodissa, tulee käyttää syklisiä hajautuslaskelmia lohkoissa ja yhden käsitellyn lohkon on oltava kooltaan noin 4 Gt (vähintään 2^32 - 200 tavua). Kun syötetietoja käsitellään kerralla (ilman peräkkäistä hash-laskentaa osissa), ongelmaa ei ilmene. Yksinkertaisina suojausmenetelmänä ehdotetaan rajoittamaan yhteen hajautuslaskelman iteraatioon osallistuvien tietojen enimmäiskokoa.

Haavoittuvuus johtuu virheestä syötetietojen lohkokäsittelyssä. Arvojen virheellisen vertailun vuoksi "int"-tyypin kanssa määritetään vireillä olevien tietojen virheellinen koko, mikä johtaa siihen, että häntä kirjoitetaan varatun puskurin yli. Erityisesti vertailussa käytettiin ilmaisua "partialBlock + instance->byteIOIndex", mikä johti kokonaislukujen ylivuotoon aineosien suurille arvoille. Lisäksi koodissa oli väärä tyyppi "(unsigned int)(dataByteLen - i)", mikä aiheutti ylivuodon järjestelmissä, joissa on 64-bittinen size_t-tyyppi.

Esimerkkikoodi, joka aiheuttaa ylivuodon: tuonti 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

Lisää kommentti