Iskorištavanje nultih referenci u Linux kernelu
Nedavno je objavljeno da su istraživači iz tima Google Project Zero razvili metodu za iskorištavanje ranjivosti u Linux kernelu uzrokovanih dereferenciranjem NULL pokazivača.
Do sada, problemi s kernelom povezani s dereferenciranjem NULL pokazivača nisu dobili dužnu pažnju , jer se smatralo nerealnim pretvoriti takve probleme u napade koji vode do eskalacije privilegija ili izvršavanja vlastitog koda (mapiranje neprivilegiranih procesa na nižu regiju adresnog prostora je zabranjeno).
Općenito, takve greške dovode do generiranja oops upozorenja od strane kernela, nakon čega se problematični zadaci završavaju i stanje se vraća bez potrebe za zaustavljanjem sistema.
Nova metoda napada zasniva se na rukovanju "oops" stanjima , što može rezultirati povećanjem vrijednosti referentnog brojača (refcount), što zauzvrat može uzrokovati prelijevanje brojača i oslobađanje memorije povezane s refcountom.
U ovom slučaju, eksploatacija se svodi na manipulacije tipične za napade bez upotrebe (nastaje situacija da broj referenci objekta postane nula, memorija se oslobađa, ali u stvari postoje radne veze koje upućuju na oslobođenu memoriju).
Trenutno, kada Linux kernel aktivira null dereferencu unutar konteksta procesa, generira oops , što se razlikuje od kernel panike. Panika se javlja kada kernel utvrdi da ne postoji siguran način za nastavak izvršavanja i stoga mora prekinuti sva izvršavanja. Međutim, kernel ne zaustavlja sva izvršavanja tokom oopsa; umjesto toga, kernel pokušava da se oporavi najbolje što može i nastavlja izvršavanje.
Dereferenciranje NULL pokazivača se ovdje koristi kao način da se generira "ups" stanje na kontroliran način. Problem je u tome što je potrebno oko 232 "ups" statusna poziva da bi se došlo do prekoračenja 32-bitnog broja refcounta.
Sa praktične tačke gledišta, potrebno je otprilike osam dana kontinuiranog generiranja OOP (out-of-place) stanja da bi se izvršio napad korištenjem predloženog exploita. Ako bude uspješan, exploit vam omogućava izvršavanje vašeg koda na nivou kernela.
Dereferenca NULL pokazivača korištena u exploit-u popravljena je u listopadu, ali budući da slični problemi nisu neuobičajeni i ranije su tretirani kao greške, a ne ranjivosti, programeri će dodati opću zaštitu Linux kernelu kako bi spriječili napade koji manipuliraju generiranjem "ups" ."
U slučaju zadatka, to znači odbacivanje postojećeg steka kernela i odlazak direktno na make_task_dead koji poziva do_exit. Kernel će također objaviti u dmesg dnevnik "crash" i trag kernela koji pokazuje u kakvom je stanju jezgro bilo kada je došlo do greške. Ovo može izgledati kao čudan izbor kada je očito došlo do oštećenja memorije; međutim, namjera je da se greške u kernelu lakše otkriju i evidentiraju prema filozofiji da je pokrenuti sistem mnogo lakše otkloniti grešku nego onaj koji radi.
Konkretno , Kernel 6.2 uključuje promjene za ograničavanje maksimalnog broja "oops" poruka . Nakon dostizanja ograničenja, koje je prema zadanim postavkama postavljeno na 10 oops poruka (ovo možete promijeniti pomoću parametra oops_limit ako želite), kernel će pokrenuti prelazak u stanje "panike", nakon čega slijedi ponovno pokretanje sistema, što neće dozvoliti broj iteracija potreban za resetiranje refcount-a na nulu.
Također je planirano da se ograničenje prenese na ranije objavljene, ali još uvijek podržane grane kernela, kao i kernel pakete popularnih distribucija.
Konačno, ako ste zainteresirani da saznate više o ovome , detalje možete pronaći na sljedećem linku.