В интерфейсе асинхронного ввода/вывода io_uring, предоставляемом ядром Linux, выявлена уязвимость (CVE-2024-0582), позволяющая непривилегированному пользователю получить права root в системе. Для эксплуатации уязвимости достаточно обычного локального доступа к системе, без необходимости манипуляций с пространствами имён. В настоящее время публично доступен работающий эксплоит, а также подробно описана вторая техника эксплуатации уязвимости.
Уязвимость вызвана обращением к уже освобождённому блоку памяти (use-after-free) в подсистеме io_uring, возникающем при регистрации и освобождении кольцевого буфера, созданного с флагом IORING_REGISTER_PBUF_RING. В ситуации применения к буферу операции mmap(), он остаётся отражённым в пространство пользователя после выполнения операции его освобождения (IORING_UNREGISTER_PBUF_RING). Используя данную особенность атакующий может читать и записывать данных в страницы памяти, возвращённые системе распределения памяти ядра.
Проблема проявляется начиная с выпуска ядра Linux 6.4 и устранена в выпусках 6.7 и 6.6.5, а также в пакете с ядром 6.5.0-21, подготовленным для Ubuntu 22.04 и 23.10.
Примечательно, что в основном ядре проблема была исправлена в декабре 2023 года, проект Google Zero открыл доступ к сигнализирующему о наличии уязвимости сообщению об ошибке 8 января, а пакет с исправленным ядром 6.5 для Ubuntu был сформирован лишь 22 февраля 2024 года. В других дистрибутивах проследить за исправлением и подверженностью уязвимости можно на страницах: Debian, Gentoo, RHEL, SUSE, Fedora, Arch.
Первый эксплоит манипулирует созданием большого числа контролируемых атакующим страниц памяти для определения раскладки памяти в ядре и доступа к соседним физическим страницам памяти, используя в качестве маяков содержимое определённым образом заполненных структур сетевых сокетов. Для запуска кода в эксплоите задействован “гаджет” (последовательность существующих в ядре инструкций), приводящий к выполнению функцииcall_usermodehelper_exec, предназначенной для запуска процессов в пространстве пользователя из ядра.
Второй эксплоит основывается на том, что при исчерпании всех slab-блоков в кэше (например, при открытии файла много раз) свободные страницы памяти, к которым остаётся доступ атакующего, используются системой распределения памяти для создания нового slab-блока и все новые файловые структуры начинают размещаться в этом блоке. Соответственно, какие-то файловые структуры попадут в страницы памяти, которые может читать и записывать атакующий. Эксплуатация при этом сводится к организации попадания в файловый кэш нужного файла и замене в связанных с ним файловых структурах поля f_mode, определяющего права доступа, что позволяет сделать доступным на запись нужный системный файл, например, /etc/passwd.