Cercetătorii de la Institutul Politehnic Worcester (SUA) au prezentat un nou tip de atac numit Mayhem, care folosește metoda distorsiunii bitilor în memoria operativă dinamică Rowhammer pentru a modifica valorile variabilelor din stivă, utilizate în program ca drapeluri pentru a decide succesul autentificării și trecerea testelor de securitate. Exemple practice ale acestui atac sunt prezentate pentru a ocoli autentificarea în SUDO, OpenSSH și MySQL, precum și pentru a modifica rezultatul testelor legate de securitate în biblioteca OpenSSL.
Atacul poate fi aplicat aplicațiilor în care verificările se bazează pe compararea diferențelor valorilor cu zero. Exemplu de cod vulnerabil: int auth = 0; … // cod de verificare care schimbă valoarea auth în cazul unei autentificări reușite if(auth != 0) return AUTH_SUCCESS; else return AUTH_FAILURE;
În contextul acestui exemplu, pentru un atac reușit este suficient să se obțină distorsionarea oricărui bit în memorie, care corespunde variabilei de 32 de biți auth din stivă. La distorsionarea oricărui bit din variabilă, valoarea nu va mai fi zero și operatorul condițional va determina o autentificare reușită. Astfel de tipare de verificare sunt destul de răspândite în aplicații și se găsesc, de exemplu, în SUDO, OpenSSH, MySQL și OpenSSL.

Atacul poate fi aplicat și pe comparații de tipul „if(auth == 1)”, dar în acest caz desfășurarea lui devine mai complicată, deoarece este necesar să se distorsioneze nu orice bit din 32, ci ultimul bit. Metoda poate fi folosită și pentru a influența valorile variabilelor în registrele procesorului, deoarece conținutul registrelor poate fi temporar transferat în stivă în timpul comutării contextului, apelării funcțiilor sau activării unui handler de semnal. În intervalul de timp în care valorile registrului se află în memorie, pot fi introduse distorsiuni în această memorie și valoarea modificată va fi restaurată în registru.

Pentru distorsionarea bitilor se folosește una dintre variantele atacului din clasa RowHammer. Deoarece memoria DRAM reprezintă un aranjament bidimensional de celule, fiecare constând dintr-un condensator și un tranzistor, citirea continuă a aceleași zone de memorie duce la fluctuații de tensiune și anomalii care provoacă o pierdere mică de încărcare a celulelor adiacente. Dacă intensitatea citirii este mare, o celulă adiacenta poate pierde o cantitate semnificativă de încărcare, iar următorul ciclu de regenerare nu va reuși să îi restabilească starea inițială, ceea ce va duce la modificarea valorii datelor stocate în celulă. Pentru a se proteja împotriva RowHammer, producătorii de cipuri au adăugat mecanismul TRR (Target Row Refresh), care blochează distorsionarea celulelor în cazuri particulare, dar nu protejează împotriva tuturor variantelor de atac.
Pentru a proteja împotriva atacului Mayhem, se recomandă utilizarea în comparații nu a evaluării diferențelor față de zero sau a potrivirii cu unu, ci a verificării corespondențelor, folosind o valoare aleatorie de semănare cu octeți nenuli. În acest caz, pentru a stabili valoarea dorită a variabilei, este necesară distorsionarea exactă a unui număr semnificativ de biți, ceea ce este nerealist, spre deosebire de distorsionarea unui singur bit. Exemplu de cod care nu este vulnerabil la atac: int auth = 0xbe406d1a; … // cod de verificare, care setează valoarea auth la 0x23ab8701 în cazul unei autentificări de succes if(auth == 0x23ab8701) return AUTH_SUCCESS; else return AUTH_FAILURE;
Metoda de protecție specificată a fost deja aplicată de dezvoltatorii sudo și a fost inclusă în versiunea 1.9.15 ca o corectare a vulnerabilității CVE-2023-42465. Prototipul codului pentru realizarea atacului urmează să fie publicat după ce corecțiile vor fi efectuate în proiectele vulnerabile principale.
Sursa: opennet.ro
