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

linux

Набор уязвимостей в ядре Linux раскрыт публично под кодовым именем Infinity Core. Эксплуатация открывает непривилегированному пользователю путь к правам root и к выходу за пределы контейнера. Затронуты подсистемы таймеров, обработки сигналов, управления памятью, фьютексов и планировщика задач. Опубликованы прототипы эксплойтов (программ, использующих уязвимость), их работу показали на Ubuntu, Arch Linux и на смартфоне Samsung Galaxy S26 Ultra под управлением Android.

Состояние гонки и обращение к освобождённой памяти в ядре

В основе набора лежит состояние гонки: результат зависит от того, в каком порядке два потока или два ядра процессора выполнили операции. Типичное следствие - обращение к памяти после её освобождения (use-after-free, UAF). Ядро сохраняет ссылку на структуру, которую уже освободило, и позже пишет по этой ссылке. В подсистеме управления памятью та же гонка даёт переполнение буфера: запись выходит за границы временного буфера ядра.

У записи CVE-2026-89754 оценка 7.8 из 10, это уровень High. Атака локальная: прототипы стартуют из обычной учётной записи без прав. Нужно ли участие пользователя, источник не уточняет, а поля вектора в записях CVE пустые. Детали механики приведены в записях CVE и в техническом описании набора.

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

Таймеры и очередь сигналов при exec в неглавном потоке

Уязвимость CVE-2026-98260 связана с POSIX-таймером, то есть таймером стандарта POSIX, привязанным к конкретному потоку. Если вызов exec() (замена образа процесса) в потоке, отличном от главного, завершается сбоем, память таймера освобождается. Ссылка на неё остаётся при этом в очереди живой задачи, и при последующей очистке ядро снова к ней обращается. Прототип запускает root-оболочку на Ubuntu 26.04 с ядром 7.0.0-30-generic.

На смартфоне Samsung Galaxy S26 Ultra эта же уязвимость даёт права root из домена untrusted_app (изолированная среда приложения в Android) без дополнительных привилегий. Эксплойт для Android будет опубликован после того, как проблему закроют на устройствах Galaxy, либо после появления стороннего эксплойта.

Похожая гонка есть в подсистеме сигналов. Вызов exec() в неглавном потоке пересекается здесь с очисткой очереди ожидающих сигналов. Ссылка на обработчик остаётся в очереди после освобождения памяти, и очередная обработка сигнала снова к ней обращается. Прототип отработан на Ubuntu 26.04.

Переполнение буфера при обходе таблиц страниц

Системный вызов mincore() сообщает, какие страницы памяти процесса находятся в физической памяти, и для этого обходит таблицы страниц. Из-за утечки состояния повтора нижний уровень обхода возвращает управление, не сбросив признак повтора. Верхний уровень воспринимает это как требование пройти текущий диапазон заново. Курсор результата уже сдвинут, поэтому запись уходит за границы временного буфера, который занимает одну страницу, в соседнюю память ядра. Прототип превращает повторы в управляемую последовательность, размещает рядом структуру прав процесса и обнуляет в ней идентификаторы пользователя и группы. Работа показана на Ubuntu 26.04.

Фьютексы и планировщик с перезаписью страничного кэша

Фьютексы - механизм синхронизации потоков, который работает в пространстве пользователя при поддержке ядра. Гонка возникает при выделении первого счётчика ссылок для приватного хеша. Две задачи с общим адресным пространством публикуют разные адреса счётчиков, и один из них выпадает из учёта. Живой хеш освобождается при замене, а сохранившийся указатель на корзину ведёт в освобождённую память. Прототип переиспользует этот блок кольцевым буфером канала, меняет флаг буфера и перезаписывает в страничном кэше (копии файла в памяти ядра) файл утилиты passwd.

В планировщике статистика кэша привязана к структуре, которая описывает адресное пространство задачи. Код учёта обновляет счётчики старой структуры, не защищая её от освобождения. После exec() на другом ядре процессора структура уже освобождена, а запись продолжается. Уязвимость проявляется при включённой опции сборки CONFIG_SCHED_CACHE и ненулевом значении настройки sysctl_sched_cache_user. Прототип рассчитан на четыре виртуальных процессора и показан на Arch Linux с ядром 7.2.4, где перезаписан файл утилиты newgrp в страничном кэше.

Повреждение списков в распределителе памяти

Уязвимость в распределителе памяти ядра (SLAB) относится к классу ABA. Проверка при возврате объекта в список проходит успешно, хотя состояние списка уже изменилось. Один и тот же узел попадает в список дважды, список повреждается, а следующее выделение памяти разыменовывает указатель-ловушку. Прототип создаёт гонку через объекты очередей System V и вызывает панику ядра. Цепочка получения прав для этой уязвимости пока не построена.

По публичному описанию проблемы уже устранены в актуальных выпусках ядра, и для каждой уязвимости указан коммит с исправлением, то есть запись об изменении в репозитории ядра. Номера исправленных версий в записях CVE не названы, а диапазоны затронутых версий местами противоречат друг другу. Конкретную версию пакета нужно смотреть в рекомендациях дистрибутива - Ubuntu, Arch Linux или другого.

Обходных мер источник не приводит. Остаются обновление ядра и отслеживание обновлений уведомлений дистрибутива. В контейнерных средах обновлять нужно ядро хоста, поскольку изоляция контейнера опирается на него. На Android исправление приходит с прошивкой производителя.

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

Ссылки

Комментарии: 0