Der er fundet en sårbarhed i Linux-kernen (CVE-2021-3609), der tillader en lokal bruger at hæve sine privilegier i systemet. Problemet skyldes en race condition i implementeringen af CAN BCM-protokollen og manifesterer sig i Linux-kernens versioner fra 2.6.25 til 5.13-rc6. Problemet er endnu ikke blevet rettet i distributionerne (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).
Den forsker, der opdagede sårbarheden, har været i stand til at forberede et exploit til at opnå root-rettigheder på systemer med Linux-kernene 5.4 og nyere, inklusive en vellykket angrebsdemonstration i Ubuntu 20.04.02 LTS. Der er ikke udelukket, at exploit'en kan tilpasses til at fungere med ældre kerner (i kernen 5.4 blev CAN BCM-koden (net/can/bcm.c) overført fra hrtimer_tasklet til HRTIMER_MODE_SOFT).
CAN BCM-protokollen gør det muligt at registrere en egen beskedbehandler for beskeder, der modtages via CAN-bussen (controller area network), og knytte den til en bestemt netværkssocket. Når en indkommende besked modtages, kaldes funktionen bcm_rx_handler(). Angriberen kan udnytte race condition og opnå, at netværkssocketten lukkes samtidig med, at bcm_rx_handler() udføres. Når socketten lukkes, kaldes funktionen bcm_release(), som frigiver den hukommelse, der er afsat til strukturerne bcm_op og bcm_sock, som stadig er i brug af den kørende bcm_rx_handler(). Dette udløser en situation, der fører til adgang til en allerede frigivet hukommelsesblok (use-after-free).
Angrebet går ud på at åbne to CAN BCM-sockets og knytte dem til vcan-interface. I den første socket kaldes sendmsg() med flaget RX_SETUP for at konfigurere beskedbehandleren for indkommende CAN-beskeder, mens der i den anden socket udføres et sendmsg()-kald for at sende en besked til den første socket. Efter modtagelsen af beskeden udløses bcm_rx_handler(), og angriberen vælger det rette tidspunkt til at lukke den første socket, hvilket resulterer i, at bcm_release() køres og strukturerne bcm_op og bcm_sock frigives, selvom arbejdet i bcm_rx_handler() stadig ikke er færdigt.
Gennem manipulation af bcm_sock indholdet kan angriberen omdefinere funktionen sk->sk_data_ready(sk) pointer, omdirigere eksekveringen og ved hjælp af return-oriented programming (ROP) arrangere omskrivningen af modprobe_path parameteren og opnå kørsel af sin kode med root-rettigheder. Ved brug af ROP-teknikken forsøger angriberen ikke at placere sin kode i hukommelsen, men arbejder med eksisterende maskininstruksjoner i de indlæste biblioteker, som slutter med en returvejledning (det er typisk afslutningerne af biblioteksfunktioner). Arbejdet af exploiten reduceres til at opbygge en kæde af kald til sådanne blokke ('gadgets') for at opnå den ønskede funktionalitet.

For at udføre angrebet kræves adgang til at oprette CAN-sockets og en konfigureret netværksgrænseflade vcan. De nødvendige tilladelser til at udføre angrebet kan opnås af en ikke-privilegeret bruger i containere, der oprettes i systemer med aktiveret understøttelse af brugernavnrum (user namespaces). For eksempel er brugernavnrum som standard aktiveret i Ubuntu og Fedora, men ikke aktiveret i Debian og RHEL.
Kilde: opennet.ru
