I Netfilter, Linux-kjernesystemet som brukes til filtrering og modifikasjon av nettverkspakker, er det funnet en sårbarhet (CVE-2021-22555) som lar en lokal bruker oppnå root-rettigheter i systemet, selv når de er i en isolert container. Det er utviklet en fungerende prototype av en exploit for å omgå KASLR-, SMAP- og SMEP-beskyttelsesmekanismene. Forskeren som oppdaget sårbarheten, mottok en belønning på 20 000 dollar fra Google for å avdekke hvordan man kan omgå containerisolasjonen i Kubernetes-klyngen kCTF.
Problemet har vært tilstede siden kjernen 2.6.19, utgitt for 15 år siden, og skyldes en feil i håndteringene IPT_SO_SET_REPLACE og IP6T_SO_SET_REPLACE, som fører til buffer overflow ved sending av spesialformaterte parametere gjennom calls til setsockopt i kompatibilitetsmodus. Vanligvis kan kun root-brukeren utføre compat_setsockopt()-anropet, men de nødvendige rettighetene for å utføre angrepet kan også oppnås av ikke-privilegerte brukere i systemer som har støtte for brukerrom (user namespaces) aktivert.
En bruker kan opprette en container med en separat root-bruker og utnytte sårbarheten derfra. For eksempel er «user namespaces» som standard aktivert i Ubuntu og Fedora, men ikke aktivert i Debian og RHEL. En patch for å fikse sårbarheten ble inkludert i Linux-kjernen 13. april. Pakkene for oppdatering er allerede forberedt av Debian-, Arch Linux- og Fedora-prosjektene. I Ubuntu, RHEL og SUSE er oppdateringene under forberedelse.
Problemet oppstår i funksjonen xt_compat_target_from_user() på grunn av feil beregning av minnestørrelsen når kjernesstrukturer lagres etter konvertering fra 32- til 64-biters representasjon. Feilen tillater skriving av fire null bytes på hvilken som helst posisjon utenfor den tildelte bufferen, begrenset av offset 0x4C. Denne muligheten viste seg å være tilstrekkelig for å lage en exploit som gir root-rettigheter – ved å nullstille pekerens m_list->next i msg_msg-strukturen ble det skapt betingelser for tilgang til data etter minnefrigjøring (use-after-free), som deretter ble brukt for å få informasjon om adresser og endre andre strukturer gjennom manipulering med systemanropet msgsnd().
Kilde: opennet.ru
