„Linux“ branduolio šiukšlių rinktuvo lenktynių būsena, dėl kurios gali padidėti privilegijos

Jann Horn iš „Google Project Zero“ komandos, kažkada nustatęs „Spectre“ ir „Meltdown“ pažeidžiamumą, paskelbė „Linux“ branduolio šiukšlių rinktuvo pažeidžiamumo (CVE-2021-4083) išnaudojimo techniką. Pažeidžiamumas atsiranda dėl lenktynių sąlygų, kai valomi failų deskriptoriai Unix lizduose, todėl vietinis neprivilegijuotas vartotojas gali vykdyti savo kodą branduolio lygiu.

Problema įdomi, nes buvo įvertinta, kad laiko langas, per kurį atsiranda lenktynių sąlyga, buvo per mažas, kad būtų galima sukurti tikrus išnaudojimus, tačiau tyrimo autorius parodė, kad net ir tokie iš pradžių skeptiški pažeidžiamumai gali tapti tikrų atakų šaltiniu, jei išnaudojimo kūrėjas reikiamų įgūdžių ir laiko. Yann Horn parodė, kaip filigraninėmis manipuliacijomis galite sumažinti lenktynių sąlygas, atsirandančias vienu metu iškviečiant close() ir fget() funkcijas, į visiškai išnaudojamą „use-after-free“ pažeidžiamumą ir pasiekti jau atlaisvintus duomenis. struktūra branduolio viduje.

Lenktynių sąlyga įvyksta uždarant failo deskriptorių, tuo pačiu metu iškviečiant close() ir fget(). Iškvietimas close() gali atsirasti prieš paleidžiant fget(), o tai suklaidins šiukšlių surinkėją, nes pagal refcount failo struktūra neturės išorinių nuorodų, o liks prijungta prie failo deskriptoriaus, t.y. Šiukšlių surinkėjas manys, kad turi išskirtinę prieigą prie struktūros, tačiau iš tikrųjų trumpą laiką likęs įrašas failo deskriptorių lentelėje vis tiek nurodys atlaisvinamą struktūrą.

Siekiant padidinti tikimybę patekti į lenktynių būklę, buvo panaudotos kelios gudrybės, kurios leido padidinti išnaudojimo sėkmės tikimybę iki 30%, įvedant konkrečiai sistemai pritaikytus optimizavimus. Pavyzdžiui, norint kelis šimtus nanosekundžių pailginti prieigą prie struktūros su failų deskriptoriais, duomenys buvo išstumti iš procesoriaus talpyklos, talpykloje užpildant veiklą kitame procesoriaus branduolyje, o tai leido atkurti struktūrą iš atminties, o ne iš. greita procesoriaus talpykla.

Antroji svarbi savybė buvo aparatūros laikmačio sugeneruotų pertraukimų naudojimas, siekiant padidinti lenktynių sąlygų laiką. Momentas buvo pasirinktas taip, kad pertraukų tvarkytojas įsijungtų, kai įvyktų lenktynių sąlyga ir kuriam laikui nutrauktų kodo vykdymą. Siekiant dar labiau atitolinti valdymo grąžinimą, naudojant epoll buvo sugeneruota apie 50 tūkstančių įrašų laukimo eilėje, todėl reikėjo ieškoti per pertraukų tvarkyklę.

Pažeidžiamumo išnaudojimo technika buvo atskleista po 90 dienų neatskleidimo laikotarpio. Problema atsirado nuo 2.6.32 branduolio ir buvo ištaisyta gruodžio pradžioje. Pataisa buvo įtraukta į branduolį 5.16 ir taip pat buvo perkelta į branduolio ir branduolio paketų LTS filialus, pateiktus paskirstymuose. Pastebėtina, kad pažeidžiamumas buvo nustatytas analizuojant panašią problemą CVE-2021-0920, kuri pasireiškia šiukšliadėže apdorojant MSG_PEEK vėliavėlę.

Šaltinis: opennet.ru

Добавить комментарий