Stanje utrke u skupljaču otpada Linux kernela koje može dovesti do eskalacije privilegija

Jann Horn iz tima Google Project Zero, koji je svojedobno identificirao ranjivosti Spectre i Meltdown, objavio je tehniku ​​za iskorištavanje ranjivosti (CVE-2021-4083) u skupljaču otpada Linux kernela. Ranjivost je uzrokovana stanjem utrke prilikom čišćenja deskriptora datoteka na unix utičnicama i potencijalno dopušta lokalnom neprivilegiranom korisniku da izvrši svoj kod na razini kernela.

Problem je zanimljiv jer je vremenski prozor tijekom kojeg se događa stanje utrke procijenjen premalim za stvaranje stvarnih exploita, no autor studije je pokazao da čak i takve u početku skeptične ranjivosti mogu postati izvor pravih napada ako kreator exploita ima potrebne vještine i vrijeme. Yann Horn je pokazao kako, uz pomoć filigranskih manipulacija, možete smanjiti stanje utrke koje se javlja prilikom istovremenog pozivanja funkcija close() i fget() u potpuno iskoristivu ranjivost use-after-free i ostvariti pristup već oslobođenim podacima struktura unutar jezgre.

Stanje utrke se događa tijekom procesa zatvaranja deskriptora datoteke dok se istovremeno pozivaju close() i fget(). Poziv za close() može se pojaviti prije nego što se fget() izvrši, što će zbuniti sakupljača smeća jer, prema refcountu, struktura datoteke neće imati vanjske reference, već će ostati pripojena deskriptoru datoteke, tj. Sakupljač smeća će misliti da ima isključivi pristup strukturi, ali zapravo će, kratko vrijeme, preostali unos u tablici deskriptora datoteke i dalje upućivati ​​na strukturu koja se oslobađa.

Kako bi se povećala vjerojatnost ulaska u stanje utrke, korišteno je nekoliko trikova koji su omogućili povećanje vjerojatnosti uspjeha eksploatacije na 30% pri uvođenju optimizacija specifičnih za sustav. Na primjer, kako bi se povećalo vrijeme pristupa strukturi s deskriptorima datoteka za nekoliko stotina nanosekundi, podaci su izbačeni iz predmemorije procesora zatrpavanjem predmemorije aktivnostima na drugoj CPU jezgri, što je omogućilo dohvaćanje strukture iz memorije, a ne iz brzu predmemoriju CPU-a.

Druga važna značajka bila je upotreba prekida koje je generirao hardverski mjerač vremena za povećanje vremena uvjeta utrke. Trenutak je odabran tako da bi se rukovatelj prekida aktivirao kada se dogodi stanje utrke i na neko vrijeme prekinuo izvršenje koda. Kako bi se dodatno odgodio povratak kontrole, generirano je oko 50 tisuća unosa u redu čekanja korištenjem epoll-a, što je zahtijevalo pretraživanje kroz rukovatelja prekidima.

Tehnika za iskorištavanje ranjivosti otkrivena je nakon razdoblja tajnosti od 90 dana. Problem se pojavljuje od kernela 2.6.32 i riješen je početkom prosinca. Popravak je uključen u kernel 5.16 i također je prenesen u LTS grane kernela i kernel pakete koji se isporučuju u distribucijama. Važno je napomenuti da je ranjivost identificirana tijekom analize sličnog problema CVE-2021-0920, koji se očituje u sakupljaču smeća prilikom obrade zastavice MSG_PEEK.

Izvor: opennet.ru

Dodajte komentar