The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

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

20.06.2021 08:39

В ядре 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.

Дополнение: Предложен патч с исправлением проблемы.

  1. Главная ссылка к новости (https://www.openwall.com/lists...)
  2. OpenNews: Уязвимости в подсистеме eBPF, позволяющие выполнить код на уровне ядра Linux
  3. OpenNews: Уязвимость в подсистеме iSCSI ядра Linux, позволяющая поднять свои привилегии
  4. OpenNews: Уязвимости в ядре Linux, затрагивающие реализации VSOCK, Futex и io_uring
  5. OpenNews: Уязвимость в Bluetooth-стеке BlueZ, позволяющая удалённо выполнить код с правами ядра Linux
  6. OpenNews: Уязвимость в реализации сокетов AF_PACKET ядра Linux
Лицензия: CC-BY
Тип: Проблемы безопасности
Короткая ссылка: https://opennet.ru/55359-linux
Ключевые слова: linux, kernel, can
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (64) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, мирмик (?), 09:34, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +12 +/
    Интересно, спасибо.
     
  • 1.2, Аноним (2), 09:45, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    > Для атаки требуется наличие доступа для создания сокетов CAN и настроенный сетевой интерфейс vcan

    Опять нужен рут, чтобы юзнуть эксплоит?

     
     
  • 2.7, InuYasha (??), 10:53, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • –6 +/
    Скорее - фабрика. Или автомобиль. С дебианом. )
     
     
  • 3.8, InuYasha (??), 10:54, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Т.е. наоборот - с Убунтой или Рхелем.
     
     
  • 4.39, anonymous (??), 14:50, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ты опять всё перепутал.
     
  • 3.76, pofigist (?), 14:05, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Достаточно СКУД-а или в общем случае - умного дома.
     
  • 2.20, anonymous (??), 12:54, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Нет, достаточно не-root-а с сетевыми capabilities, даже если доступ есть только к другому сетевому namespace-у.
     
     
  • 3.44, КО (?), 16:17, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Чтобы подготовить компьютер к проникновению рутом пользоваться придется всё равно
     
     
  • 4.66, anonymous (??), 11:25, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ну, админ поднял кучу контейнеров и продал разным людям (назвав их VPS-ками). А один из пользователей получил доступ к хосту. По-моему очень даже нехорошо.
     
  • 2.23, 123 (??), 13:07, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    статью не читай, быстрей отвечай
     
  • 2.61, псевдонимус (?), 03:21, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Опять нужен мозг, чтобы понять написаное.
     

  • 1.4, Аноним (4), 09:57, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    Звучит достаточно трудно-реализуемо на практике. Это эксплойт для локальной эскалации привелегий? Где скачать?
     
     
  • 2.35, kai3341 (ok), 14:27, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Для возникновения race condition достаточно, чтобы rx_handler выполнялся достаточно долго. Это делается изячно
     
     
  • 3.43, Аноним (4), 15:45, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Особенно не имея юзера на девайсе где эта шина юзается?
     
     
  • 4.54, YetAnotherOnanym (ok), 19:47, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • –2 +/
    <troll>В иранских ядерных центрифугах</troll>
     
  • 2.51, adolfus (ok), 19:24, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +7 +/
    Скорее всего, никак вообще не реализуемо. В системах, где используется CAN-шина, исполняется фиксированное число установленных процессов с четко определенными функциями и там нет никакой возможности запустить что-нибудь, что не предусмотрено при разработке. Чтобы запустить левый процесс, нужно перепрограммировать ROM, в которой располагается исполняемый код. И не факт, что это удастся -- проверку хешей секций .text и .rodata на этапе холодного старта никто не отменял.
     
  • 2.75, Аноним (-), 13:39, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Жди в телеге, наверное в античат или хакер канале. Сначала будет видос на нерусском, но хорошем английском, а потом и наши переведут.
     

  • 1.5, Аноним (5), 10:17, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Вчера в Debian прилетело исправление ядра 4.19, это оно?
     
  • 1.6, СеменСеменыч777 (?), 10:45, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    кто в самосборных ядрах убирает CAN, X.25, WiMAX и т.п. чешую - тот я.
     
     
  • 2.9, Аноним (9), 10:56, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Ты не один кто считает что надо использовать только самосборные и желательно монолитные ядра.
     
     
  • 3.11, СеменСеменыч777 (?), 11:05, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > монолитные ядра.

    до такого экстремизма я еще не дошел.
    жаба душит расходовать ядерную RAM на ненужное.

     
     
  • 4.12, Аноним (12), 11:25, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Монолитные микроядра
     
  • 4.36, kai3341 (ok), 14:29, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Так речь о том, что ненужное уже выпилено
     
     
  • 5.45, Аноним (9), 16:45, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Да, именно Из ненужного останется пара драйверов типа UART конвертера ch341, ... большой текст свёрнут, показать
     
  • 5.49, СеменСеменыч777 (?), 18:26, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Так речь о том, что ненужное уже выпилено

    сейчас для зоопарка локалхостов я собираю 5 вариантов ядра:
    1. интел атом 64 (без роутинга, фаерволла, ipv6).
    2. интел старый 64 (без роутинга, фаерволла, ipv6)
    3.1. интел новый 64 (без роутинга, фаерволла, ipv6)
    3.2. интел новый 64 (с роутингом, с фаерволом, с ipv6, без мультимедии)
    4. амд 64 (без роутинга, фаерволла, ipv6)

    как видите, в каждом варианте есть свое ненужное в других вариантах.

     
     
  • 6.73, Аноним (73), 12:17, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Совсем без роутинга, это даже командой ip route ничего не добавить? Так это даже на десктопе печально будет.
     
  • 6.80, Ivan_83 (ok), 18:50, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Экономия на спичках.

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

    Вырезать IPv6 - не дальновидно, пора им уже давно пользоватся.
    Заморачиватся вырезанием фаера тоже так себе затея, как и вырезать роутинг - экономии с этого меньше чем от выкидывания 1-2 дров от сетевух не сильно нужных.

     
     
  • 7.82, СеменСеменыч777 (?), 22:01, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Экономия на спичках.

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

    > Вырезать IPv6 - не дальновидно, пора им уже давно пользоватся.

    внутри локальной сети локалхостов этот мусор не нужен.

    > Заморачиватся вырезанием фаера тоже так себе затея, как и вырезать роутинг -

    еще IPsec пострадал и всякие туннели.

    > экономии с этого меньше чем от выкидывания 1-2 дров от сетевух
    > не сильно нужных.

    драйвера все модулями ko. какого железа нет, на него и не грузится.

     
  • 2.16, n00by (ok), 11:53, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > кто в самосборных ядрах убирает CAN, X.25, WiMAX и т.п. чешую -
    > тот я.

    staging: wimax: delete from the tree.

    https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=

     
     
  • 3.29, СеменСеменыч777 (?), 13:51, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > staging: wimax: delete from the tree.

    1) не использую staging. собираю последний longterm, сейчас это 5.10.*
    на обход его конфига и понять что там есть и зачем ушло 2 недели.
    на след. longterm уйдет может чуть меньше.

    2) не зацикливайтесь на WiMAX. есть еще ATM, IPsec, разные туннели и т.д.

     
     
  • 4.37, n00by (ok), 14:31, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >> staging: wimax: delete from the tree.
    > 1) не использую staging. собираю последний longterm, сейчас это 5.10.*
    > на обход его конфига и понять что там есть и зачем ушло
    > 2 недели.

    Заметно. staging ортогонально к LTS и есть во всех ветках.

     

  • 1.19, Аноним (19), 12:32, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Автор новости и доморощенный хакер написавший эксплоит это IMHO два долбозавра. По дефолту в ядре не собираются протухшие девайсы CONFIG_CAN.

    Писяйте кипятком дальше. ;)

     
     
  • 2.22, Аноним (-), 13:02, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    у многих ожидаемо модулем, иногда работающим, в nuclear physics, например.
     
     
  • 3.71, Аноним (73), 12:11, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Для Nuclear Physisc CAN это слишком медленно.
     
  • 2.50, Аноним (50), 18:56, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    В Ubuntu модуль vcan.ko входит в число штатно поставляемых В других дистрибутивах думаю тоже.
     

  • 1.41, Аноним (41), 15:03, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    >user namespaces по умолчанию включён в Ubuntu и Fedora, но не активирован в Debian и RHEL

    А что это и как его включить (если вдруг потребуется) ?

     
  • 1.42, Аноним (42), 15:39, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Лучше бы 12309 наконец-то исправили
     
     
  • 2.53, Аноним (53), 19:40, 20/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Ну что сказать, спасибо за минусы любители тормозов
     
  • 2.63, onanim (?), 09:59, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • –1 +/
    12309 исправляется очень легко:
    - покупаешь NVMe жёсткий диск
    - вместо USB флешек используешь Thunderbolt/TypeC
    - и вообще никогда больше не копируешь файлы по USB

    можешь ещё винду установить, там тоже 12309 нет. ну или переехать жить в страну с розовыми пони-единорогами, где живут минусаторы.

     
     
  • 3.65, n00by (ok), 10:40, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Проще перестать участвовать в карго-культе "swap в zRAM ускоряет систему в 10 раз" и разобраться наконец с конфигурацией ядра.
     
     
  • 4.85, onanim (?), 08:32, 22/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > Проще перестать участвовать в карго-культе "swap в zRAM ускоряет систему в 10
    > раз" и разобраться наконец с конфигурацией ядра.

    у меня вообще нет swap, т.к. полно RAM; конфигурация ядра стандартная от openSUSE; при копировании больших файлов по USB (хоть на флешку, хоть на смартфон через adb push) тормозит вся система включая курсор мыши!

    учитывая необходимость "разбираться с конфигурацией ядра" для убирания тормозов в середине 2021го года, можно смело утверждать, что 12309 всё ещё не исправлен.

     
     
  • 5.89, n00by (ok), 10:28, 22/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Утверждайте, что считаете нужным. У меня нет доступа к https://bugzilla.kernel.org/show_bug.cgi?id=12309

    И у меня не воспроизводится вот это: "при копировании больших файлов по USB (хоть на флешку, хоть на смартфон через adb push) тормозит вся система включая курсор мыши!"

    Год-два назад на форуме одного маргинального дистрибутива я нашёл внятный сценарий, как воспроизвести проблему. Да, _там_ она была почти у всех. Мне пришлось оставить 4ГБ ОЗУ, 1 SSD на двухканальном контроллере Phison S11, собрать ядро с конфигом от той ОС и запустить специальный скрипт, который нагружал подсистему ввода-вывода. Конфиг ядра там слепо заимствован от какой-то Ubuntu. Я просто отключил ненужные отладочные опции (а Вы думали, оно free as a beer?) и проблема исчезла. Не вижу необходимости разбираться с конфигом детальней. Минимальное железо в наличии -- Atom N270, где SSD подключен через SATA1 (150 МБ/сек), и даже там не наблюдалось потерь отзывчивости при копировании на флешку.

     
  • 2.72, Аноним (73), 12:12, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Исправь у себя в голове.
     

  • 1.46, Michael Shigorin (ok), 17:10, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –7 +/
    I CAN HAZ U (ц)
     
  • 1.48, Аноним (48), 18:03, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –3 +/
    А зачем в убунте вообще поддержка CAN? Бибикать и тормозить автомобилем???
     
  • 1.55, deeaitch (ok), 23:06, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Ну вот, работы прибавилось. Эх.

    Ничего, не в первый раз.

     
  • 1.56, Аноним (56), 23:13, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    >проявляется в выпусках ядра Linux с 2.6.25 по 5.13-rc6

    Подожду, не буду обновляться

     
  • 1.58, Аноним (58), 23:50, 20/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    А на Эльбрусе ROP не работает
     
     
  • 2.59, Аноним (-), 00:20, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +2 +/
    На нем вообще практически ничего, кроме мишани, не работает.
     
     
  • 3.62, ыы (?), 08:20, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Мишаня часть программно-аппаратного комплекса?
     
     
  • 4.68, Аноним (73), 12:06, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Обеспечивает обдув радиатора процессора.
     
     
  • 5.70, Michael Shigorin (ok), 12:09, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    :D

    Шутки шутками, а USB-вентилятор в эти летние денёчки весьма выручает.
    Но дальше всё как в бородатом анекдоте про армянское радио.

     
     
  • 6.78, ыы (?), 15:59, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Москву же на удаленку перевели...Все программисты и админы в Серебряном Бору да в Пирогово лежат  на пляжу с шашлыком и работают в поте лица... Над серверами да программами...
     
     
  • 7.79, ыы (?), 16:02, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Хотя Михаил вон в свитере все ходит... видать мерзнет- наверное прям под сервером сидит...
     
  • 2.69, Аноним (73), 12:08, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    В наборе команд Эльбруса нет возврата из процедуры?
     
     
  • 3.81, Аноним (81), 20:45, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Там несколько стеков ;) Адреса возврата отдельно, данные отдельно...

    Такое решение возможно уходит корнями в SPARC (там можно несколько стековых окон держать, но по-моему было общее пространство и для данных и для адресов возврата; хотя там и были забавные вещи типа параметры функций в одном фрейме, локальные переменные в другом).

     

  • 1.64, onanim (?), 10:02, 21/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    ыксперты опеннета такие ыксперты, весь тред заcpали своим ыкспертным "нисработает! трудно реализуемо!! нужен рут!!!" вместо того, чтобы скачать PoC и убедиться, что всё работает, т.к. модуль CAN подгружается автоматически при запуске даже с правами обычного юзера.
     
     
  • 2.74, Аноним (73), 12:23, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Пусть, кому он не нужен, добавят его в /etc/modprobe.d/blacklist.conf
     
     
  • 3.77, ыы (?), 14:58, 21/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    а что туда надо добавить?
     
     
  • 4.86, onanim (?), 08:34, 22/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    > а что туда надо добавить?

    ВСЁ.
    рекомендую https://www.opennet.ru/opennews/art.shtml?num=54974 и делать sysctl lkrg.block_modules=1 после загрузки системы.

     
     
  • 5.87, ыы (?), 08:48, 22/06/2021 [^] [^^] [^^^] [ответить]  
  • +/
    Но ведь это только для новых ядер... Уязвимость охватывает намного больше ядер чем может закрыть такой метод. К тому же это не ответ на заданный вопрос.
     

  • 1.83, Аноним (83), 00:00, 22/06/2021 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    CAN это обычно встраиваемые железки, туда со стороны обычно не пускают. Хотя если это какой-нибудь ведроид для ivi, то все возможно
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2021 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру