O vulnerabilitate recent descoperită, integrată în cipurile Apple din seria M, permite atacatorilor să extragă chei secrete de pe Mac-uri atunci când acestea efectuează operații criptografice utilizate pe scară largă, au dezvăluit cercetătorii universitari într-o lucrare publicată joi.
Defectul – un canal secundar care permite extragerea de chei de la un capăt la altul atunci când cipurile Apple rulează implementări ale unor protocoale criptografice utilizate pe scară largă – nu poate fi remediat direct, deoarece provine din proiectarea microarhitecturală a siliciului în sine. În schimb, aceasta poate fi atenuată doar prin construirea unor sisteme de apărare în software-ul criptografic al terților, care ar putea degrada drastic performanța seriei M atunci când se execută operațiuni criptografice, în special pe generațiile anterioare M1 și M2. Vulnerabilitatea poate fi exploatată atunci când operațiunea criptografică vizată și aplicația malițioasă cu privilegii normale de utilizator de sistem rulează pe același cluster de procesoare.
Feriți-vă de optimizările hardware
Amenințarea rezidă în prefetcherul dependent de memoria de date a cipurilor, o optimizare hardware care prezice adresele de memorie ale datelor pe care codul în execuție este posibil să le acceseze în viitorul apropiat. Prin încărcarea conținutului în memoria cache a procesorului înainte de a fi efectiv necesar, DMP, așa cum este abreviată această funcție, reduce latența dintre memoria principală și procesor, un gât de gâtul comun în calculul modern. DMP-urile sunt un fenomen relativ nou, care se găsește doar în cipurile din seria M și în microarhitectura Raptor Lake de a 13-a generație de la Intel, deși forme mai vechi de prefetchers sunt comune de ani de zile.
Experții în securitate știu de mult timp că prefetcherii clasici deschid un canal secundar pe care procesele rău intenționate îl pot sonda pentru a obține materialul secret al cheilor din operațiile criptografice. Această vulnerabilitate este rezultatul faptului că prefetcherii fac predicții pe baza modelelor de acces anterioare, ceea ce poate crea schimbări de stare pe care atacatorii le pot exploata pentru a scurge informații. Ca răspuns, inginerii criptografiști au conceput programarea în timp constant, o abordare care asigură că toate operațiile durează același timp pentru a fi finalizate, indiferent de operanzii lor. Aceasta face acest lucru prin menținerea codului fără accesări de memorie sau structuri dependente de secret.
Descoperirea noii cercetări constă în faptul că scoate la iveală un comportament anterior trecut cu vederea al DMP-urilor din siliciul Apple: Uneori, acestea confundă conținutul memoriei, cum ar fi materialul cheie, cu valoarea pointerului care este utilizat pentru a încărca alte date. Ca urmare, DMP-ul citește adesea datele și încearcă să le trateze ca pe o adresă pentru a efectua accesul la memorie. Această „dereferențiere” a „pointerelor” – adică citirea datelor și scurgerea lor printr-un canal secundar – este o încălcare flagrantă a paradigmei timpului constant.
Echipa de cercetători este formată din:
- Boru Chen, Universitatea din Illinois Urbana-Champaign
- Yingchen Wang, Universitatea Texas din Austin
- Pradyumna Shome, Institutul de Tehnologie din Georgia
- Christopher W. Fletcher, Universitatea din California, Berkeley
- David Kohlbrenner, Universitatea din Washington
- Riccardo Paccagnella, Universitatea Carnegie Mellon
- Daniel Genkin, Institutul de Tehnologie din Georgia
Într-un e-mail, aceștia au explicat:
Prefetcherii se uită de obicei la adresele datelor accesate (ignorând valorile datelor accesate) și încearcă să ghicească adresele viitoare care ar putea fi utile. DMP este diferit în acest sens, deoarece, pe lângă adrese, utilizează și valorile datelor pentru a face predicții (prezice adresele la care trebuie să meargă și să facă prefetch). În special, în cazul în care o valoare de date „arată ca un pointer”, aceasta va fi tratată ca o „adresă” (când, de fapt, nu este!) și datele de la această „adresă” vor fi aduse în memoria cache. Sosirea acestei adrese în memoria cache este vizibilă, scurgându-se pe canalele laterale ale cache-ului.
Atacul nostru exploatează acest fapt. Nu putem scurge chei de criptare în mod direct, dar ceea ce putem face este să manipulăm datele intermediare din interiorul algoritmului de criptare pentru a arăta ca un pointer prin intermediul unui atac de intrare aleasă. DMP vede apoi că valoarea datelor „arată ca o adresă” și aduce datele de la această „adresă” în memoria cache, ceea ce duce la scurgerea „adresei”. Nu ne pasă de faptul că valoarea datelor a fost prefetch, dar faptul că datele intermediare arătau ca o adresă este vizibil prin intermediul unui canal de cache și este suficient pentru a dezvălui cheia secretă în timp.
În lucrarea de joi, echipa a explicat acest lucru într-un mod ușor diferit:
Ideea noastră cheie este că, în timp ce DMP face doar dereferențiere la pointeri, un atacator poate crea intrări de program astfel încât, atunci când aceste intrări se amestecă cu secrete criptografice, starea intermediară rezultată poate fi modificată pentru a arăta ca un pointer dacă și numai dacă secretul satisface un predicat ales de atacator. De exemplu, să ne imaginăm că un program are secretul s, ia x ca intrare și calculează și apoi stochează y = s ⊕ x în memoria programului său. Atacatorul poate să creeze un x diferit și să deducă informații parțiale (sau chiar complete) despre s observând dacă DMP este capabil să dereferențieze y. Utilizăm mai întâi această observație pentru a încălca garanțiile unei primitive standard de swap în timp constant, recomandată pentru utilizare în implementările criptografice. Apoi, arătăm cum să spargem implementări criptografice complete concepute pentru a fi sigure împotriva atacurilor cu intrare aleasă.
Atacul, pe care cercetătorii l-au numit GoFetch, utilizează o aplicație care nu necesită acces root, ci doar aceleași privilegii de utilizator necesare pentru majoritatea aplicațiilor terțe instalate pe un sistem macOS. Cipurile din seria M sunt împărțite în ceea ce se numește clustere. M1, de exemplu, are două clustere: unul care conține patru nuclee de eficiență, iar celălalt patru nuclee de performanță. Atâta timp cât aplicația GoFetch și aplicația de criptografie vizată rulează pe același cluster de performanță – chiar și atunci când se află pe nuclee separate în cadrul acelui cluster – GoFetch poate extrage suficiente secrete pentru a scăpa o cheie secretă.
Atacul funcționează atât împotriva algoritmilor de criptare clasici, cât și împotriva unei generații mai noi de criptare care a fost întărită pentru a rezista atacurilor anticipate de la computerele cuantice. Aplicația GoFetch are nevoie de mai puțin de o oră pentru a extrage o cheie RSA pe 2048 de biți și de puțin peste două ore pentru a extrage o cheie Diffie-Hellman pe 2048 de biți. Atacul durează 54 de minute pentru a extrage materialul necesar pentru a asambla o cheie Kyber-512 și aproximativ 10 ore pentru o cheie Dilithium-2, fără a pune la socoteală timpul de deconectare necesar pentru procesarea datelor brute.
Aplicația GoFetch se conectează la aplicația vizată și îi furnizează intrări pe care le semnează sau decriptează. În timp ce face acest lucru, extrage cheia secretă a aplicației pe care o folosește pentru a efectua aceste operațiuni criptografice. Acest mecanism înseamnă că aplicația vizată nu trebuie să efectueze singură nicio operațiune criptografică în timpul perioadei de colectare.
Cheile RSA și Diffie-Hellman au fost procesate pe implementări din Go și OpenSSL, iar cheile Kyber și Dilithium din CRYSTALS-Kyber și CRYSTALS-Dilithium. Toate cele patru implementări utilizează programarea în timp constant, demonstrând că DMP-urile din siliciul Apple înving apărarea implementată pe scară largă.