Condiție de cursă în colectorul de gunoi kernel Linux care poate duce la escaladarea privilegiilor

Jann Horn de la echipa Google Project Zero, care a identificat odată vulnerabilitățile Spectre și Meltdown, a publicat o tehnică de exploatare a unei vulnerabilități (CVE-2021-4083) în colectorul de gunoi al nucleului Linux. Vulnerabilitatea se datorează unei condiții de concurență la curățarea descriptorilor de fișiere pe socket-uri Unix și poate permite unui utilizator local neprivilegiat să-și execute codul la nivel de kernel.

Problema este interesantă deoarece fereastra de timp în care apare condiția de cursă a fost estimată a fi prea mică pentru a crea exploit-uri reale, dar autorul studiului a arătat că chiar și astfel de vulnerabilități inițial sceptice pot deveni sursa unor atacuri reale dacă creatorul exploit-ului are abilitățile și timpul necesar. Yann Horn a arătat cum, cu ajutorul manipulărilor filigranate, puteți reduce condiția de cursă care apare atunci când apelați simultan funcțiile close() și fget() într-o vulnerabilitate complet exploatabilă de utilizare după liber și obțineți acces la date deja eliberate. structura din interiorul nucleului.

O condiție de cursă apare în timpul procesului de închidere a unui descriptor de fișier în timp ce se apelează close() și fget() în același timp. Apelul la close() poate apărea înainte ca fget() să fie executat, ceea ce va deruta colectorul de gunoi deoarece, conform refcount, structura fișierului nu va avea referințe externe, dar va rămâne atașată la descriptorul fișierului, adică. Colectorul de gunoi va crede că are acces exclusiv la structură, dar, de fapt, pentru o perioadă scurtă de timp, intrarea rămasă în tabelul de descriptor de fișiere va indica în continuare structura eliberată.

Pentru a crește probabilitatea de a intra într-o condiție de cursă, au fost utilizate mai multe trucuri, care au făcut posibilă creșterea probabilității de succes a exploatării la 30% la introducerea optimizărilor specifice sistemului. De exemplu, pentru a crește timpul de accesare a unei structuri cu descriptori de fișiere cu câteva sute de nanosecunde, datele au fost eliminate din memoria cache a procesorului prin împrăștierea cache-ului cu activitate pe un alt nucleu al procesorului, ceea ce a făcut posibilă preluarea structurii din memorie, mai degrabă decât din memoria cache rapidă a procesorului.

A doua caracteristică importantă a fost utilizarea întreruperilor generate de un cronometru hardware pentru a crește timpul de condiție de cursă. Momentul a fost selectat astfel încât handlerul de întrerupere să se declanșeze atunci când a apărut o condiție de cursă și să întrerupă execuția codului pentru o perioadă de timp. Pentru a întârzia și mai mult revenirea controlului, aproximativ 50 de mii de intrări în coada de așteptare au fost generate folosind epoll, care a necesitat căutarea prin gestionarea întreruperilor.

Tehnica de exploatare a vulnerabilității a fost dezvăluită după o perioadă de nedezvăluire de 90 de zile. Problema apare din kernel-ul 2.6.32 și a fost remediată la începutul lunii decembrie. Remedierea a fost inclusă în nucleul 5.16 și a fost, de asemenea, transferată în ramurile LTS ale nucleului și pachetelor de nucleu furnizate în distribuții. Este de remarcat faptul că vulnerabilitatea a fost identificată în timpul analizei unei probleme similare CVE-2021-0920, care se manifestă în colectorul de gunoi la procesarea steagului MSG_PEEK.

Sursa: opennet.ru

Adauga un comentariu