V jádře Linux byla zjištěna zranitelnost (CVE-2021-3609), která umožňuje místnímu uživateli zvýšit své privilegium v systému. Problém je způsoben stavem závodu v implementaci protokolu CAN BCM a projevuje se ve verzích jádra Linux od 2.6.25 po 5.13-rc6. V distribucích zůstává problém zatím neopravený (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).
Výzkumník, který zranitelnost odhalil, dokázal připravit exploit pro získání práv root na systémech s jádry Linux 5.4 a novějšími, včetně možnosti úspěšného provedení útoku na Ubuntu 20.04.02 LTS. Není vyloučeno, že exploit bude přepracován i pro starší jádra (v jádře 5.4 byl kód CAN BCM (net/can/bcm.c) přenesen z hrtimer_tasklet na HRTIMER_MODE_SOFT).
Protokol CAN BCM umožňuje registrovat vlastní zpracovatel zpráv, které přicházejí přes sběrnici CAN (controller area network), a připojit ho k určitému síťovému socketu. Při přijetí příchozí zprávy je vyvolána funkce bcm_rx_handler(). Útočník může využít stav závodu a dosáhnout uzavření síťového socketu současně s vykonáváním bcm_rx_handler(). Při uzavření socketu se volá funkce bcm_release(), ve které je uvolněna paměť alokovaná pro struktury bcm_op a bcm_sock, které se stále používají v ještě vykonávaném zpracovateli bcm_rx_handler(). Vzniká situace vedoucí k přístupu k již uvolněnému bloku paměti (use-after-free).
Útok spočívá v otevření dvou socketů CAN BCM a jejich připojení k rozhraní vcan. V prvním socketu se provede volání sendmsg() s flagem RX_SETUP pro nastavení zpracovatele příchozích zpráv CAN, a ve druhém socketu se provede volání sendmsg() pro odeslání zprávy do prvního socketu. Po přijetí zprávy se spustí volání bcm_rx_handler(), a útočník si vybere správný okamžik a uzavře první socket, což vede k vyvolání bcm_release() a uvolnění struktur bcm_op a bcm_sock, přestože práce bcm_rx_handler() ještě není dokončena.
Pomocí manipulace s obsahem bcm_sock může útočník přepsat ukazatel na funkci sk->sk_data_ready(sk), přesměrovat provádění a za pomocí technik návratově orientovaného programování (ROP – Return-Oriented Programming) zajistit přepsání parametru modprobe_path a dosáhnout spuštění svého kódu s právy roota. Při použití techniky ROP útočník není schopen umístit svůj kód do paměti, ale operuje s existujícími bloky strojových instrukcí v načtených knihovnách, které končí instrukcí návratu řízení (většinou se jedná o konce knihovních funkcí). Činnost exploitu spočívá v sestavení řetězce volání obdobných bloků („gadgets“) pro získání požadované funkčnosti.

K provedení útoku je zapotřebí mít přístup k vytváření CAN socketů a nastavené síťové rozhraní vcan. Nezbytná oprávnění pro provedení útoku může získat neprivilegovaný uživatel v kontejnerech vytvářených v systémech s aktivovanou podporou prostorů jmen identifikátorů uživatelů (user namespaces). Například, user namespaces jsou ve výchozím nastavení aktivovány v Ubuntu a Fedoře, ale nejsou povoleny v Debiánu a RHEL.
Zdroj: opennet.ru
