LINUX.ORG.RU

Уязвимость в ядре Linux с возможностью локальной эксплуатации через nftables

 , ,


0

3

Обнаружена уязвимость в подсистеме Netfilter (CVE-2023-6817), которая, в теории, может быть использована локальным пользователем для повышения своих привилегий в системе. Корень проблемы кроется в использовании освобожденной памяти (use-after-free) в модуле nf_tables, ответственном за функциональность пакетного фильтра nftables.

Уязвимость актуальна с версии ядра Linux 5.6. Исправление предложено в тестовом выпуске ядра Linux 6.7-rc5 и внесено в текущие стабильные ветки 5.10.204, 5.15.143, 6.1.68 и 6.6.7.

Проблема вызвана ошибкой в функции nft_pipapo_walk, которая не проводит проверку наличия дубликатов в процессе перебора элементов PIPAPO (Pile Packet Policies). Это приводит к двойному освобождению памяти. Для успешной атаки требуется доступ к nftables, который можно получить, обладая правами CAP_NET_ADMIN в любом пространстве имен пользователя (user namespace) или сетевом пространстве имен (network namespace). Эти права могут быть предоставлены, например, в изолированных контейнерах. Для проверки своих систем опубликован прототип эксплоита.

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



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

Там скорее всего нет даже 5.6, на то он и контейнер что дцать лет назад запустил ядро и не обновляет, а то у юзеров что-нибудь рассыпется

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

Если у юзеров рассыпается от обновления ядра (которое вне контейнера), то с ещё большей вероятностью найдутся юзеры у которых контейнер не совместим с древним ядром и они попросят поновее.

firkax ★★★★★
()

Ну вот опять каких-то анскильных лалок вместо Настоящих Разработчиков в ядро пустили.

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

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

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

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

Что значит «от юзера пускаются», и зачем ты их с больших букв пишешь? Ну и докероподманы это только один из вариантов контейнеров. Есть контейнеры с полноценной ОС внутри, как легковесная виртуалка, например LXC.

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

Привилегированный контейнер, конечно, да. Непривилегированный с cap_net_admin? Ни разу не видел, может где-то используется, расскажите зачем.

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

И у докера, и в lxc, и в подмане, и везде. А в документации сказано, что привилегированные контейнеры это небезопасно по целому ряду причин и не надо их пускать.

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

В теме написано что нужен CAP_NET_ADMIN внутри неймспейса. Его по-моему можно организовать и не имея особых прав. Хотя я не проверял.

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

Его можно организовать, если админ за пределами контейнера его тебе выдал ) С целью поуправлять пакетным фильтром изнутри контейнера, надо понимать.

Ни разу не видел, поэтому и спрашиваю, вдруг знает кто.

Aceler ★★★★★
()

внесено в текущие стабильные ветки 5.10.204, 5.15.143, 6.1.68 и 6.6.7.

В генте стабильно ядро
6.1.67

Всё пропало.

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

Есть контейнеры с полноценной ОС внутри,

Пример в студию. Валяй мне контейнер запущеный в linux с windows.

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

Ок, ну после выхода podman для меня докер потерял актуальность. помелочи и так пашет а так сразу в кибер пихаю …

mx__ ★★★★★
()

Корень проблемы кроется в использовании освобожденной памяти (use-after-free)

Нестареющая сишная классика

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

Даладно... У всех есть предел понимания сложности. И сложность ядра уже где-то на грани человеческого понимания происходящего.

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

Причём тут винда? Речь про линуксы в виде нескольких независимых ОС с одним общим ядром.

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

Демон тут ни при чём вообще. Уязвимость не в демоне а в ядре, и какие права у демона - на ситуацию не влияет.

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

Что докер что подман одинаково ненужное. Нормальные контейнеры это LXC и подобное.

firkax ★★★★★
()

Что значит «локальной эксплуатации»? То есть. Есть местный компутерный магаз «РЕТ». Там бубунта на терминалах и подключаются к виндовому серваку через домен. Чтобы воспользоваться уязвимостью, я должен незаметно для 40 камер подойти к терминалу и начать там пробовать? Учитывая что продавцы в магазине всегда.
Так ли страшны эти псевдоуязвимости или такое может вирус сделать, если закинуть его на комп, взломав сеть?

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

Я просто регулярно слышу как люди говорят: «вы просто писать на си не умеете, раз у вас проблемы с управлением памятью».

Так что это такой традиционный сарказм.

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

Как ни пиши, но когда у тебя выделенная память под указателем через полядра тащится и освобождается в неочевидном месте, то double free будут всегда. Поэтому kfree(NULL) is safe :) Ну не работает в ядре весь этот ВАш хваленый RAII :)

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

Ну не работает в ядре весь этот ВАш хваленый RAII :)

Это проблемы ядра, а не RAII. Точнее, одна проблема: некто не любит плюсы.

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

Да вон, Макось, по слухам, на них писана местами. Как-то работает... :) А что толку-то? У тебя оверхеда в плюсах с автоуничтожением объектов будет больше. А если объекты передавать куда-то по указателю, то проблемы будут ровно такие же. В плюсах никто не знает, чего стоит объект создать и сколько деструкторов отработают при его уничтожении. Плюсы за другое не любят, но это отдельный разговор.

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

Ну наконец-то хоть кто-то написал, а то я уже заждался. :)

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

