В ядрото на Linux е открита уязвимост (CVE-2021-3609), която позволява на локален потребител да повиши своите права в системата. Проблемът е предизвикан от състезателно състояние в реализацията на протокола CAN BCM и се проявява в версиите на ядрото на Linux от 2.6.25 до 5.13-rc6. В дистрибуциите проблемът все още не е поправен (RHEL, Fedora, Debian, Ubuntu, SUSE, Arch).
Изследователят, който е открил уязвимостта, е успял да подготви експлоит за получаване на права root на системи с ядра на Linux 5.4 и по-нови, включително е показана възможността за успешно провеждане на атака в Ubuntu 20.04.02 LTS. Не е изключена възможността експлоитът да бъде преработен и за работа с по-стари ядра (в ядрото 5.4 кодът CAN BCM (net/can/bcm.c) е преместен от hrtimer_tasklet към HRTIMER_MODE_SOFT).
Протоколът CAN BCM позволява регистрирането на собствен обработчик на съобщения, постъпващи през шина CAN (controller area network), и прикрепянето му към определен мрежов сокет. При постъпване на входящо съобщение се извиква функцията bcm_rx_handler(). Нападателят може да се възползва от състезателното състояние и да постигне затваряне на мрежовия сокет едновременно с изпълнението на bcm_rx_handler(). При затваряне на сокета се извиква функцията bcm_release(), в която се освобождава паметта, заделена за структура bcm_op и bcm_sock, които продължават да се използват в още изпълнявания обработчик bcm_rx_handler(). Възниква ситуация, довела до достъп до вече освободен блок памет (use-after-free).
Атаката се състои в отварянето на два сокета CAN BCM и привързването им към интерфейса vcan. В първия сокет се извършва извикване на sendmsg() с флага RX_SETUP за настройка на обработчика на постъпващите CAN съобщения, а във втория сокет се извършва извикване на sendmsg() за изпращане на съобщение в първия сокет. След постъпването на съобщението се активира извикването на bcm_rx_handler(), а нападателят избира подходящия момент и затваря първия сокет, което води до стартиране на bcm_release() и освобождаване на структурите bcm_op и bcm_sock, въпреки че работата на bcm_rx_handler() все още не е завършена.
Чрез манипулации със съдържанието bcm_sock, атакуващият може да преправи указателя на функцията sk->sk_data_ready(sk), да пренасочи изпълнението и чрез техники на обратен ориентиран програмиране (ROP — Return-Oriented Programming) да организира презаписване на параметъра modprobe_path и да постигне изпълнение на своя код с права root. При използването на техника ROP, атакуващият не се опитва да разположи своя код в паметта, а работи с вече съществуващи парчета машинни инструкции в заредените библиотеки, завършващи с инструкция за възвращаемост на контрола (обикновено това са завършвания на библиотечни функции). Работата на експлойта се свежда до изграждане на верига от извиквания на подобни блокове („гаджети“) за получаване на необходимата функционалност.

За атаката е необходимо наличие на достъп за създаване на CAN сокети и конфигуриран мрежов интерфейс vcan. Необходимите за извършване на атаката права могат да бъдат получени от непривилегирован потребител в контейнери, създадени в системи с включена поддръжка на пространства от идентификатори на потребители (user namespaces). Например, user namespaces по подразбиране е включен в Ubuntu и Fedora, но не е активиран в Debian и RHEL.
Източник: opennet.ru
