Korenska ranljivost v jedru Linuxa in zavrnitev storitve v systemd

Varnostni raziskovalci iz Qualysa so razkrili podrobnosti dveh ranljivosti, ki vplivata na jedro Linuxa in sistemskega upravitelja systemd. Ranljivost v jedru (CVE-2021-33909) omogoča lokalnemu uporabniku, da doseže izvajanje kode s korenskimi pravicami z manipulacijo visoko ugnezdenih imenikov.

Nevarnost ranljivosti je še večja zaradi dejstva, da so raziskovalci lahko pripravili delujoče podvige, ki delujejo na Ubuntu 20.04/20.10/21.04, Debian 11 in Fedora 34 v privzeti konfiguraciji. Opozoriti je treba, da druge distribucije niso bile testirane, vendar so teoretično prav tako dovzetne za težavo in jih je mogoče napadeti. Celotna koda podvigov naj bi bila objavljena, ko bo težava povsod odpravljena, vendar je za zdaj na voljo le prototip z omejeno funkcionalnostjo, ki povzroča sesutje sistema. Težava je prisotna od julija 2014 in vpliva na izdaje jedra od 3.16. Popravek ranljivosti je bil usklajen s skupnostjo in sprejet v jedro 19. julija. Glavne distribucije so že ustvarile posodobitve svojih paketov jedra (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Ranljivost je posledica neuspešnega preverjanja rezultata pretvorbe size_t v int pred izvedbo operacij v kodi seq_file, ki ustvari datoteke iz zaporedja zapisov. Če preverjanja ne opravite, lahko pride do pisanja izven meja v medpomnilnik pri ustvarjanju, nameščanju in brisanju zelo ugnezdene strukture imenika (velikost poti je večja od 1 GB). Posledično lahko napadalec doseže 10-bajtni niz "//izbrisano", zapisan z odmikom "-2 GB - 10 bajtov", ki kaže na območje neposredno pred dodeljenim medpomnilnikom.

Pripravljeni exploit za delovanje zahteva 5 GB pomnilnika in 1 milijon prostih inodov. Izkoriščanje deluje tako, da pokliče mkdir(), da ustvari hierarhijo približno milijona podimenikov, da doseže velikost poti datoteke, ki presega 1 GB. Ta imenik je nameščen prek bind-mount v ločen uporabniški imenski prostor, po katerem se zažene funkcija rmdir(), da ga odstrani. Vzporedno se ustvari nit, ki naloži majhen program eBPF, ki je blokiran na stopnji po preverjanju psevdokoda eBPF, vendar pred njegovo JIT kompilacijo.

V neprivilegiranem imenskem prostoru ID-ja uporabnika se odpre datoteka /proc/self/mountinfo in prebere dolgo ime poti povezovalno nameščenega imenika, zaradi česar se niz "//izbrisano" zapiše v območje pred začetkom vmesnega pomnilnika. Položaj za pisanje vrstice je izbran tako, da prepiše navodilo v že preizkušenem, a še neprevedenem programu eBPF.

Nato se na ravni programa eBPF nenadzorovano pisanje izven medpomnilnika spremeni v nadzorovano zmožnost branja in pisanja v druge strukture jedra z manipulacijo struktur btf in map_push_elem. Posledično izkoriščanje določi lokacijo medpomnilnika modprobe_path[] v pomnilniku jedra in prepiše pot »/sbin/modprobe« v njem, kar vam omogoča, da sprožite zagon katere koli izvedljive datoteke s korenskimi pravicami v primeru klic request_module(), ki se izvede na primer pri ustvarjanju vtičnice netlink.

Raziskovalci nudijo več rešitev, ki so učinkovite samo za določeno izkoriščanje, vendar ne odpravijo same težave. Priporočljivo je, da nastavite »/proc/sys/kernel/unprivileged_userns_clone« na 0, da onemogočite pripenjanje imenikov v ločenem imenskem prostoru ID-ja uporabnika, in »/proc/sys/kernel/unprivileged_bpf_disabled« na 1, da onemogočite nalaganje programov eBPF v jedro.

Omeniti velja, da so raziskovalci med analiziranjem alternativnega napada, ki vključuje uporabo mehanizma FUSE namesto bind-mound za namestitev velikega imenika, naleteli na drugo ranljivost (CVE-2021-33910), ki je prizadela sistemskega upravitelja systemd. Izkazalo se je, da pri poskusu priklopa imenika z velikostjo poti, ki presega 8 MB prek FUSE, procesu inicializacije nadzora (PID1) zmanjka pomnilnika sklada in se zruši, kar sistem spravi v stanje "panike".

Težava je v tem, da systemd sledi in razčlenjuje vsebino /proc/self/mountinfo ter obdeluje vsako točko vpetja v funkciji unit_name_path_escape(), ki izvaja operacijo strdupa(), ki podatke postavi v sklad in ne v dinamično dodeljen pomnilnik . Ker je največja velikost sklada omejena z RLIMIT_STACK, obdelava prevelike poti do točke vpetja povzroči, da se proces PID1 zruši in zaustavi sistem. Za napad lahko uporabite najpreprostejši modul FUSE v kombinaciji z uporabo visoko ugnezdenega imenika kot točke priklopa, katerega velikost poti presega 8 MB.

Težava se pojavlja že od systemd 220 (april 2015), že je bila odpravljena v glavnem repozitoriju systemd in odpravljena v distribucijah (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Predvsem v izdaji systemd 248 izkoriščanje ne deluje zaradi napake v kodi systemd, zaradi katere obdelava /proc/self/mountinfo ne uspe. Zanimivo je tudi, da je leta 2018 prišlo do podobne situacije in ko so poskušali napisati exploit za ranljivost CVE-2018-14634 v jedru Linuxa, so raziskovalci Qualysa naleteli na tri kritične ranljivosti v systemd.

Vir: opennet.ru

Dodaj komentar