U Linux kernelu otkrivena je ranjivost (CVE-2021-3609) koja omogućava lokalnom korisniku da podigne svoje privilegije u sistemu. Problem je uzrokovan stanjem utrke u implementaciji CAN BCM protokola i manifestuje se u verzijama Linux kernela od 2.6.25 do 5.13-rc6. U distribucijama problem trenutno ostaje neispravljen (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).
Istraživač koji je otkrio ranjivost uspio je pripremiti exploit za sticanje root prava na sistemima s Linux kernelima 5.4 i novijim, uključujući demonstraciju mogućnosti uspješnog izvođenja napada na Ubuntu 20.04.02 LTS. Nije isključena mogućnost dorade exploita i za rad s starijim kernelima (u kernelu 5.4 kod CAN BCM (net/can/bcm.c) je prebačen s hrtimer_tasklet na HRTIMER_MODE_SOFT).
CAN BCM protokol omogućava registraciju vlastitog obrtnika poruka koji dolaze preko CAN (controller area network) sabirnice i povezivanje istog na određeni mrežni soket. Kada stigne dolazna poruka, poziva se funkcija bcm_rx_handler(). Napadač može iskoristiti stanje utrke i postići zatvaranje mrežnog soketa istovremeno s izvršavanjem bcm_rx_handler(). Kada se soket zatvori, pokreće se funkcija bcm_release(), u kojoj se oslobađa memorija dodijeljena za strukture bcm_op i bcm_sock, koje se i dalje koriste u još uvijek izvršavanom obrtniku bcm_rx_handler(). Dolazi do situacije koja dovodi do pristupa već oslobođenoj memoriji (use-after-free).
Napad se svodi na otvaranje dva CAN BCM soketa i njihovo povezivanje na vcan interfejs. U prvom soketu izvršava se poziv sendmsg() s RX_SETUP zastavicom za podešavanje obrtnika dolaznih CAN poruka, dok se u drugom soketu izvršava poziv sendmsg() za slanje poruke u prvi soket. Nakon što poruka stigne, aktivira se poziv bcm_rx_handler(), a napadač odabire pravi trenutak i zatvara prvi soket, što dovodi do pokretanja bcm_release() i oslobađanja struktura bcm_op i bcm_sock, iako rad bcm_rx_handler() još nije završen.
Kroz manipulaciju s sadržajem bcm_sock napadač može redefinirati pokazivač na funkciju sk->sk_data_ready(sk), preusmjeriti izvršenje i pomoću tehnika povratno orijentiranog programiranja (ROP - Return-Oriented Programming) organizirati prepisivanje parametra modprobe_path i ostvariti izvršenje svog koda s root pravima. Pri korištenju ROP tehnike, napadač ne pokušava umetnuti svoj kod u memoriju, već koristi već postojeće dijelove strojnih instrukcija u učitanim bibliotekama, koji završavaju instrukcijom povratka kontrole (obično, to su završetci funkcija iz biblioteka). Rad eksploita svodi se na izgradnju lanca poziva sličnih blokova ('gadgets') za dobivanje željene funkcionalnosti.

Za napad je potreban pristup za stvaranje CAN soketa i konfiguriran mrežni sučelje vcan. Potrebne ovlasti za izvođenje napada mogu biti stečene od strane neprivilegiranog korisnika unutar kontejnera koji se stvaraju u sustavima s uključenom podrškom za prostore imenskih identifikatora korisnika (user namespaces). Na primjer, user namespaces je prema zadanim postavkama uključen u Ubuntu i Fedora, ali nije aktiviran u Debianu i RHEL-u.
Izvor: opennet.ru
