Vulnerabiliteti Root në bërthamën Linux dhe ndalimi i shërbimit në systemd

Studiuesit e sigurisë nga kompania Qualys kanë zbuluar detaje për dy cenueshmëri që prekin kernelin Linux dhe menaxherin e sistemit systemd. Cenueshmëria në kernel (CVE-2021-33909) i lejon një përdoruesi lokal të arrijë ekzekutimin e kodit me privilegje root përmes manipulimeve me direktorë me nivel të madh thellësie.

Rreziku i cenueshmërisë rëndohet edhe më shumë nga fakti se studiuesit arritën të përgatisin exploite funksionale që punojnë në Ubuntu 20.04/20.10/21.04, Debian 11 dhe Fedora 34 me konfigurimin e parazgjedhur. Theksohet se shpërndarjet e tjera nuk janë testuar, por teorikisht gjithashtu preken nga problemi dhe mund të sulmohen. Kodi i plotë i exploiteve premtohet të publikohet pasi problemi të jetë zgjidhur gjerësisht, ndërsa për momentin është i disponueshëm vetëm një prototip me funksionalitet të kufizuar, i cili shkakton rrëzimin e sistemit. Problemi shfaqet që nga korriku i vitit 2014 dhe prek versionet e kernelit duke filluar nga 3.16. Korrigjimi i cenueshmërisë u koordinua me komunitetin dhe u pranua në përbërjen e kernelit më 19 korrik. Shpërndarjet kryesore tashmë kanë përgatitur përditësime të paketave me kernelin (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

CenueshmĂ«ria shkaktohet nga mungesa e kontrollit tĂ« rezultatit tĂ« konvertimit tĂ« tipit size_t nĂ« int pĂ«rpara kryerjes sĂ« operacioneve nĂ« kodin seq_file, i cili merret me krijimin e skedarĂ«ve nga njĂ« sekuencĂ« regjistrimesh. Mungesa e kontrollit mund tĂ« çojĂ« nĂ« shkrim jashtĂ« kufijve tĂ« buffer-it gjatĂ« krijimit, montimit dhe fshirjes sĂ« njĂ« strukture direktorĂ«sh me nivel shumĂ« tĂ« madh thellĂ«sie (madhĂ«sia e rrugĂ«s mĂ« e madhe se 1 GB). Si rezultat, sulmuesi mund tĂ« arrijĂ« tĂ« shkruajĂ« vargun 10-bajtĂ«sh “//deleted” me zhvendosjen “- 2 GB — 10 bajt”, qĂ« tregon njĂ« zonĂ« menjĂ«herĂ« pĂ«rpara buffer-it tĂ« alokuar.

Exploit-i i përgatitur kërkon 5 GB memorie dhe 1 milion inode të lira për të funksionuar. Funksionimi i exploit-it konsiston në krijimin, përmes thirrjes mkdir(), të një hierarkie me rreth një milion direktorë të futur njëri brenda tjetrit për të arritur një madhësi të rrugës së skedarit që tejkalon 1 GB. Ky direktor montohet përmes bind-mount në një hapësirë të veçantë emrash të identifikuesve të përdoruesve (user namespace), pas së cilës niset funksioni rmdir() për fshirjen e tij. Paralelisht krijohet një thread që ngarkon një program të vogël eBPF, i cili bllokohet në fazën pas verifikimit të pseudokodit eBPF, por përpara JIT-kompilimit të tij.

Në hapësirën e emrave të identifikuesve të përdoruesit pa privilegje, hapet skedari /proc/self/mountinfo dhe nis leximi i shtegut të gjatë të drejtorisë së montuar me bind-mount, gjë që shkakton shkrimin e vargut «//deleted» në zonën përpara fillimit të buferit. Pozicioni për shkrimin e vargut zgjidhet në mënyrë të tillë që të mbishkruajë një instruksion në një program eBPF që tashmë është verifikuar, por ende nuk është kompiluar.

Më pas, në nivelin e programit eBPF, shkrimi i pakontrolluar jashtë buferit shndërrohet në një mundësi të kontrolluar për lexim dhe shkrim në struktura të tjera të kernelit përmes manipulimit të strukturave btf dhe map_push_elem. Si rezultat, exploit-i përcakton vendndodhjen e buferit modprobe_path[] në memorien e kernelit dhe mbishkruan në të shtegun «/sbin/modprobe», çka bën të mundur nisjen e çdo skedari të ekzekutueshëm me të drejta root në rast se kryhet thirrja request_module(), e cila ekzekutohet, për shembull, gjatë krijimit të një socket netlink.

Studiuesit paraqesin disa metoda anashkalimi të mbrojtjes, të cilat janë efektive vetëm për këtë exploit specifik, por nuk e zgjidhin vetë problemin. Rekomandohet që parametri «/proc/sys/kernel/unprivileged_userns_clone» të vendoset në vlerën 0 për të ndaluar montimin e drejtorive në një hapësirë të veçantë emrash të identifikuesve të përdoruesit, si dhe «/proc/sys/kernel/unprivileged_bpf_disabled» në 1 për të ndaluar ngarkimin e programeve eBPF në kernel.

Vlen të theksohet se, gjatë analizës së një varianti alternativ të sulmit, të lidhur me përdorimin e mekanizmit FUSE në vend të bind-mount për montimin e një drejtorie të madhe, studiuesit hasën edhe një cenueshmëri tjetër (CVE-2021-33910), që prek menaxherin e sistemit systemd. U zbulua se, gjatë përpjekjes për të montuar përmes FUSE një direktori me madhësi shtegu që tejkalon 8 MB, në procesin e inicializimit të menaxhimit (PID1) ndodh shterim i memories së stack-ut dhe një dështim kritik, i cili e çon sistemin në gjendjen «panic».

Problemi lidhet me faktin që systemd gjurmon dhe analizon përmbajtjen e /proc/self/mountinfo dhe përpunon çdo pikë montimi në funksionin unit_name_path_escape(), ku kryhet operacioni strdupa(), i cili i vendos të dhënat në stack dhe jo në memorien e alokuar dinamikisht. Meqenëse madhësia maksimale e stack-ut kufizohet përmes RLIMIT_STACK, përpunimi i një rruge tepër të madhe të pikës së montimit çon në rrëzimin e procesit PID1 dhe në ndalimin e sistemit. Për sulmin mund të përdoret një modul shumë i thjeshtë FUSE në kombinim me përdorimin si pikë montimi të një direktoriumi me nivel të lartë folezimi, ku madhësia e rrugës tejkalon 8 MB.

Problemi shfaqet që nga systemd 220 (prill 2015), tashmë është eliminuar në depozitorin kryesor të systemd dhe është rregulluar në shpërndarjet (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Vlen të theksohet se në versionin systemd 248 exploiti nuk funksionon për shkak të një gabimi në kodin e systemd, i cili shkakton dështim gjatë përpunimit të /proc/self/mountinfo. Interesant është edhe fakti që në vitin 2018 u shfaq një situatë e ngjashme dhe, gjatë përpjekjes për të shkruar një exploit për cenueshmërinë CVE-2018-14634 në kernelin Linux, studiuesit e Qualys hasën në tre cenueshmëri kritike në systemd.

Burimi: opennet.ru

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster