Istraživači s Wuster Polytechnic Institute (Sjedinjene Američke Države) predstavili su novu vrstu napada Mayhem, koji koristi metodu izobličenja bitova u dinamičkoj radnoj memoriji Rowhammer za promjenu vrijednosti varijabli na stogu, koje se koriste u programu kao zastavice za donošenje odluka o uspješnosti autentifikacije i prolaznosti sigurnosnih provjera. Praktični primjeri primjene napada demonstrirani su zaobilaženjem autentifikacije u SUDO, OpenSSH i MySQL, kao i za promjenu rezultata provjera vezanih uz sigurnost u biblioteci OpenSSL.
Napad se može primijeniti na aplikacije u kojima se tijekom provjera koristi usporedba razlika vrijednosti od nule. Primjer ranjivog koda: int auth = 0; … // kod provjere koji mijenja vrijednost auth u slučaju uspješne autentifikacije if(auth != 0) return AUTH_SUCCESS; else return AUTH_FAILURE;
U kontekstu ovog primjera, za uspješan napad dovoljno je postići izobličenje bilo kojeg bita u memoriji koji se odnosi na 32-bitnu varijablu auth na stogu. Kada se izobliči bilo koji bit u varijabli, vrijednost više neće biti jednaka nuli i uvjetni operator odredit će uspješno prolaznu autentifikaciju. Slični obrasci provjere dovoljno su rasprostranjeni u aplikacijama i nalaze se, na primjer, u SUDO, OpenSSH, MySQL i OpenSSL.

Napad se može primijeniti i na usporedbe poput 'if(auth == 1)', ali u tom slučaju njegovo izvođenje se komplicira, jer je potrebno izobličiti ne bilo koji bit od 32, već posljednji bit. Metoda se također može koristiti za utjecaj na vrijednosti varijabli u registrima procesora, budući da se sadržaj registara može privremeno prenijeti na stog prilikom prebacivanja konteksta, pozivanja funkcija ili aktiviranja obradnika signala. U vremenskom intervalu dok se registrarne vrijednosti nalaze u memoriji, moguće je izvršiti izobličenja u toj memoriji i u registar će biti vraćena izmijenjena vrijednost.

Za iskakanje bitova koristi se jedna od modifikacija napada klase RowHammer. Kako DRAM memorija predstavlja dvodimenzionalnu mrežu ćelija, svaka od kojih se sastoji od kondenzatora i tranzistora, neprekidno čitanje istog područja memorije dovodi do fluktuacije napona i anomalija koje uzrokuju malu poteškoću sa nabojem susjednih ćelija. Ako je intenzitet čitanja velik, susjedna ćelija može izgubiti dovoljno veliki volumen naboja i sljedeći ciklus regeneracije ne uspijeva vratiti njezino prvobitno stanje, što dovodi do promjene vrijednosti pohranjenih u toj ćeliji. Kako bi se zaštitili od RowHammer, proizvođači čipova dodali su mehanizam TRR (Target Row Refresh), koji blokira iskrivljenje ćelija u posebnim slučajevima, ali ne štiti od svih mogućih varijanti napada.
Za zaštitu od Mayhem napada preporučuje se da se u poređenjima ne koristi ocjena razlika od nule ili podudarnost s jedinicom, već provjera podudarnosti koristeći nasumičnu vrijednost uzorka s nenultim oktetima. U ovom slučaju, za postavljanje potrebne vrijednosti varijable potrebno je precizno iskvariti značajan broj bitova, što nije realistično, za razliku od iskrivljenja jednog bita. Primjer koda koji nije podložan napadu: int auth = 0xbe406d1a; … // kod provjere, postavlja vrijednost auth na 0x23ab8701 u slučaju uspješne autentifikacije if(auth == 0x23ab8701) return AUTH_SUCCESS; else return AUTH_FAILURE;
Navedeni metod zaštite već su primijenili developeri sudo i uvrstili su ga u izdanju 1.9.15 kao ispravku ranjivosti CVE-2023-42465. Prototip koda za provođenje napada planiraju objaviti nakon što se izvrše ispravke u glavnim ranjivim projektima.
Izvor: opennet.ru
