Root ranjivost u Linux kernelu i uskraćivanje usluge u systemd.

Istraživači sigurnosti iz kompanije Qualys otkrili su detalje o dvije ranjivosti koje pogađaju Linux kernel i sistemski menadžer systemd. Ranjivost u kernelu (CVE-2021-33909) omogućava lokalnom korisniku da izvrši kod s root privilegijama manipulacijom s direktorijima velike dubine.

Opasnost ranjivosti dodatno se povećava jer su istraživačima uspjeli pripremiti radne eksploite koji funkcionišu na Ubuntu 20.04/20.10/21.04, Debian 11 i Fedora 34 u zadanoj konfiguraciji. Napominje se da drugi distribucije nisu testirane, ali teoretski su takođe podložne problemu i mogu biti napadnute. Potpuni kod eksploita biće objavljen nakon što se problem univerzalno reši, a za sada je dostupan samo ograničeni prototip koji izaziva rušenje sistema. Problem se pojavljuje od jula 2014. godine i pogađa izdanja kernela od verzije 3.16. Korekcija ranjivosti koordinisana je s zajednicom i uključena u kernel 19. jula. Glavni distribucije već su formirali ažuriranja paketa s kernelom (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Ranjivost je uzrokovana nedostatkom provjere rezultata konverzije tipa size_t u int prije izvođenja operacija u kodu seq_file, koji stvara datoteke iz sekvenci zapisa. Nedostatak provjere može dovesti do pisanja izvan granica bafera pri stvaranju, montiranju i brisanju struktura direktorija s vrlo velikim nivoom ugniježdenosti (dužina putanje veća od 1 GB). Kao rezultat, napadač može postići pisanje 10-bajtne string "//deleted" s pomakom "- 2 GB - 10 bajtova", ukazujući na područje koje neposredno prethodi alociranom baferu.

Pripremljeni eksploit zahtijeva 5 GB memorije i 1 milion slobodnih inode-ova za rad. Funkcionalnost eksploita svodi se na stvaranje hijerarhije od oko milion ugniježdenih direktorija putem poziva mkdir() kako bi se postigla dužina datotečnog puta koja prelazi 1 GB. Ovaj direktorij se montira putem bind-mount u zasebnom prostoru imena identifikatora korisnika (user namespace), nakon čega se poziva funkcija rmdir() za njegovo brisanje. Paralelno se stvara nit koja učitava malu eBPF-program, koja se blokira u fazi nakon provjere pseudo-koda eBPF, ali prije njegove JIT-kompilacije.

U neprivilegiranom prostoru imena identifikatora korisnika otvara se datoteka /proc/self/mountinfo i započinje čitanje dugog puta direktorija, montiranog pomoću bind-mount, što dovodi do zapisivanja niza "//deleted" u područje prije početka predmemorije. Pozicija za zapisivanje niza bira se tako da prepisuje instrukciju u već provjerenom, ali još ne prevedenom programu eBPF.

Nakon toga, na razini programa eBPF, nekontrolirani zapis izvan predmemorije transformira se u kontroliranu mogućnost čitanja i pisanja u druge strukture jezgre putem manipulacije sa strukturama btf i map_push_elem. Na kraju, exploit određuje lokaciju predmemorije modprobe_path[] u memoriji jezgre i prepisuje u njoj put "\/sbin\/modprobe", što omogućava pokretanje bilo koje izvršne datoteke s pravima root u slučaju izvršenja poziva request_module(), koji se izvršava, na primjer, prilikom stvaranja netlink socketa.

Istraživači navode nekoliko zaobilaženja zaštitnih mjera koja su efikasna samo za određeni exploit, ali ne rješavaju samu problematiku. Preporučuje se postaviti parametar "/proc/sys/kernel/unprivileged_userns_clone" na vrijednost 0 za zabranu montiranja direktorija u zasebnom prostoru imena identifikatora korisnika, kao i "/proc/sys/kernel/unprivileged_bpf_disabled" na 1 za zabranu učitavanja eBPF programa u jezgru.

Zanimljivo je da, istražujući alternativnu metodu napada koja se odnosi na korištenje mehanizma FUSE umjesto bind-mount za montiranje velikog direktorija, istraživači su naišli na još jednu ranjivost (CVE-2021-33910) koja pogađa sistemski menadžer systemd. Utvrđeno je da prilikom pokušaja montiranja putem FUSE direktorija čija veličina puta premašuje 8 MB, u upravljačkom procesu inicijalizacije (PID1) dolazi do iscrpljenja memorije stiva i pada, što dovodi sustav u stanje "panic".

Problem je povezan s tim da systemd prati i analizira sadržaj /proc/self/mountinfo, te obrađuje svaku tačku montiranja u funkciji unit_name_path_escape(), u kojoj se izvršava operacija strdupa(), smještajući podatke na stog, a ne u dinamički alokiranu memoriju. Kako je maksimalna veličina stoga ograničena putem RLIMIT_STACK, obrada predugačkog puta ka tački montiranja dovodi do rušenja procesa PID1 i zaustavljanja rada sustava. Za napad se može iskoristiti jednostavan FUSE modul u kombinaciji s korištenjem direktorija s velikim nivoom ugniježdenosti kao tačke montiranja, čija veličina puta prelazi 8 MB.

Problem se manifestira od systemd 220 (travanj 2015), već je uklonjen u glavnom repozitoriju systemd i ispravljen u distribucijama (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Zanimljivo je da u izdanju systemd 248 eksploatacija ne funkcioniše zbog greške u kodu systemd, koja dovodi do rušenja prilikom obrade /proc/self/mountinfo. Također je zanimljivo da je 2018. godine došlo do slične situacije i prilikom pokušaja pisanja eksploata za ranjivost CVE-2018-14634 u Linux kernelu, istraživači Qualysa su naišli na tri kritične ranjivosti u systemd.

Izvor: opennet.ru

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster