CVE-2025-39964: 14-летняя уязвимость ядра Linux даёт root и побег из Docker

Гонка в интерфейсе 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