LINUX.ORG.RU

Уязвимость в Linux, касающаяся сетевого протокола CAN BCM

 , ,


2

0

Недавно выявленная уязвимость в ядре Linux (CVE-2021-3609) позволяет получить root-права рядом махинаций, связанных с сетевым протоколом CAN (controller area network) BCM. Затрагивает версии с 2.6.25 до mainline 5.13-rc6 включительно.

Исследователь, выявивший уязвимость, подготовил эксплоит, действующий на ядра версий >=5.4.

Вкратце, шаги для воспроизведения:

  1. Настраиваем пространство непривилегированного пользователя.
  2. Настраиваем сетевой интерфейс vcan.
  3. Открываем два разъема CAN BCM и привязываем оба к сему интерфейсу.
  4. Вызываем sendmsg() на 1-м сокете с флагом RX_SETUP для настройки обработки поступающих сообщений CAN.
  5. Вызываем 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.

>>> Новость на OpenNet

>>> Подробности



Проверено: xaizek ()
Последнее исправление: xaizek (всего исправлений: 5)

Ответ на: комментарий от Slack

слушай, зря ты его моим багом называешь:) у меня минимум один кернел паник и пара сегфолтов в базовых (!) компонентах. я хз, что ты имеешь ввиду. хочешь увидеть сегфолт прямо сейчас, набери:

jail -e "|" -n p
crypt ★★★★★
()
Последнее исправление: crypt (всего исправлений: 1)
Ответ на: комментарий от Slack

