Гонка в интерфейсе AF_ALG ядра Linux, тянущаяся с 2011 года, позволяет локальному непривилегированному процессу повысить права до root, а в тестовой среде — выйти из контейнера Docker на хост. Уязвимость получила идентификатор CVE-2025-39964, и CISA уже внесла её в список эксплуатируемых.
Что именно ломается в AF_ALG
Проблема кроется в обработке sendmsg() для AF_ALG — пользовательского криптографического интерфейса ядра, через который приложения задействуют AES и другие алгоритмы. Ядро собирает криптографические данные из одного или нескольких запросов и отслеживает буферы через списки scatter-gather. Флаг контекста merge означает, что в последнем буфере осталось неиспользованное место на странице и туда можно безопасно дописать новые данные.
Однако два потока могут одновременно писать в один и тот же сокет операции AF_ALG. Блокировка сокета защищает большинство изменений состояния, но ядро снимает её, пока поток ждёт появления места в буфере для записи. За это время другой писатель успевает изменить общий контекст до того, как исходный поток продолжит работу.
По данным исследователей IDNsec, манипулируя таймингом, атакующий может оставить ctx->merge включённым, хотя в итоговом списке scatter-gather нет валидных записей. Тогда последующая запись обратится к метаданным перед нужным массивом — через sg[-1].
От гонки до произвольной записи в ядро
Выход за границы массива опасен тем, что данные кучи, контролируемые атакующим, влияют на поддельные метаданные scatterlist. Исследователи использовали это условие, чтобы построить oracle для копирования в пользовательское пространство и в итоге получить примитив произвольной записи в ядро.
Дальше эксплойт перезаписывает core_pattern — настройку ядра, управляющую обработкой дампов памяти процессов. Если core_pattern начинается с символа вертикальной черты, Linux выполняет указанную программу как обработчик core dump. Подменив это значение и обрушив дочерний процесс, proof-of-concept запускает бинарник атакующего с правами root.
Поскольку контейнеры используют ядро хоста, тот же примитив уровня ядра позволяет выйти из Docker-контейнера в уязвимых конфигурациях.
Кто нашёл и сколько заплатили
Уязвимость обнаружил исследователь Мухаммад Алифа Рамдхан из STAR Labs в 2025 году во время аудита кода ядра Linux для программы Google kernelCTF. Работа выполнена вместе с коллегой Бин-Джонгом Билли Чжэном; им удалось превратить баг в надёжный эксплойт локального повышения привилегий. Сообщается, что заявка в kernelCTF получила вознаграждение в размере 113 337 долларов.
Какие версии ядра закрыты патчем
Уязвимый код появился в Linux 2.6.38 в 2011 году и оставался открытым около 14 лет. Уязвимы ядра до исправленных стабильных выпусков — с учётом бэкпортов в дистрибутивах. В публичных рекомендациях перечислены исправленные версии: Linux 5.10.246, 5.15.195, 6.1.155, 6.6.109, 6.12.50 и 6.16.10.
Разработчики ядра закрыли проблему, добавив эксклюзивное владение записью для контекстов AF_ALG. Патч вводит проверку состояния ctx->write, из-за которой второй одновременный писатель получает отказ вместо изменения общего состояния сокета.
Что делать администратору
Нужно как можно скорее установить пропатченный пакет ядра из своего дистрибутива и перезагрузиться в обновлённое ядро. В приоритете — общая инфраструктура Linux, хосты контейнеров, многопользовательские системы и среды, где может исполняться недоверенный локальный код или рабочие нагрузки арендаторов.
Российским администраторам стоит проверить, какие версии ядра используются в парке: обновления для отечественных сборок приходят с задержкой относительно upstream, а бэкпорты в дистрибутивах могут отличаться по составу. Особенно внимательными стоит быть на хостингах, VDS и платформах с контейнерной изоляцией, где на одном ядре соседствуют задачи разных клиентов.
Смежные разборы повышения привилегий в ядре Linux уже публиковались: четыре уязвимости до root и подтверждённая CISA эксплуатация трёх уязвимостей ядра. Ещё один пример побега из контейнера через ядро — symlink-гонка в Plesk Backup Manager.
Частые вопросы
Кого касается эта уязвимость?
Всех, у кого есть Linux-системы с локальным доступом для непривилегированных пользователей: хосты контейнеров, многопользовательские серверы, среды с недоверенным кодом или рабочими нагрузками арендаторов. Для эксплуатации нужен локальный доступ, удалённо баг не сработает.
Как проверить свою версию ядра?
Выполните uname -r и сравните с исправленными выпусками: 5.10.246, 5.15.195, 6.1.155, 6.6.109, 6.12.50, 6.16.10. Если ваша версия ниже и дистрибутив не выпустил бэкпорт, ядро уязвимо.
Что даёт эксплойт атакующему?
Получение прав root на локальной машине и, в уязвимых конфигурациях, выход из Docker-контейнера на хост. Эксплойт строит примитив произвольной записи в ядро и перезаписывает core_pattern.
Почему core_pattern так опасен?
Если значение начинается с символа вертикальной черты, ядро выполняет указанную программу при падении процесса. Подменив настройку и обрушив дочерний процесс, атакующий запускает свой бинарник с правами root.
Обязательно ли перезагружаться после обновления?
Да. Обновление пакета ядра не меняет уже работающее ядро — нужно перезагрузиться в новый выпуск, иначе уязвимость останется активной.
Что делать, если обновиться нельзя?
Стоит минимизировать локальный доступ недоверенных пользователей и кода, ограничить возможности контейнеров и ускорить установку патча. Полностью закрыть локальный вектор без обновления ядра нельзя.
Как исправили проблему в ядре?
В AF_ALG добавили эксклюзивное владение записью: патч проверяет состояние ctx->write, и второй одновременный писатель получает отказ вместо изменения общего состояния сокета.
Насколько серьёзна уязвимость по оценке CISA?
CISA внесла CVE-2025-39964 в список уязвимостей, о которых сообщалось как об эксплуатируемых. Это повышает срочность установки патчей, хотя конкретные кампании в отчёте не детализируются.
Источник: cybersecuritynews.com