Stanje tekmovanja v zbiralniku smeti jedra Linuxa, ki lahko privede do stopnjevanja privilegijev

Jann Horn iz ekipe Google Project Zero, ki je nekoč identificiral ranljivosti Spectre in Meltdown, je objavil tehniko za izkoriščanje ranljivosti (CVE-2021-4083) v zbiralniku smeti jedra Linuxa. Ranljivost je posledica stanja tekmovanja pri čiščenju deskriptorjev datotek na vtičnicah unix in potencialno omogoča lokalnemu neprivilegiranemu uporabniku, da izvede svojo kodo na ravni jedra.

Težava je zanimiva, ker je bilo ocenjeno, da je časovno okno, v katerem se pojavi stanje dirke, premajhno za ustvarjanje resničnih izkoriščanj, vendar je avtor študije pokazal, da lahko celo takšne sprva skeptične ranljivosti postanejo vir resničnih napadov, če je ustvarjalec izkoriščanja potrebna znanja in čas. Yann Horn je pokazal, kako lahko s pomočjo filigranskih manipulacij zmanjšate stanje tekmovanja, ki se pojavi pri hkratnem klicu funkcij close() in fget(), v popolnoma izkoriščeno ranljivost uporabe po brezplačnem in dosežete dostop do že osvobojenih podatkov strukturo znotraj jedra.

Pogoj tekmovanja se pojavi med postopkom zapiranja deskriptorja datoteke ob hkratnem klicu close() in fget(). Klic close() se lahko zgodi, preden se izvede fget(), kar bo zmedlo zbiralnik smeti, ker glede na refcount struktura datoteke ne bo imela zunanjih referenc, ampak bo ostala pritrjena na deskriptor datoteke, tj. Zbiralec smeti bo mislil, da ima ekskluziven dostop do strukture, v resnici pa bo za kratek čas preostali vnos v tabeli deskriptorjev datoteke še vedno kazal na osvobojeno strukturo.

Za povečanje verjetnosti vstopa v stanje dirke je bilo uporabljenih več trikov, ki so omogočili povečanje verjetnosti uspeha izkoriščanja na 30% pri uvedbi sistemsko specifičnih optimizacij. Na primer, da bi povečali čas dostopa do strukture z deskriptorji datotek za nekaj sto nanosekund, so bili podatki izrinjeni iz predpomnilnika procesorja tako, da so predpomnilnik nasmejali z aktivnostmi na drugem jedru CPU, kar je omogočilo pridobivanje strukture iz pomnilnika namesto iz hiter predpomnilnik procesorja.

Druga pomembna značilnost je bila uporaba prekinitev, ki jih je ustvaril strojni časovnik za povečanje časa dirkalnih pogojev. Trenutek je bil izbran tako, da bi se obdelovalnik prekinitev sprožil, ko bi nastopilo stanje tekmovanja in za nekaj časa prekinil izvajanje kode. Za nadaljnjo odložitev vrnitve nadzora je bilo z uporabo epoll ustvarjenih približno 50 tisoč vnosov v čakalni vrsti, ki je zahteval iskanje po upravljalniku prekinitev.

Tehnika za izkoriščanje ranljivosti je bila razkrita po 90-dnevnem obdobju nerazkritja. Težava se pojavlja od jedra 2.6.32 in je bila odpravljena v začetku decembra. Popravek je bil vključen v jedro 5.16 in je bil prenesen tudi v veje LTS jedra in paketov jedra, ki so na voljo v distribucijah. Omeniti velja, da je bila ranljivost ugotovljena med analizo podobne težave CVE-2021-0920, ki se kaže v zbiralniku smeti pri obdelavi zastavice MSG_PEEK.

Vir: opennet.ru

Dodaj komentar