Un grup de cercetători de la ETH Zurich a descoperit o nouă variantă de atac asupra mecanismului de execuție speculativă a ramurilor indirecte în CPU, permițând extragerea de informații din memoria kernelului sau organizarea unui atac asupra sistemului gazdă din mașinile virtuale. Vulnerabilitățile au primit denumirea de cod Retbleed (CVE-2022-29900, CVE-2022-29901) și sunt asemănătoare în esență cu atacurile Spectre-v2. Diferența constă în organizarea execuției speculative a codului arbitrar în timpul procesării instrucțiunii „ret” (return), care extrage adresa de salt din stivă, în loc de un salt indirect prin instrucțiunea „jmp” cu încărcarea adresei din memorie sau registrul CPU.
Atacatorul poate crea condiții pentru o prezicere incorectă a saltului și poate organiza un salt speculativ țintit către un bloc de cod care nu este prevăzut în logica de execuție a programului. În cele din urmă, procesorul va determina că prezicerea ramificării nu a fost corectă și va reveni la starea inițială, dar datele procesate în timpul execuției speculative se vor așeza în cache și în bufferele microarhitecturale. Dacă blocul executat din greșeală efectuează o accesare a memoriei, atunci execuția sa speculativă va duce la așezarea în cache-ul general a datelor citite din memorie.
Pentru a determina datele rămase în cache după execuția speculativă a operațiunilor, atacatorul poate folosi metode de determinare a datelor reziduale prin canale externe, de exemplu, analizând modificările timpului de acces la datele cache și cele necache. Pentru extragerea țintită a informațiilor din zone la un alt nivel de privilegiu (de exemplu, din memoria kernelului), se folosesc „gadgeturi” - secvențe de instrucțiuni prezente în kernel, utile pentru citirea speculativă a datelor din memorie, în funcție de condițiile externe care pot fi influențate de atacator.
Pentru a proteja împotriva atacurilor clasice de tip Spectre, care utilizează instrucțiuni de salt condiționat și indirect, majoritatea sistemelor de operare aplică tehnica „retpoline”, bazată pe înlocuirea operațiunilor de salt indirect cu instrucțiunea „ret”, pentru care la procesoare este utilizat un bloc separatat de predicție a stării stack-ului, care nu folosește blocul de predicție a salturilor. La încorporarea retpoline în 2018, s-a considerat că manipulările de adresă asemănătoare cu Spectre nu sunt aplicabile în practică pentru saltul speculativ prin intermediul instrucțiunii „ret”.
Cercetătorii care au dezvoltat metoda de atac Retbleed au demonstrat posibilitatea de a crea condiții microarhitecturale pentru inițierea unui salt speculativ prin intermediul instrucțiunii „ret” și au publicat un set de instrumente gata de utilizare pentru identificarea în nucleul Linux a secvențelor de instrucțiuni (gadgeturi) susceptibile de exploatare, în care apar astfel de condiții.
În cadrul cercetării, a fost pregătit un exploit funcțional, care permite pe sistemele cu CPU Intel să extragă date arbitrare din memoria nucleului cu o viteză de 219 biți pe secundă și o precizie de 98% dintr-un proces neprivilegiat în spațiul utilizatorului. Pe procesoarele AMD, eficiența exploit-ului este mult mai mare – viteza de scurgere ajunge la 3.9 KB pe secundă. Ca exemplu practic, a fost demonstrat cum să se determine conținutul fișierului /etc/shadow folosind exploit-ul propus. Pe sistemele cu CPU Intel, atacul pentru a determina hash-ul parolei utilizatorului root a fost efectuat în 28 de minute, iar pe sistemele cu CPU AMD – în 6 minute.

Posibilitatea de a efectua atacul a fost confirmată pentru procesoarele Intel de generația 6-8, care au fost produse până în cel de-al treilea trimestru al anului 2019 (inclusiv Skylake), și pentru procesoarele AMD bazate pe microarhitecturile Zen 1, Zen 1+ și Zen 2, care au fost produse până în cel de-al doilea trimestru al anului 2021. În modelele mai noi de procesoare, cum ar fi AMD Zen3 și Intel Alder Lake, precum și în procesoarele ARM, problema este blocată de mecanismele existente de protecție. De exemplu, utilizarea instrucțiunilor IBRS (Indirect Branch Restricted Speculation) ajută la protecția împotriva atacului.
Pentru nucleul Linux și hypervisorul Xen a fost pregătit un set de modificări pentru CPU-urile mai vechi care blochează problema prin software. Patch-ul propus pentru nucleul Linux modifică 68 de fișiere, adaugă 1783 de linii și șterge 387 de linii. Din păcate, protecția duce la costuri semnificative de overhead — testele efectuate pe procesoarele AMD și Intel indică o scădere a performanței estimată între 14% și 39%. O opțiune mai preferabilă este aplicarea protecției bazate pe instrucțiuni IBRS, disponibile în noile generații de CPU Intel și susținute începând cu nucleul Linux 4.19.
Pe procesoarele Intel, inserarea adresei pentru saltul indirect speculativ se realizează datorită unei caracteristici care se manifestă în cazul depășirii limite inferioare (underflow) în bufferul de predicție a conținutului stivei (Return Stack Buffer). Când aceste condiții apar, pentru instrucțiunea „ret” se aplică o logică de selectare a adresei similară cu cea utilizată pentru sărituri indirecte obișnuite. În nucleul Linux au fost găsite peste o mie de locuri care creează condiții de inițiere a unui astfel de underflow, accesibile prin apeluri de sistem.
Pe procesoarele AMD, executarea speculativă a instrucțiunii „ret” se realizează fără a fi legată de bufferul specific stivei (Return Address Stack), iar blocul de predicție a săriturilor consideră instrucțiunea „ret” nu ca o revenire la control, ci ca un salt indirect, utilizând astfel datele pentru săriturile indirecte în predicție. În aceste condiții, practic orice operațiune „ret” accesibilă prin apeluri de sistem poate fi exploatată.
În plus, în CPU-urile AMD a fost identificată o altă problemă (CVE-2022-23825, Branch Type Confusion) legată de efectuarea de sărituri fictive — condițiile pentru predicția săriturilor pot apărea chiar și fără instrucțiunile necesare de ramificare, ceea ce permite influențarea bufferului de predicție a săriturilor fără instrucțiunea „ret”. Această caracteristică complică semnificativ implementarea protecției și necesită o curățare mai activă a bufferului de predicție a săriturilor. Se așteaptă ca adăugarea protecției complete în nucleu să conducă la creșterea costurilor de overhead cu 209%.
Sursa: opennet.ro
