Root-sårbarhed i Linux-kernen og denial-of-service i systemd

Sikkerhedsforskere fra Qualys har afsløret detaljerne om to sårbarheder, der berører Linux-kernen og systemadministrator-systemet systemd. Sårbarheden i kernen (CVE-2021-33909) giver en lokal bruger mulighed for at udføre kode med root-rettigheder gennem manipulation af dybt indlejrede kataloger.

Faren ved sårbarheden forværres af, at forskerne har været i stand til at forberede fungerende exploits, der fungerer i Ubuntu 20.04/20.10/21.04, Debian 11 og Fedora 34 i standardkonfigurationen. Det bemærkes, at andre distributioner ikke er blevet testet, men teoretisk set også kan være påvirket og udsat for angreb. Den komplette kodning af exploits forventes offentliggjort efter at problemet er blevet udbedret globalt, mens en begrænset prototype, der forårsager systemnedbrud, allerede er tilgængelig. Problemet har været til stede siden juli 2014 og berører kerneudgivelser fra version 3.16. Rettelsen af sårbarheden blev koordineret med samfundet og blev inkluderet i kernen den 19. juli. De vigtigste distributioner har allerede udgivet opdateringer af pakkerne med kernen (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Sårbarheden skyldes manglen på kontrol af resultatet af typekonverteringen fra size_t til int, før der udføres operationer i seq_file-koden, som opretter filer fra sekvenser af post. Manglen på kontrol kan føre til skrivning uden for buffergrænserne ved oprettelse, montering og sletning af en katalogstruktur med en meget høj indlejring (størrelse på stien over 1 GB). Som et resultat kan en angriber opnå skrivning af en 10-byte streng "//deleted" med en offset på "-2 GB - 10 bytes", der angiver området lige før det tildelte buffer.

Den forberedte exploit kræver 5 GB hukommelse og 1 million ledige inode. Exploitens operation reduceres til at oprette en hierarki af omkring en million indlejrede kataloger ved hjælp af mkdir()-kaldet for at opnå en filstørrelse på mere end 1 GB. Dette katalog monteres via bind-mount i et separat bruger-ID-navnerum og derefter startes rmdir()-funktionen for at slette det. Samtidig oprettes en tråd, der indlæser et lille eBPF-program, som blokeres i et trin efter kontrol af eBPF-pseudokoden, men før dens JIT-kompilering.

I et ikke-privilegeret brugernavnsnavneområde åbnes filen /proc/self/mountinfo, og en lang sti til en mappe, der er monteret via bind-mount, læses, hvilket fører til, at strengen «//deleted» skrives ind i området før begyndelsen af bufferen. Positionen for skrivningen vælges på en sådan måde, at den overskriver instruktionen i et allerede kontrolleret, men endnu ikke kompilere program eBPF.

Derefter på eBPF-programniveau transformeres en ukontrolleret skrivning uden for bufferen til en kontrolleret mulighed for at læse og skrive til andre kerne strukturer gennem manipulation af btf- og map_push_elem-strukturerne. Som følge heraf bestemmer exploiten placeringen af buffer modprobe_path[] i kernens hukommelse og overskriver det med stien «/sbin/modprobe», hvilket muliggør at starte enhver eksekverbar fil med root-rettigheder, når der foretages et request_module()-kald, som for eksempel udføres ved oprettelse af en netlink-socket.

Forskere præsenterer flere mellemløsninger for beskyttelse, der kun er effektive for det specifikke exploit, men som ikke løser selve problemet. Det anbefales at sætte parameteren «/proc/sys/kernel/unprivileged_userns_clone» til 0 for at forbyde montering af mapper i et separat brugernavnsnavneområde samt «/proc/sys/kernel/unprivileged_bpf_disabled» til 1 for at forbyde indlæsning af eBPF-programmer i kernen.

Bemærkelsesværdigt er det, at da man undersøgte et alternativt angreb, der involverer brug af FUSE-mekanismen i stedet for bind-mount til at montere en stor mappe, stødte forskerne på en anden sårbarhed (CVE-2021-33910), der berører systemmanageren systemd. Det viste sig, at når man forsøger at montere en mappe via FUSE med en sti, der overstiger 8 MB, opstår der et stack-mindretter i init-processen (PID1), hvilket fører til et crash, der bringer systemet i en tilstand af «panic».

Problemet skyldes, at systemd overvåger og analyserer indholdet af /proc/self/mountinfo og behandler hver monteringspunkt i funktionen unit_name_path_escape(), hvor operationen strdupa() udføres, hvilket placerer dataene på stakken i stedet for i dynamisk tildelt hukommelse. Da den maksimale størrelse af stakken er begrænset gennem RLIMIT_STACK, fører behandlingen af en for lang sti til monteringspunktet til, at processen PID1 crasher, hvilket stopper systemets drift. Angrebet kan udføres ved hjælp af et simpelt FUSE-modul kombineret med brugen af et katalog som monteringspunkt, som har et højt niveau af indlejring, hvor stiens størrelse overstiger 8 MB.

Problemet optræder fra systemd 220 (april 2015) og er allerede blevet løst i hovedlageret for systemd og rettet i distributionerne (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Bemærkelsesværdigt er det, at exploit i systemd 248 ikke fungerer på grund af en fejl i systemd-koden, der forårsager nedbrud under behandlingen af /proc/self/mountinfo. Det er også interessant, at i 2018 opstod en lignende situation, og ved forsøg på at skrive et exploit mod sårbarheden CVE-2018-14634 i Linux-kernen, stødte forskerne fra Qualys på tre kritiske sårbarheder i systemd.

Kilde: opennet.ru

Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere 🔥 Køb pålidelig webhosting med DDoS-beskyttelse, VPS VDS-servere | ProHoster