În interfața de intrare/ieșire asincronă io_uring, furnizată de nucleul Linux, a fost descoperită o vulnerabilitate (CVE-2024-0582) care permite unui utilizator fără privilegii să obțină drepturi de root în sistem. Pentru a exploata această vulnerabilitate, este suficient un acces local obișnuit la sistem, fără a necesita manipulări cu spațiile de nume. În prezent, există un exploit funcțional disponibil public, precum și o a doua tehnică de exploatare a vulnerabilității care a fost detaliată.
Vulnerabilitatea este cauzată de accesarea unui bloc de memorie deja eliberat (use-after-free) în subsistemul io_uring, care apare în urma înregistrării și eliberării unui buffer circular creat cu flag-ul IORING_REGISTER_PBUF_RING. În cazul aplicării operației mmap() asupra buffer-ului, acesta rămâne reflectat în spațiul utilizatorului după finalizarea operației de eliberare (IORING_UNREGISTER_PBUF_RING). Folosind această particularitate, atacatorul poate citi și scrie date în paginile de memorie returnate sistemului de distribuție a memoriei kernel-ului.
Problema apare începând cu versiunea nucleului Linux 6.4 și a fost eliminată în versiunile 6.7 și 6.6.5, precum și în pachetul nucleului 6.5.0-21, pregătit pentru Ubuntu 22.04 și 23.10. Este demn de menționat că, în nucleul principal, problema a fost rezolvată în decembrie 2023, proiectul Google Zero a deschis accesul la mesajul de eroare semnalizând prezența vulnerabilității pe 8 ianuarie, iar pachetul cu nucleul corectat 6.5 pentru Ubuntu a fost format doar pe 22 februarie 2024. În alte distribuții, urmărirea corecției și expunerii la vulnerabilitate poate fi vizualizată pe paginile: Debian, Gentoo, RHEL, SUSE, Fedora, Arch.
Primul exploit manipulează crearea unui număr mare de pagini de memorie controlate de atacator pentru a determina aranjamentul memoriei în kernel și accesul la paginile fizice de memorie adiacente, folosind ca semnale conținutul structurilor socket-urilor de rețea umplute într-un anumit mod. Pentru a rula codul în exploit, este utilizat un „gadget” (o secvență de instrucțiuni existente în kernel) care conduce la executarea funcției call_usermodehelper_exec, destinată pornirii proceselor în spațiul utilizatorului din kernel.
Al doilea exploit se bazează pe faptul că, atunci când toate blocurile slab din cache sunt epuizate (de exemplu, când un fișier este deschis de mai multe ori), paginile de memorie libere la care are acces atacatorul sunt utilizate de sistemul de distribuție a memoriei pentru a crea un nou bloc slab, iar toate noile structuri de fișiere încep să fie plasate în acest bloc. Prin urmare, anumite structuri de fișiere vor ajunge în paginile de memorie pe care atacatorul le poate citi și scrie. Exploatarea constă în organizarea accesului la fișierul dorit în cache-ul de fișiere și în modificarea câmpului f_mode în structurile de fișiere asociate, care definește drepturile de acces, ceea ce permite accesul în scriere la un fișier sistem relevant, de exemplu, \/etc\passwd.
Sursa: opennet.ro
