Mayhem – napad s poškodovanjem pomnilniških bitov za obhod preverjanja pristnosti sudo in OpenSSH

Raziskovalci s Politehničnega inštituta Worcester (ZDA) so uvedli novo vrsto napada Mayhem, ki uporablja tehniko popačenja bitov dinamičnega pomnilnika z naključnim dostopom Rowhammer za spreminjanje vrednosti spremenljivk sklada, ki se uporabljajo kot zastavice v programu, da se odloči, ali so avtentikacija in varnostna preverjanja opravili. Predstavljeni so praktični primeri napada za izogibanje avtentikaciji v SUDO, OpenSSH in MySQL ter za spreminjanje rezultatov preverjanj, povezanih z varnostjo, v knjižnici OpenSSL.

Napad je mogoče uporabiti za aplikacije, ki uporabljajo preverjanja za primerjavo vrednosti, ki se razlikujejo od nič. Primer ranljive kode: int auth = 0; ... // koda za preverjanje, ki spremeni vrednost auth v primeru uspešne avtentikacije if(auth != 0) return AUTH_SUCCESS; sicer vrni AUTH_FAILURE;

V kontekstu tega primera je za uspešen napad dovolj, da poškodujete kateri koli bit v pomnilniku, ki je povezan z 32-bitno spremenljivko auth na skladu. Če je kateri koli bit v spremenljivki poškodovan, vrednost ne bo več enaka nič in pogojni operator bo določil uspešno dokončanje avtentikacije. Takšni vzorci preverjanja so precej pogosti v aplikacijah in jih najdemo na primer v SUDO, OpenSSH, MySQL in OpenSSL.

Mayhem – napad z uničenjem pomnilniških bitov, da se zaobide preverjanje pristnosti sudo in OpenSSH

Napad je mogoče uporabiti tudi za primerjave v obliki "if(auth == 1)", vendar v tem primeru postane njegova izvedba bolj zapletena, saj je treba izkriviti ne kateri koli bit od 32, ampak zadnji bit. Metodo je mogoče uporabiti tudi za vplivanje na vrednosti spremenljivk v registrih procesorja, saj je vsebino registrov mogoče začasno splakniti v sklad, ko se sproži preklop konteksta, klic funkcije ali upravljavec signalov. V času, ko so vrednosti registra v pomnilniku, se lahko v ta pomnilnik vnesejo popačenja in spremenjena vrednost bo obnovljena v register.

Mayhem – napad z uničenjem pomnilniških bitov, da se zaobide preverjanje pristnosti sudo in OpenSSH

Za izkrivljanje bitov se uporablja ena od modifikacij napada razreda RowHammer. Ker je pomnilnik DRAM dvodimenzionalni niz celic, od katerih je vsaka sestavljena iz kondenzatorja in tranzistorja, neprekinjeno branje iste pomnilniške regije povzroči nihanje napetosti in anomalije, ki povzročijo majhno izgubo naboja v sosednjih celicah. Če je intenzivnost branja visoka, lahko sosednja celica izgubi dovolj veliko količino naboja in naslednji cikel regeneracije ne bo imel časa za vzpostavitev prvotnega stanja, kar bo povzročilo spremembo vrednosti podatkov, shranjenih v celici. . Za zaščito pred RowHammer so proizvajalci čipov dodali mehanizem TRR (Target Row Refresh), ki v posebnih primerih blokira poškodbe celic, vendar ne ščiti pred vsemi možnimi različicami napadov.

Za zaščito pred napadom Mayhem je priporočljivo, da v primerjavah ne uporabite vrednotenja razlik od nič ali sovpadanja z enico, temveč preverjanje ujemanja z uporabo naključne semenske vrednosti z okteti, ki niso nič. V tem primeru je za nastavitev želene vrednosti spremenljivke potrebno natančno izkrivljanje velikega števila bitov, kar je v nasprotju z izkrivljanjem enega bita nerealno. Primer nenapadljive kode: int auth = 0xbe406d1a; ... // verifikacijska koda, ki nastavi vrednost auth na 0x23ab8701 v primeru uspešne avtentikacije if(auth == 0x23ab8701) return AUTH_SUCCESS; sicer vrni AUTH_FAILURE;

Navedeno metodo zaščite so že uporabili razvijalci sudo in je bila vključena v izdajo 1.9.15 kot popravek za ranljivost CVE-2023-42465. Prototip kode za izvedbo napada nameravajo objaviti po popravkih glavnih ranljivih projektov.

Vir: opennet.ru

Dodaj komentar