Удалённое выполнение кода в TCP-стеке Linux закрыто в ядре 7.3

linux

TCP-стек ядра Linux содержит уязвимость, позволяющую удалённо выполнить код на уровне ядра и получить права root. Учётные данные и действия пользователя для атаки не нужны: достаточно отправить серию специально оформленных пакетов на сетевой сокет, где сервер ждёт подключений. Затронуты серверные процессы с поддержкой многопутевого TCP (MPTCP), и в первую очередь приложения на языке Go, где этот режим включён по умолчанию. Сведений об эксплуатации уязвимости в реальных атаках нет.

CVE-2026-98432 в обработке повторных SYN-запросов

Уязвимость нашла компания Anthropic в ходе исследования с моделью Claude и подготовила рабочий эксплойт, исполняющий код в контексте ядра. Оценка по CVSS 3.1 составляет 9.8 из 10. Существеннее другое: стандартная библиотека Go с версии 1.24, вышедшей в феврале 2025 года, включает MPTCP для сетевых сокетов по умолчанию. Это расширение держит несколько сетевых путей для одного соединения, причём включается отдельно для каждого сокета. Поэтому под удар попадает любое серверное приложение на Go, например HTTP-сервер Caddy, если пакеты атакующего доходят до его слушающего сокета.

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

Эксплуатация идёт в два этапа. Сначала атакующий обходит рандомизацию адресного пространства ядра (KASLR): вынуждает ядро прочитать подставленное поле длины и вернуть лишние байты, среди которых оказывается указатель ядра. Затем та же ошибка позволяет переполнить буфер и подменить указатель на обработчик вызова. Заранее размещённая в памяти ядра полезная нагрузка при срабатывании запускает выбранную атакующим команду с правами root. В прототипе на определение раскладки памяти ушло 48 минут, ещё пять на выполнение кода.

Повторные попытки почти ничего не стоят атакующему: промах мимо окна состояния гонки приводит лишь к сбросу установления соединения, а не к краху ядра. Ошибка живёт в стеке IPv4 и не привязана к MPTCP. Теоретически возможен и другой путь: миграция сокетов при включённом параметре net.ipv4.tcp_migrate_req или программы eBPF (проверяемые программы, работающие внутри ядра). Однако таких эксплойтов пока нет.

Уязвимость присутствует в ядрах начиная с 4.4. По данным раскрытия, исправление появилось в выпусках 5.10.272, 5.15.223, 6.1.190, 6.6.159, 6.12.113, 6.18.56, 7.2.10 и 7.3 и попало во все поддерживаемые стабильные ветки. Запись CVE при этом не называет исправленную версию, а её списки продуктов противоречат друг другу. Поэтому статус для конкретной сборки надёжнее сверять на странице трекера дистрибутива: Debian, Ubuntu, SUSE/openSUSE, RHEL, Gentoo, Arch или Fedora.

Гарантированно закрывающих уязвимость обходных мер нет, надёжным остаётся только обновление ядра. Частично сузить возможности эксплуатации помогает отключение MPTCP и миграции сокетов:

Наличие сокетов с MPTCP показывают команды

В программах на Go тот же эффект даёт переменная окружения GODEBUG=multipathtcp=0 или директива godebug multipathtcp=0 в файле go.mod.

Формально уязвимость действует с ядра 4.4, поэтому обновление касается не только узлов с явно включённым MPTCP. Пока узел работает на уязвимом ядре, от удалённой атаки защищают только сетевые ограничения и отключение MPTCP.

Ссылки

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