Недавно выявленная уязвимость в ядре Linux (CVE-2021-3609) позволяет получить root-права рядом махинаций, связанных с сетевым протоколом CAN (controller area network) BCM. Затрагивает версии с 2.6.25 до mainline 5.13-rc6 включительно.
Исследователь, выявивший уязвимость, подготовил эксплоит, действующий на ядра версий >=5.4.
Вкратце, шаги для воспроизведения:
- Настраиваем пространство непривилегированного пользователя.
- Настраиваем сетевой интерфейс vcan.
- Открываем два разъема CAN BCM и привязываем оба к сему интерфейсу.
- Вызываем
sendmsg()
на 1-м сокете с флагомRX_SETUP
для настройки обработки поступающих сообщений CAN. - Вызываем
sendmsg()
на 2-м сокете для отправки сообщения в 1й сокет.
Итог – получаем состояние гонки:
bcm_rx_handler()
запускается автоматически на первом сокете для получения сообщения;- вызываем
close()
->bcm_release()
на первом сокете, чтобы освободить структурыbcm_op
иbcm_sock
.
Как следствие, bcm_rx_handler()
все ещё работает и продолжает обращаться к структурам bcm_op
и bcm_sock
, которые ранее были освобождены – ситуация use-after-free.
Тот, кто управляет содержимым, bcm_sock
способен переопределить указатель на функцию sk->sk_data_ready(sk)
и перенаправить выполнение, имея таким образом возможность выполнить собственный код с root-правами.
На данный момент баг не исправлен в линейке наиболее используемых дистрибутивов, таких как Ubuntu, RHEL, Fedora, Debian, SUSE, Arch.
>>> Подробности