Root-sårbarhet i Linux-kärnan och tjänsteavbrott i systemd

Säkerhetsforskare från Qualys har avslöjat detaljer kring två sårbarheter som påverkar Linux-kärnan och systemhanteraren systemd. Sårbarheten i kärnan (CVE-2021-33909) tillåter en lokal användare att utföra kod med root-rättigheter genom manipulering av kataloger med djup nästling.

Faran med sårbarheten förvärras av att forskarna har lyckats ta fram fungerande exploits som fungerar i Ubuntu 20.04/20.10/21.04, Debian 11 och Fedora 34 i standardkonfiguration. Andra distributioner har inte testats, men teoretiskt sett är de också utsatta för problemet och kan attackeras. Den fullständiga koden för exploits lovas att publiceras efter att problemet har åtgärdats överallt, och just nu är endast en begränsad prototyp tillgänglig, vilken orsakar systemkrasch. Problemet har funnits sedan juli 2014 och påverkar kärnutgåvor från och med 3.16. Åtgärden för sårbarheten koordinerades med gemenskapen och antogs som del av kärnan den 19 juli. Större distributioner har redan skapat paketuppdateringar med kärnan (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch).

Sårbarheten orsakas av bristen på kontroll av resultaten vid typomvandling från size_t till int innan operationer utförs i seq_file-koden, vilken skapar filer från en sekvens av poster. Bristen på kontroll kan leda till skrivning i minnesområden utanför buffertgränserna vid skapande, montering och borttagning av katalogstrukturer med mycket djup nästling (sökvägsstorlek över 1 GB). Resultatet blir att en angripare kan åstadkomma en skrivning av en 10-bytes sträng "//deleted" med en offset av "-2 GB - 10 bytes", vilket pekar på området som omedelbart föregår den allokerade bufferten.

Den förberedda exploit kräver 5 GB minne och 1 miljon lediga inode. Exploiten arbetar med att skapa en hierarki av cirka en miljon nästlade kataloger via anropet mkdir() för att uppnå en filvägsstorlek som överstiger 1 GB. Denna katalog monteras via bind-mount i ett separat användarnamnsspace, varefter funktionen rmdir() körs för att ta bort den. Samtidigt skapas en tråd som laddar en liten eBPF-program som blockeras efter kontroll av pseudokoden för eBPF, men före dess JIT-kompilering.

I det icke-privilegierade namnutrymmet för användaridentifierare öppnas filen /proc/self/mountinfo och läsningen av den långa sökvägen till den monterade mappen som skapats med bind-mount inleds, vilket leder till att strängen "//deleted" skrivs till området före bufferns början. Positionen för att skriva strängen väljs så att den överskrider kommando i ett redan kontrollerat, men ännu inte kompilera eBPF-programmet.

Vid eBPF-programnivå transformeras okontrollerad skrivning utanför bufferten till en kontrollerad möjlighet att läsa och skriva i andra kärnstrukturer genom manipulering av btf-strukturer och map_push_elem. Som ett resultat identifierar exploiten platsen för buffern modprobe_path[] i kärnans minne och överskriver den med sökvägen "/sbin/modprobe", vilket möjliggör start av valfritt exekverbart program med root-rättigheter vid anrop av request_module(), som utförs exempelvis vid skapandet av en netlink-socket.

Forskare presenterar flera kringgåenden av skydd som endast är effektiva för specifika exploiter, men som inte löser själva problemet. Det rekommenderas att ställa in parametern "/proc/sys/kernel/unprivileged_userns_clone" till värdet 0 för att förbjuda montering av mappar i ett separat namnrum för användaridentifierare, samt "/proc/sys/kernel/unprivileged_bpf_disabled" till 1 för att förbjuda laddning av eBPF-program till kärnan.

Intressant nog, när de undersökte ett alternativt angrepp som involverade användningen av FUSE-mekanismen istället för bind-mount för montering av en stor katalog, stötte forskarna på en annan sårbarhet (CVE-2021-33910) som påverkade systemhanteraren systemd. Det visade sig att när man försökte montera en katalog via FUSE med en sökväg som översteg 8 MB, inträffade en stackminnesutsläpp i init-processen (PID1), vilket resulterade i ett krasch som förde systemet in i ett "panic"-tillstånd.

Problemet är relaterat till att systemd spårar och analyserar innehållet i /proc/self/mountinfo, och hanterar varje monteringspunkt i funktionen unit_name_path_escape(), där operationen strdupa() utförs, vilket placerar data på stacken snarare än i dynamiskt allokerat minne. Eftersom den maximala storleken på stacken begränsas av RLIMIT_STACK, leder hantering av en för lång monteringsväg till att processen PID1 kraschar och systemet slutar fungera. För en attack kan en enkel FUSE-modul användas i kombination med att använda en katalog med hög nivå av inslagning som monteringspunkt, vars väg överskrider 8 MB.

Problemet uppträder från och med systemd 220 (april 2015) och har redan åtgärdats i den huvudsakliga systemd-repo och korrigerats i distributioner (Debian, Ubuntu, Fedora, RHEL, SUSE, Arch). Det är värt att notera att i versionen systemd 248 fungerar inte exploiten på grund av en bugg i systemdkoden som leder till att hanteringen av /proc/self/mountinfo kraschar. Det är också intressant att en liknande situation uppstod 2018, och vid försöket att skriva en exploit för sårbarheten CVE-2018-14634 i Linux-kärnan stötte forskarna från Qualys på tre kritiska sårbarheter i systemd.

Källa: opennet.ru

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster