Gjendja e garës në grumbulluesin e mbeturinave të kernelit Linux që mund të çojë në përshkallëzim privilegji

Jann Horn nga ekipi i Google Project Zero, i cili dikur identifikoi dobësitë Spectre dhe Meltdown, publikoi një teknikë për shfrytëzimin e një dobësie (CVE-2021-4083) në grumbulluesin e mbeturinave të kernelit Linux. Dobësia është për shkak të një gjendje race gjatë pastrimit të përshkruesve të skedarëve në bazat unix dhe potencialisht lejon një përdorues lokal të paprivilegjuar të ekzekutojë kodin e tij në nivelin e kernelit.

Problemi është interesant sepse dritarja kohore gjatë së cilës ndodh gjendja e garës është vlerësuar të jetë shumë e vogël për të krijuar shfrytëzime reale, por autori i studimit tregoi se edhe dobësi të tilla fillimisht skeptike mund të bëhen burim i sulmeve reale nëse krijuesi i shfrytëzimit ka aftësitë dhe kohën e nevojshme. Yann Horn tregoi se si, me ndihmën e manipulimeve me filigran, mund të reduktoni gjendjen e garës që ndodh kur thirrni funksionet close() dhe fget() njëkohësisht në një cenueshmëri plotësisht të shfrytëzueshme të përdorimit pa pagesë dhe të arrini akses në një të dhënë tashmë të çliruar. struktura brenda kernelit.

Një kusht race ndodh gjatë procesit të mbylljes së një përshkruesi të skedarit ndërsa thirret në të njëjtën kohë close() dhe fget(). Thirrja për të mbyllur() mund të ndodhë përpara se të ekzekutohet fget(), e cila do të ngatërrojë grumbulluesin e mbeturinave sepse, sipas refcount, struktura e skedarit nuk do të ketë referenca të jashtme, por do të mbetet e bashkangjitur me përshkruesin e skedarit, d.m.th. Mbledhësi i plehrave do të mendojë se ka akses ekskluziv në strukturë, por në fakt, për një periudhë të shkurtër kohore, pjesa e mbetur në tabelën e përshkruesit të skedarëve do të vazhdojë të tregojë strukturën duke u çliruar.

Për të rritur gjasat për të hyrë në një gjendje gare, u përdorën disa truke, të cilat bënë të mundur rritjen e probabilitetit të suksesit të shfrytëzimit në 30% kur futni optimizime specifike për sistemin. Për shembull, për të rritur kohën e qasjes në një strukturë me përshkrues skedarësh me disa qindra nanosekonda, të dhënat u hoqën nga cache e procesorit duke e mbushur me aktivitet në një bërthamë tjetër të CPU-së, gjë që bëri të mundur marrjen e strukturës nga memoria dhe jo nga cache e shpejtë e CPU-së.

Karakteristika e dytë e rëndësishme ishte përdorimi i ndërprerjeve të krijuara nga një kohëmatës harduerësh për të rritur kohën e kushteve të garës. Momenti u zgjodh në mënyrë që mbajtësi i ndërprerjeve të ndezte kur ndodhte një gjendje gare dhe të ndërpresë ekzekutimin e kodit për ca kohë. Për të vonuar më tej kthimin e kontrollit, rreth 50 mijë hyrje në radhën e pritjes u gjeneruan duke përdorur epoll, i cili kërkonte kërkimin përmes mbajtësit të ndërprerjeve.

Teknika për shfrytëzimin e cenueshmërisë u zbulua pas një periudhe 90-ditore moszbulimi. Problemi shfaqet që nga kernel 2.6.32 dhe u rregullua në fillim të dhjetorit. Rregullimi u përfshi në kernel 5.16 dhe u transferua gjithashtu në degët LTS të paketave të kernelit dhe kernelit të ofruara në shpërndarje. Vlen të përmendet se dobësia u identifikua gjatë analizës së një problemi të ngjashëm CVE-2021-0920, i cili manifestohet në grumbulluesin e mbeturinave kur përpunohet flamuri MSG_PEEK.

Burimi: opennet.ru

Shto një koment