Rodsårbarhed i Linux-kernen og lammelsesangreb i systemd

Sikkerhedsforskere fra Qualys har afsløret detaljer om to sårbarheder, der påvirker Linux-kernen og systemadministratoren. En sårbarhed i kernen (CVE-2021-33909) gør det muligt for en lokal bruger at opnå kodeudførelse med root-rettigheder gennem manipulation af meget indlejrede mapper.

Faren for sårbarheden forværres af det faktum, at forskerne var i stand til at forberede arbejdsudnyttelser, der fungerer på 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å er modtagelige for problemet og kan angribes. Den fulde kode for udnyttelserne loves at blive offentliggjort, efter at problemet er elimineret overalt, men indtil videre er kun en prototype med begrænset funktionalitet tilgængelig, hvilket får systemet til at gå ned. Problemet har været til stede siden juli 2014 og påvirker kerneudgivelser fra 3.16. Sårbarhedsrettelsen blev koordineret med fællesskabet og accepteret i kernen den 19. juli. De vigtigste distributioner har allerede genereret opdateringer til deres kernepakker (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Sårbarheden er forårsaget af manglende kontrol af resultatet af en size_t til int-konvertering, før der udføres operationer i seq_file-koden, som opretter filer fra en sekvens af poster. Manglende kontrol kan resultere i out-of-bounds-skrivninger til bufferen, når en meget indlejret mappestruktur oprettes, monteres og slettes (stistørrelse større end 1 GB). Som et resultat kan en angriber opnå en 10-byte streng "//deleted" skrevet med en offset på "-2 GB - 10 bytes", der peger på området umiddelbart før den allokerede buffer.

Den forberedte udnyttelse kræver 5 GB hukommelse og 1 million gratis inoder for at fungere. Udnyttelsen virker ved at kalde mkdir() for at skabe et hierarki på omkring en million undermapper for at opnå en filstistørrelse på over 1 GB. Denne mappe monteres via bind-mount i et separat brugernavneområde, hvorefter funktionen rmdir() køres for at fjerne den. Parallelt oprettes der en tråd, der indlæser et lille eBPF-program, som blokeres på stadiet efter kontrol af eBPF-pseudokoden, men før dets JIT-kompilering.

I det uprivilegerede bruger-id-navneområde åbnes filen /proc/self/mountinfo, og det lange stinavn på den bind-monterede mappe læses, hvilket resulterer i, at strengen "//deleted" skrives til området før starten af ​​bufferen. Positionen til at skrive linjen er valgt, så den overskriver instruktionen i det allerede testede, men endnu ikke kompilerede eBPF-program.

Dernæst, på eBPF-programniveau, transformeres ukontrolleret skrivning uden for buffer til kontrolleret evne til at læse og skrive til andre kernestrukturer gennem manipulation af btf- og map_push_elem-strukturerne. Som et resultat bestemmer udnyttelsen placeringen af ​​modprobe_path[]-bufferen i kernehukommelsen og overskriver "/sbin/modprobe"-stien i den, hvilket giver dig mulighed for at starte lanceringen af ​​enhver eksekverbar fil med rodrettigheder i tilfælde af en request_module() opkald, som udføres, for eksempel, når der oprettes netlink socket.

Forskere giver adskillige løsninger, der kun er effektive til en specifik udnyttelse, men som ikke eliminerer selve problemet. Det anbefales at sætte "/proc/sys/kernel/unprivileged_userns_clone" til 0 for at deaktivere montering af mapper i et separat bruger-id-navneområde, og "/proc/sys/kernel/unprivileged_bpf_disabled" til 1 for at deaktivere indlæsning af eBPF-programmer i kernen.

Det er bemærkelsesværdigt, at mens forskerne analyserede et alternativt angreb, der involverede brugen af ​​FUSE-mekanismen i stedet for bind-mound til at montere en stor mappe, stødte forskerne på en anden sårbarhed (CVE-2021-33910), der påvirker systemd-systemadministratoren. Det viste sig, at når man forsøger at montere en mappe med en stistørrelse på over 8 MB via FUSE, løber kontrolinitialiseringsprocessen (PID1) tør for stakhukommelse og går ned, hvilket sætter systemet i en "panik"-tilstand.

Problemet er, at systemd sporer og analyserer indholdet af /proc/self/mountinfo og behandler hvert monteringspunkt i unit_name_path_escape()-funktionen, som udfører en strdupa()-operation, der placerer dataene på stakken i stedet for i dynamisk allokeret hukommelse . Da den maksimale stakstørrelse er begrænset via RLIMIT_STACK, får behandling af en for stor sti til monteringspunktet, at PID1-processen går ned og stopper systemet. Til et angreb kan du bruge det enkleste FUSE-modul i kombination med at bruge en meget indlejret mappe som et monteringspunkt, hvis stistørrelse overstiger 8 MB.

Problemet har opstået siden systemd 220 (april 2015), er allerede blevet rettet i systemd-hovedlageret og rettet i distributioner (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Navnlig i systemd release 248 virker udnyttelsen ikke på grund af en fejl i systemd-koden, der får behandlingen af ​​/proc/self/mountinfo til at mislykkes. Det er også interessant, at der i 2018 opstod en lignende situation, og da de forsøgte at skrive en udnyttelse af CVE-2018-14634-sårbarheden i Linux-kernen, stødte Qualys-forskere på tre kritiske sårbarheder i systemd.

Kilde: opennet.ru

Tilføj en kommentar