V jadre Linux bola zistená zraniteľnosť (CVE-2021-3609), ktorá umožňuje miestnemu používateľovi zvýšiť svoje práva v systéme. Problém je spôsobený pretečením stavu pri implementácii protokolu CAN BCM a prejavuje sa vo verziách jadra Linux od 2.6.25 po 5.13-rc6. V distribúciách problém zatiaľ zostáva neopravný (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).
Výskumník, ktorý zistil zraniteľnosť, dokázal pripraviť exploit na získanie práv root na systémoch s jadrami Linux 5.4 a novšími, vrátane preukázania možnosti úspešného vykonania útoku v Ubuntu 20.04.02 LTS. Nie je vylúčená možnosť úpravy exploitu pre staršie jadrá (v jadre 5.4 bol kód CAN BCM (net/can/bcm.c) preložený z hrtimer_tasklet na HRTIMER_MODE_SOFT).
Protokol CAN BCM umožňuje registrovať vlastný spracovateľ správ prichádzajúcich cez zbernicu CAN (controller area network) a pripojiť ho k určitému sieťovému socketu. Po príchode prichádzajúcej správy sa vyvoláva funkcia bcm_rx_handler(). Útočník môže využiť pretečenie stavu a dosiahnuť uzavretie sieťového socketu súčasne s vykonávaním bcm_rx_handler(). Pri uzavretí socketu sa vyvoláva funkcia bcm_release(), v ktorej sa uvoľňuje pamäť pridelená pre štruktúry bcm_op a bcm_sock, ktoré sa stále používajú v ešte prebiehajúcom spracovateľovi bcm_rx_handler(). Vzniká situácia, ktorá vedie k prístupu k už uvoľnenému bloku pamäte (use-after-free).
Útok spočíva v otvorení dvoch socketov CAN BCM a ich pripojení k rozhraniu vcan. V prvom socketu sa vykonáva volanie sendmsg() s príznakom RX_SETUP na nastavenie spracovateľa prichádzajúcich správ CAN, zatiaľ čo v druhom socketu sa vykonáva volanie sendmsg() na odoslanie správy do prvého socketu. Po príchode správy sa spúšťa volanie bcm_rx_handler(), a útočník si vyberie správny okamih a uzavrie prvý socket, čo vedie k spusteniu bcm_release() a uvoľneniu štruktúr bcm_op a bcm_sock, hoci práca bcm_rx_handler() ešte nie je dokončená.
Manipuláciou s obsahom bcm_sock môže útočník predefinovať ukazovateľ na funkciu sk->sk_data_ready(sk), presmerovať vykonávanie a pomocou techník návratne orientovaného programovania (ROP – Return-Oriented Programming) usporiadať prepísanie parametra modprobe_path s cieľom vykonať svoj kód s právami root. Pri použití techniky ROP sa útočník nesnaží umiestniť svoj kód do pamäte, ale operuje s už existujúcimi časťami strojových inštrukcií v načítaných knižniciach, ktoré končia inštrukciou na návrat kontroly (zvyčajne ide o konce knižničných funkcií). Práca exploitu spočíva v vytvorení reťazca volaní podobných blokov („gadgets“) pre získanie požadovanej funkcionality.

Na útok je potrebný prístup na vytváranie socketov CAN a nastavené sieťové rozhranie vcan. Potrebné oprávnenia na uskutočnenie útoku môže získať nepriviligovaný používateľ v kontajneroch vytváraných v systémoch s aktivovanou podporou priestorov menných identifikátorov (user namespaces). Napríklad, user namespaces sú predvolene zapnuté v Ubuntu a Federe, ale nie sú aktivované v Debiane a RHEL.
Zdroj: opennet.ru
