Rotsårbarhet i Linux-kjernen og tjenestenekt i systemd

Sikkerhetsforskere fra Qualys har avslørt detaljer om to sårbarheter som påvirker Linux-kjernen og systemadministratoren. En sårbarhet i kjernen (CVE-2021-33909) lar en lokal bruker oppnå kodekjøring med rotrettigheter gjennom manipulering av svært nestede kataloger.

Faren for sårbarheten forverres av det faktum at forskerne var i stand til å forberede fungerende utnyttelser som fungerer på Ubuntu 20.04/20.10/21.04, Debian 11 og Fedora 34 i standardkonfigurasjonen. Det bemerkes at andre distribusjoner ikke er testet, men teoretisk sett også er mottakelige for problemet og kan angripes. Den fullstendige koden for utnyttelsene er lovet å bli publisert etter at problemet er eliminert overalt, men foreløpig er bare en prototype med begrenset funksjonalitet tilgjengelig, noe som får systemet til å krasje. Problemet har vært tilstede siden juli 2014 og påvirker kjerneutgivelser fra og med 3.16. Sårbarhetsreparasjonen ble koordinert med fellesskapet og akseptert i kjernen 19. juli. Hoveddistribusjonene har allerede generert oppdateringer til sine kjernepakker (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Sårbarheten er forårsaket av manglende kontroll av resultatet av en size_t til int-konvertering før du utfører operasjoner i seq_file-koden, som oppretter filer fra en sekvens av poster. Unnlatelse av å kontrollere kan føre til skriv utenfor grensene til bufferen når du oppretter, monterer og sletter en svært nestet katalogstruktur (banestørrelse større enn 1 GB). Som et resultat kan en angriper oppnå en 10-byte-streng "//deleted" skrevet med en forskyvning på "-2 GB - 10 bytes" som peker til området umiddelbart før den tildelte bufferen.

Den forberedte utnyttelsen krever 5 GB minne og 1 million ledige inoder for å fungere. Utnyttelsen fungerer ved å kalle mkdir() for å lage et hierarki på omtrent en million underkataloger for å oppnå en filbanestørrelse som overstiger 1 GB. Denne katalogen monteres via bind-mount i et eget brukernavnsområde, hvoretter funksjonen rmdir() kjøres for å fjerne den. Parallelt opprettes det en tråd som laster et lite eBPF-program, som blokkeres på stadiet etter å ha sjekket eBPF-pseudokoden, men før dets JIT-kompilering.

I det uprivilegerte brukernavnet åpnes filen /proc/self/mountinfo og det lange banenavnet til den bindingsmonterte katalogen leses, noe som resulterer i at strengen "//deleted" blir skrevet til området før starten av bufferen. Posisjonen for å skrive linjen er valgt slik at den overskriver instruksjonen i det allerede testede, men ennå ikke kompilerte eBPF-programmet.

Deretter, på eBPF-programnivå, blir ukontrollert skriving utenfor buffer transformert til kontrollert evne til å lese og skrive til andre kjernestrukturer gjennom manipulering av btf- og map_push_elem-strukturene. Som et resultat bestemmer utnyttelsen plasseringen av modprobe_path[]-bufferen i kjerneminnet og overskriver "/sbin/modprobe"-banen i den, som lar deg starte lanseringen av enhver kjørbar fil med rotrettigheter i tilfelle en request_module() kall, som utføres for eksempel når du oppretter nettlink-socket.

Forskere gir flere løsninger som bare er effektive for en spesifikk utnyttelse, men som ikke eliminerer selve problemet. Det anbefales å sette "/proc/sys/kernel/unprivileged_userns_clone" til 0 for å deaktivere monteringskataloger i et eget navneområde for bruker-ID, og ​​"/proc/sys/kernel/unprivileged_bpf_disabled" til 1 for å deaktivere lasting av eBPF-programmer inn i kjernen.

Det er bemerkelsesverdig at mens de analyserte et alternativt angrep som involverer bruk av FUSE-mekanismen i stedet for bind-haug for å montere en stor katalog, kom forskerne over en annen sårbarhet (CVE-2021-33910) som påvirker systemd-systembehandleren. Det viste seg at når du prøver å montere en katalog med en banestørrelse som overstiger 8 MB via FUSE, går kontrollinitialiseringsprosessen (PID1) tom for stabelminne og krasjer, noe som setter systemet i en "panikk"-tilstand.

Problemet er at systemd sporer og analyserer innholdet i /proc/self/mountinfo, og behandler hvert monteringspunkt i unit_name_path_escape()-funksjonen, som utfører en strdupa()-operasjon som plasserer dataene på stabelen i stedet for i dynamisk tildelt minne . Siden den maksimale stabelstørrelsen er begrenset via RLIMIT_STACK, vil behandling av en for stor bane til monteringspunktet føre til at PID1-prosessen krasjer og stopper systemet. For et angrep kan du bruke den enkleste FUSE-modulen i kombinasjon med å bruke en svært nestet katalog som et monteringspunkt, hvis banestørrelse overstiger 8 MB.

Problemet har dukket opp siden systemd 220 (april 2015), har allerede blitt fikset i systemd-lageret og fikset i distribusjoner (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Spesielt i systemutgave 248 fungerer ikke utnyttelsen på grunn av en feil i systemkoden som fører til at behandlingen av /proc/self/mountinfo mislykkes. Det er også interessant at en lignende situasjon oppsto i 2018, og da de prøvde å skrive en utnyttelse for CVE-2018-14634-sårbarheten i Linux-kjernen, kom Qualys-forskere over tre kritiske sårbarheter i systemd.

Kilde: opennet.ru

Legg til en kommentar