и если уж на то пошло, то я-то как раз очень хочу на фрибзд перейти. с багфиксами я поступил бы просто - не буду больше фри ставить до выхода XX.1-RELEASE, но с файрволом просто *опа%((( я просто не буду переписывать то, что у меня уже есть на этот дибилизм.

crypt ★★★★★
()
Последнее исправление: crypt (всего исправлений: 2)
Ответ на: комментарий от crypt

у меня минимум один кернел паник и пара сегфолтов в базовых (!) компонентах

ну я рад за тебя, что :) Напиши багрепорты )

Slack ★★★★★
()
Ответ на: комментарий от anonymous

А много ли линуксоидов читает код линукса? Кто из присутствующих делает это регулярно, хотя бы раз в месяц?

делаю это ежедневно, но не майнстримное а вендорские форки

anonymous
()
Ответ на: комментарий от crypt

то я-то как раз очень хочу на фрибзд перейти.

а где ты хочешь-то перейти на фряху?

о с файрволом просто *опа%(((

а что не так с фаерволлом то? кажется глебиус переписал для фряхи кошерный pf. Я вот на iptables без слез не могу смотреть, мне кажется, что его синтаксис придумал психически нездоровый человек. Или что там сейчас? ufw? или nftables? или bpfilter? firewalld?

Меня в линуксе больше всего бесит, что у тебя окружение меняется стабильно каждые пять лет. Например, я помню времена, когда в линуксе и фре был OSS для воспроизведения звука, оно было однопоточным (или как оно назвается, когда в него может играть только одно приложение? ), все использовали звуковые сервера arts, esound и прочее, потом в линуксе решили, что звуковые сервера это отстой, и давайте сделаем все по уму и напишем продвинутую альсу. Альса продвинутой не вышла, и для нее пришлось написать что? Правильно, звуковой сервер pulseaudio. И хоть оно уже не говорит пшш пшш (прошло то каких-то лет 5), но pulseaudio -k - все равно иногда любимая команда. Что во фре? Там просто oss уже умеет в несколько потоков, и настраивается тремя строчками в loader.conf и sysctl.conf . В опенке и этого не надо, оно кажется умеет все из коробки, за три года использования OpenBSD на десктопе меня вообще мало интересовало, как там звук работает - sndio просто играл звук, и всё.

Чем помешал ifconfig, и почему его нельзя было переписать под современные реалии? И так вот постоянно и везде.

Slack ★★★★★
()
Последнее исправление: Slack (всего исправлений: 1)
Ответ на: комментарий от kmeaw

Почти все. lsmod | grep can

Ты сам себе противоречишь. Нигде по дефолту этот модуль не загружается, даже если он скомпилирован. Очередная уязвимость с повышением привилегий, для которой нужны повышенные привилегии.

pekmop1024 ★★★★★
()
Ответ на: комментарий от pekmop1024

В Linux по-умолчанию работает автозагрузка модулей. Если попытаться создать сокет для того протокола, который реализован установленным, но не загруженным модулем, то он автоматически загрузится. И для этого не нужен рут.

kmeaw ★★★
()
Ответ на: комментарий от kmeaw

Если попытаться создать сокет для того протокола, который реализован установленным, но не загруженным модулем, то он автоматически загрузится

модуль can загрузится а vcan нет, как ты будешь эксплуатировать протокол без устройтсва ?

anonymous
()
Ответ на: комментарий от beos

Да сырой этот ваш хайку. Ставил одну из бет на реальное железо, пришли обновления, установил - система зависает после перезагрузки. До линукса как до луны раком.

anonymous
()
Ответ на: комментарий от anonymous

как ты будешь эксплуатировать протокол без устройтсва ?

В этом частном случае - никак, поэтому в предыдущем сообщении я пишу:

Но паниковать всё равно не надо, vcan сам себя не создаст.

Просто в общем случае незагруженность уязвимого модуля не означает невозможность его эксплуатации. Нельзя в таких случаях просто посмотреть вывод lsmod и успокоиться, надо ещё и отключить автозагрузку (совсем или для конкретного модуля через install MODNAME /bin/false).

kmeaw ★★★
()
Ответ на: комментарий от pekmop1024

В каком. Конкретно. «Линуксе» (называем вещи правильно - «дистрибутиве»). Есть. Такая. Дичь?

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.5 LTS"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <net/if.h>
#include <sys/ioctl.h>
#include <sys/socket.h>

#include <linux/can.h>
#include <linux/can/bcm.h>

int main(int argc, char **argv)
{
        int s;

        if ((s = socket(PF_CAN, SOCK_DGRAM, CAN_BCM)) < 0) {
                perror("Socket");
                return 1;
        }

        return 0;
}
gcc can_bcm.c -o can_bcm
$ lsmod | grep can
$ ./can_bcm
$ lsmod | grep can
can_bcm                24576  0
can                    20480  1 can_bcm
anonymous
()
Ответ на: комментарий от peregrine

Открою секрет, даже если это правда, в чём я сомневаюсь, кроме главных хацкеров есть остальные.

Legioner ★★★★★
()
Ответ на: комментарий от pekmop1024

Лень искать среди тех, что были до переезда на git, но в 2.6.12 это есть: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/kernel/kmod.c?h=v2.6.12&id=9ee1c939d1cb936b1f98e8d81aeffab57bae46ab#n52

Так что конкретно есть в 2.6.12 и в 5.12.13. И скорее всего во всех версиях между ними.

Большинство дистрибутивов содержат udev, который дублирует это поведение ядра в юзерспейсе.

kmeaw ★★★
()
Ответ на: комментарий от Legioner

Автор эксплоита – молодец!

Хотя лучше бы он его просто продал.

anonymous
()
Ответ на: комментарий от anonymous

Уверены что больше? Речь идет о тех кто пишет исключительно ядро линукса (а это весьма узкий круг нанятых за деньги разработчиков) vs всей той армии, что пишет Windows в целом.

bonta ★★★★★
()
Ответ на: комментарий от bonta

vs всей той армии, что пишет Windows в целом

почему тогда на серверах MS стоит Linux, может армии то и нет, MS это же не центр занятости - платят за результат.

anonymous
()

На арм64 это есть?

burato ★★★★★
()
Ответ на: комментарий от Slack

Чем помешал ifconfig, и почему его нельзя было переписать под современные реалии?

То, что умеет ifconfig - это маленькая часть того, что умеет ip. Может быть и можно было синтаксис ifconfig сохранить, но смысл?

AS ★★★★★
()
Ответ на: комментарий от AS

Вот как пример - в OpenBSD ifconfig умеет всё. В том числе подключаться к вайфаю. Ты просто пишешь

ifconfig iwm0 nwid точкадоступа wpakey пароль

и всё. Да, и врубаешь dhcpclient на интерфейс. Почему так нельзя было сделать в линуксе? Почему в бсдях сумели научить нормально работать с вторичными ip адресами, сидрами и прочими tun/tap, а в линуксе нет?

Понятно, что ip сейчас в линуксе более фунционален, но сама идеология «мы старый мир разрушим, До основанья, а затем, Мы наш, мы новый мир построим...» мне не близка.

Slack ★★★★★
()
Ответ на: комментарий от Slack

К примеру «ifconfig route add» как-то не очень логично звучит: route же не if.

До основанья, а затем, Мы наш, мы новый мир построим...» мне не близка.

Мне, в общем, тоже, но бывает, что есть смысл.

AS ★★★★★
()
Последнее исправление: AS (всего исправлений: 1)
Ответ на: комментарий от Slack

Альса продвинутой не вышла,

в альсе давно миксер есть, но он не у всех настроен по дефолту, а настраивать руками многие банально не умеют. пульс аудио это такой комбайн для всего и вся. сравнивать осс с пульсаудио это то же, что и какой нибудь rcinit и systemd.

ну и как говориться, как там вифи поживает во фряхе? suspend с запущеным х сервером уже просыпается?

anonymous
()
Ответ на: комментарий от anonymous

а, ещё забыл про мультилиб. запустика под вайном 32 и 64 битные програмульки на фряхе, а мы посмотрим.

anonymous
()
Ответ на: комментарий от anonymous

systemd.

ты так говоришь, как будто это что-то хорошее.

ну и как говориться, как там вифи поживает во фряхе? suspend с запущеным х сервером уже просыпается?

ну я на своих железках особо проблем не встречал.

запустика под вайном

я вайн не использую, ничего не могу сказать.

ну и я не про то, что фряха лучше всех впереди паровоза. Виртуализация/контейнерезация отстает например. Но для кого-то отставание с виртуализацией и мультилибом не имеет значения

Slack ★★★★★
()
Последнее исправление: Slack (всего исправлений: 1)
Ответ на: комментарий от Slack

ты так говоришь, как будто это что-то хорошее.

один из freebsd core team member так не думает https://www.youtube.com/watch?v=o_AIw9bGogo

ну я на своих железках особо проблем не встречал.

я вайн не использую, ничего не могу сказать.

вот это аргументация, блестящий слив.

короче ты некий админ локалхоста, который просто разместил объяву который советует использовать freebsd, но при этом нихрена кроме хендбука про неё не знает. так и запишем.

anonymous
()
Ответ на: комментарий от anonymous

один из freebsd core team member так не думает https://www.youtube.com/watch?v=o_AIw9bGogo

пусть не думает дальше.

вот это аргументация, блестящий слив.

Как правило вайфай и вайн нужен на рабочих станциях, а не на серверах. Ну да, у меня нет парка дескопов на фряхе, обхожусь парочкой.

который советует использовать freebsd

- Разве я в̶ы̶р̶а̶з̶и̶л̶ ̶в̶о̶с̶х̶и̶щ̶е̶н̶и̶е̶ советовал использовать FreeBSD? - Спросил маг у Фагота.

- Никак нет, мессир, вы н̶и̶к̶а̶к̶о̶г̶о̶ ̶в̶о̶с̶х̶и̶щ̶е̶н̶и̶я̶ ̶н̶е̶ ̶в̶ы̶р̶а̶ж̶а̶л̶и̶ не советовали использовать, - ответил тот.

- Так что же говорит этот человек?

- А он попросту соврал! - звучно, на весь театр сообщил клетчатый помощник и, обратясь к Бенгальскому, прибавил: - Поздравляю вас, гражданин, соврамши!

Slack ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.