Не по указателю, а по ссылке. А если тащится туда, где её собираются освобождать, то move(unique_ptr). Семантика владения в плюсах вполне себе обложена достаточно простыми и интуитивными рекомендованными практиками. Что в свою очередь означает, что семантика эта по крайней мере осознаётся.

А что до стоимости уничтожения – то во-первых, если что-то надо уничтожить сложно, то его и на сях придётся сложно уничтожать, только ручками (что мы собственно в ОП и видим 🤣). А во-вторых, никто ж не заставляет использовать сразу весь квадриллион фичей плюсов, и не сразу тоже; продолжайте гонять туда-сюда обычные сишные структуры, где понятно – впиливайте деструктор и RAII, где непонятно – читайте книжку Фаулера «Рефакторинг».

А откуда ты взял оверхед от уничтожения – вообще непонятно.

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

Спасибо. Только как это применимо к ядру не есть понятно. Вот опять же, ВАш ООП, семантика ссылок и прочее Александреску головного мозга плохо применимы к реалиям событийно-управляемого кода ядра. Иначе, опять будем обсуждать или сферическое ядро в вакууме, или конфликт благих намерений с суровой реальностью. В общем, очередной С-плюс-плюсо-срач образуется.

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

Ну и к чему вы тут приплели событийно-управляемость? Может по-вашему, это такая магическая хрень, которую можно запилить только на голых сях? А то мне тут с ходу припомнились реализации на самых разных сильно более других языках, включая к слову и C++.

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

И вообще, мой пойнт очень простой: C++ это надмножество C. Соответственно, всё что можно сделать на сях, можно и на плюсях. Плюс на плюсях можно по щелчку сделать дофига всего, что эмулировать на сях – чистейший гимор. В том числе это самое RAII.

И к слову, в расте, который в ядро пропихнули, RAII тоже есть. Фсем бояццо! :)

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

Запилить можно что угодно на чем угодно. Но это надо пилить сразу и единообразно. Я начал с того, что нелокальное освобождение памяти в ядре — обычная практика. И все эти благопожелания типа «здесь взял — тут и отдай» в ядре не работают. В ядре же мы часто видим комментарии к функции типа «а вот это вызывается под локом таким-то» или «а вот это оставляет мутекс такой-то». Ну какие тут, блин, ссылки, локальное управление ресурсами, ООП?.. Хотите по-другому — пишите с нуля. Попытки писать ядра на С++ были. Но, чот как-то остались попытками.

С хорош тем, что он делает ровно то, что написано. С++ имеет скрытую исполняющую систему, даже если не пользоваться RTTI и исключениям.

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

В ядро пропихнули. И что? Диспетчер памяти там переписан весь как unsafe. Ну и какой профит? То же самое, только вид сбоку и без goto?

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

Ок, по ядру я лапки кверху. А про скрытую исполняющую систему - враньё. :) К слову, один из трёх озвученных Страуструпом фундаментальных принципов, лежащих в основе дизайна C++, – «не платим за то, что не используем».

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

Более того, один и тот же сишный код в режиме C++ может скомпилироваться эффективнее, чем в режиме C. Информация настолько древняя, что я уже и не помню, сам наткнулся или прочитал где. Причина, полагаю, в том, что C++ сильно злее в плане контроля типов, и поэтому у его оптимизатора больше информации.

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

Примерно поэтому в ядро rust и тянут. Просто потому что там хотя бы часть очевидных проблем можно сгрузить на компилятор. Но да, взамен получаем несколько большую сложность проектирования и написания кода.

Но тоже не панацея. Ну как минимум пока задачу останова решать не научится человечество.

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

С хорош тем, что он делает ровно то, что написано.

Расскажи это тем, кто переписывает код распихивая барьеры, например, под -O3, потому что ровно то, что написано, оказывается, выполняется совсем не так как написано и не в том порядке.

Современный си это бездна нюансов и мазафаки. И это не учитывая ту мазафаку времени исполнения, которую накидывает OoO.

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

Ну я уже писал прт раст в ядре. Там весь диспетчер памяти переписан и аллокаторы объявлены как unsafe. Смотрел я на это краем глаза, но чот выйгрыша на этом поле не видно. Ну goto нет, и из-за этого те же автоматы переходов становятся лексически избыточными. Тупо не понятно, что написано. Поэтому, зачем тянут раст для меня не есть пока понятно. Может какой-нибудь си с классами типа objective c и был бы полезен для более очевиднооо наследования свойств и таблиц вызовов в той же иерархии файловых систем.... Но написано, что написано. Преоеписывать это ради только что бы было на расте вряд ли будут.

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

Ну рейсы и оптимизация да, это отдельная история. Да ие только это. Там много чудесатого и без -О3.

gns ★★★★★
()

Пытаюсь скомпилить тестовый код

g++ -o test test.cpp

И вываливается с такой ошибкой

error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]

гуру С++, как исправить то?

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

Ну будем посмотреть. Если кому-то поможет, то в добрый путь. Если с помощью раста хотят побороть только небезопасные указатели, то пустая затея, если какую-то объектную ориентированность навести, то она у раста какая-то весьма запутанная. Я так и не понял, есть у него наследование или нет? Что такое есть эта его implemetation inheritance я так и не понял пока. Какое-то это все умствование пустое.

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