В ядрото на 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
