Mayhem – mälubittide riknemise rünnak sudo ja OpenSSH autentimisest möödahiilimiseks

Worcesteri Polütehnilise Instituudi (USA) teadlased on kasutusele võtnud uut tüüpi Mayhemi rünnaku, mis kasutab Rowhammeri dünaamilise RAM-i bitimoonutustehnikat, et muuta programmis lippudena kasutatavate pinu muutujate väärtusi, et otsustada, kas autentimine ja turvakontroll on läbitud. Rünnaku praktilised näited on demonstreeritud nii SUDO, OpenSSH ja MySQL autentimisest möödahiilimiseks kui ka OpenSSL-i teegi turvalisusega seotud kontrollide tulemuste muutmiseks.

Rünnakut saab rakendada rakendustele, mis kasutavad nullist erinevate väärtuste võrdlemiseks kontrolle. Haavatava koodi näide: int auth = 0; ... // kinnituskood, mis muudab autentimise väärtust eduka autentimise korral if(auth != 0) return AUTH_SUCCESS; muidu tagastab AUTH_FAILURE;

Selle näite kontekstis piisab edukaks rünnakuks sellest, kui rikute mis tahes bitti mälus, mis on seotud virna 32-bitise autentimismuutujaga. Kui muutuja mõni bitt on rikutud, ei ole väärtus enam null ja tingimuslik operaator määrab autentimise eduka lõpuleviimise. Sellised valideerimismustrid on rakendustes üsna tavalised ja neid leidub näiteks SUDO-s, OpenSSH-s, MySQL-is ja OpenSSL-is.

Mayhem – mälu bittide segamise rünnak sudo ja OpenSSH autentimisest möödahiilimiseks

Rünnakut saab rakendada ka vormi “if(auth == 1)” võrdlustele, kuid sel juhul muutub selle rakendamine keerulisemaks, kuna moonutada tuleb mitte suvalist bitti 32, vaid viimast. Meetodit saab kasutada ka protsessoriregistrite muutujate väärtuste mõjutamiseks, kuna kontekstilüliti, funktsioonikutse või signaalikäsitleja käivitumisel saab registrite sisu ajutiselt virna loputada. Aja jooksul, mil registriväärtused on mälus, võib sellesse mällu sisestada moonutusi ja muudetud väärtus taastatakse registrisse.

Mayhem – mälu bittide segamise rünnak sudo ja OpenSSH autentimisest möödahiilimiseks

Bittide moonutamiseks kasutatakse üht RowHammer klassi rünnaku modifikatsiooni. Kuna DRAM-mälu on kahemõõtmeline rakkude massiiv, millest igaüks koosneb kondensaatorist ja transistorist, põhjustab sama mälupiirkonna pidev lugemine pingekõikumisi ja anomaaliaid, mis põhjustavad naaberrakkudes väikese laengu kadu. Kui lugemise intensiivsus on kõrge, võib naaberrakk kaotada piisavalt suure laengu ja järgmisel regenereerimistsüklil pole aega oma esialgset olekut taastada, mis toob kaasa lahtrisse salvestatud andmete väärtuse muutumise. . RowHammeri eest kaitsmiseks on kiibitootjad lisanud TRR-i (Target Row Refresh) mehhanismi, mis erijuhtudel blokeerib rakkude korruptsiooni, kuid ei kaitse kõigi võimalike ründevariatsioonide eest.

Mayhemi rünnaku eest kaitsmiseks on soovitatav kasutada võrdlustes mitte nullist erinevuste või ühega kokkulangevuse hindamist, vaid sobivuse kontrolli, kasutades juhuslikku algväärtust nullist erineva oktettiga. Sel juhul on muutuja soovitud väärtuse määramiseks vaja märkimisväärset arvu bitte täpselt moonutada, mis on ebareaalne, erinevalt ühe biti moonutamisest. Mitteründatava koodi näide: int auth = 0xbe406d1a; ... // kinnituskood, mis määrab eduka autentimise korral autentimisväärtuseks 0x23ab8701 if(auth == 0x23ab8701) return AUTH_SUCCESS; muidu tagastab AUTH_FAILURE;

Määratud kaitsemeetodit on sudo arendajad juba kasutanud ja see lisati versiooni 1.9.15 haavatavuse CVE-2023-42465 parandusena. Nad kavatsevad avaldada ründe läbiviimise koodi prototüübi pärast seda, kui peamised haavatavad projektid on parandatud.

Allikas: opennet.ru

Lisa kommentaar