Root-vulnerability v jedru Linux in zavrnitev storitve v systemd

Raziskovalci varnosti podjetja Qualys so razkrili podrobnosti dveh ranljivosti, ki vplivata na jedro Linux in sistemski manager systemd. Ranljivost v jedru (CVE-2021-33909) omogoča lokalnemu uporabniku, da doseže izvajanje kode s pravicami root preko manipulacij z globokimi imeniki.

Tveganje ranljivosti se povečuje, ker so raziskovalci uspeli pripraviti delujoče eksploite, ki delujejo v Ubuntu 20.04/20.10/21.04, Debian 11 in Fedora 34 v privzeti konfiguraciji. Opozarja se, da druge distribucije niso bile testirane, lahko pa so teoretično prav tako ranljive in jih lahko napadejo. Popoln kodo eksploitov obljubljajo objaviti po celovitem odpravljanju problema, trenutno pa je na voljo le omejena različica prototipa, ki povzroča zrušitev sistema. Problem se pojavlja od julija 2014 in vpliva na različice jedra, ki se začnejo z 3.16. Odprava ranljivosti je bila usklajena z skupnostjo in sprejeta v jedro 19. julija. Glavne distribucije so že pripravile posodobitve paketov z jedrom (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Ranljivost je posledica pomanjkanja preverjanja rezultata pretvorbe tipa size_t v int pred izvedbo operacij v kodi seq_file, ki ustvarja datoteke iz zaporedja zapisov. Pomanjkanje preverjanja lahko privede do pisanja prek meja predpomnilnika pri ustvarjanju, montiranju in brisanju strukture imenikov z zelo visokim nivojem globine (velikost poti več kot 1 GB). Rezultati so, da lahko napadalec doseže zapis 10-bajtne vrstice "//deleted" z offsetom "-2 GB - 10 bajtov", ki kaže na območje, takoj pred dodeljenim predpomnilnikom.

Pripravljen eksploit zahteva za delovanje 5 GB pomnilnika in 1 milijon prostih inode-ov. Delo eksploita je osredotočeno na ustvarjanje hierarhije približno milijon globokih imenikov preko klica mkdir(), kar doseže velikost datotečne poti, ki presega 1 GB. Ta imenik se montira preko bind-mount v ločenem prostoru identifikatorjev uporabnikov (user namespace), nato pa se sproži funkcija rmdir() za njegovo brisanje. Hkrati se ustvari nit, ki naloži majhno eBPF-program, ki se blokira v fazi po preverjanju psevdokode eBPF, vendar pred njegovo JIT-kompilacijo.

V neprivilegiranem prostoru imen identifikatorjev uporabnikov se odpre datoteka /proc/self/mountinfo in začne branje dolge poti kataloga, ki je bila pritrjena z uporabo bind-mount, kar pripelje do zapisa vrstice "//deleted" v območje pred začetkom predpomnilnika. Mesto za zapis vrstice se izbere tako, da prepiše ukaz v že preverjenem, a še ne skompajliranem programu eBPF.

Nato na ravni programa eBPF nekontrolirano zapisovanje zunaj predpomnilnika preoblikuje v obvladljivo možnost branja in pisanja v druge strukture jedra preko manipulacije s strukturami btf in map_push_elem. Na koncu eksploitat določi lokacijo predpomnilnika modprobe_path[] v pomnilniku jedra in prepiše v njem pot "/sbin/modprobe", kar omogoča zagon katerega koli izvršljivega datoteke s pravicami root ob izvedbi klica request_module(), ki se izvede, na primer, pri ustvarjanju vtičnice netlink.

Raziskovalci navajajo več obvodnih metod zaščite, ki so učinkovite le za določen eksploitat, vendar ne odpravljajo same težave. Priporočljivo je nastaviti parameter "/proc/sys/kernel/unprivileged_userns_clone" na vrednost 0 za prepoved montaže katalogov v ločenem prostoru imen identifikatorjev uporabnikov, prav tako pa "/proc/sys/kernel/unprivileged_bpf_disabled" na 1 za prepoved nalaganja programov eBPF v jedro.

Zanimivo je, da so raziskovalci pri pregledu alternativne variante napada, povezane z uporabo mehanizma FUSE namesto bind-mount za montažo velikega kataloga, naleteli na še eno ranljivost (CVE-2021-33910), ki zadeva sistemski upravitelj systemd. Izkazalo se je, da pri poskusu montaže preko FUSE kataloga s potjo, ki presega 8 MB, v upravnem procesu inicializacije (PID1) pride do izčrpanja pomnilnika sklada in zrušitve, kar sistem pripelje v stanje "panic".

Težava je v tem, da systemd sledi in analizira vsebino /proc/self/mountinfo in obdeluje vsako točko montiranja v funkciji unit_name_path_escape(), kjer se izvede operacija strdupa(), ki shranjuje podatke na sklad, namesto v dinamično dodeljeno pomnilnik. Ker je največja velikost sklada omejena z RLIMIT_STACK, obdelava prevelike poti do točke montiranja povzroči zrušitev procesa PID1 in ustavitev delovanja sistema. Za napad se lahko uporabi osnovni modul FUSE v kombinaciji z uporabo kot točke montiranja mape z veliko stopnjo gnezdenja, kjer velikost poti presega 8 MB.

Težava se pojavi od systemd 220 (aprila 2015), že odpravljena v glavnem repozitoriju systemd in popravili so jo v distribucijah (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Zanimivo je, da v izdaji systemd 248 eksploit ne deluje zaradi napake v kodi systemd, ki povzroči zrušitev pri obdelavi /proc/self/mountinfo. Prav tako je zanimivo, da se je leta 2018 pojavila podobna situacija in pri poskusu pisanja eksploit za ranljivost CVE-2018-14634 v jedru Linux, so raziskovalci podjetja Qualys naleteli na tri kritične ranljivosti v systemd.

Izvor: opennet.ru

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster