Четыре уязвимости в ядре Linux позволяют пользователю без административных прав выполнить код с правами root. Рабочие эксплойты (вредоносный код, эксплуатирующий уязвимость) опубликованы для всех четырёх и проверены на Fedora 43, Fedora 44 и Ubuntu 24.04. Ошибки живут в сетевых подсистемах, которые включены почти в любом дистрибутиве по умолчанию, поэтому уязвимы серверы, рабочие станции, виртуальные машины и контейнеры на непропатченном ядре.
Детали уязвимостей
Первая уязвимость, DirtyAH6 (CVE-2026-80844), касается обработчика заголовка аутентификации IPsec, сокращённо AH. Этот механизм проверяет, что данные пакета не изменились в пути. Перед подсчётом контрольных значений код Linux приводит поля заголовка IPv6 к ожидаемому виду, в том числе адреса в заголовке маршрутизации. Число адресов он берёт из длины заголовка, а счётчик оставшихся сегментов не проверяет. Пакет, в котором счётчик завышен, сдвигает указатель почти на четыре килобайта назад, и копирование памяти выходит далеко за границы буфера. Для локальной атаки этого достаточно. Если машина работает как IPv6-маршрутизатор и добавляет AH в транспортном режиме, ту же ошибку можно превратить в удалённый отказ в обслуживании. При аккуратной подготовке памяти в лаборатории исследователю удалось добиться и удалённого получения прав root, хотя на чужой системе такой сценарий потребует исключительного везения.
Вторая, TUNderflow, относится к виртуальным сетевым устройствам TUN и TAP, которые перебрасывают пакеты между ядром и пользовательским пространством. Драйвер TUN хранил в одном поле сразу два значения: зарезервированное место под заголовки и объём данных, остающихся в начале пакета. Когда по цепочке устройств - через виртуальные коммутаторы и туннели - приходило завышенное значение, арифметика переполнялась, а указатель на данные оказывался за пределами выделенного блока. Дальнейшая обработка пакета читала и перезаписывала чужую память ядра.
Третья, PPPoEject, связана с драйвером PPPoE, который переносит сессии PPP внутри кадров Ethernet. При отправке драйвер собирает пакет, копирует в него полезную нагрузку и просит нижележащее устройство создать аппаратный заголовок. Один из таких вызовов способен освободить и перевыделить буфер, тогда как в коде PPPoE остаётся указатель на старую область. Запись по этому указателю попадает в освобождённую память. Добиться нужного порядка помогает драйвер FUSE: он задерживает копирование данных и выигрывает время для перераспределения памяти.
Четвёртая, DiagSpill (CVE-2026-74469), устроена иначе. У соединения SCTP может быть много адресов партнёра, по одному транспортному каналу на каждый. Счётчик таких каналов занимает 16 бит, поэтому на 65 536-м адресе он переходит через ноль. Диагностический интерфейс sock_diag выделяет ответ под нулевое число записей, а затем копирует полный список. За пределы ответа уходит около 8 МиБ. Именно эту уязвимость использовать проще всего: она не требует ни особых прав, ни создания пространств имён, достаточно поддержки SCTP и средств диагностики. Диагностическое переполнение тоже может привести к удалённому отказу в обслуживании, если на узле включены расширения SCTP для добавления адресов и аутентификация; по умолчанию они выключены. Путь к удалённому получению root здесь не просматривается.
Для первых трёх уязвимостей нужна возможность создавать пространства имён идентификаторов пользователей (user namespace) либо права CAP_NET_ADMIN, то есть полномочия на управление сетевыми настройками ядра. Требуется и поддержка подсистем, в которых сидят ошибки: AH6/XFRM, TUN, PPPoE и SCTP. Если процесс или контейнер уже наделён этими правами, он может испортить память ядра хоста без создания новых пространств имён, а значит, теоретически возможен выход за пределы контейнера. Средства изоляции AppArmor и SELinux, по словам исследователя, эксплойты не блокируют.
Ошибки оказались долгожителями: младшей около десяти лет, старшей - двадцати одного года. Нашли их, объединив графовое отслеживание объектов, значимых для безопасности, с инструментами на основе больших языковых моделей, которые рассуждают о состоянии памяти. Отчёт ушёл в security@kernel.org в середине июля, исправления выходили несколько недель, а публикацию эксплуатационных кодов согласовали с рассылкой linux-distros на 18 сентября.
Все четыре исправления вошли в стабильные выпуски ядра 5.10.270, 5.15.221, 6.1.188, 6.6.157, 6.12.109, 6.18.50 и 7.2.4. Обновление ядра остаётся основным способом защиты. Там, где перезагрузка невозможна, помогает отключение непривилегированных пространств имён: оно убирает обычный путь к первым трём уязвимостям, но не защищает от процессов и контейнеров с правами CAP_NET_ADMIN, а DiagSpill оставляет достижимой. Как временная мера годится отключение самих сетевых подсистем - AH6, TUN, PPPoE и SCTP, если они не используются. Дистрибутивы, где включены только модули, затронутые готовыми эксплойтами, полной защиты не дают: путей к повышению прав может быть больше.
Опубликованные эксплойты разрушительны и подобраны под конкретные дистрибутивы, версии ядра и объём памяти, поэтому запускать их разумно лишь на одноразовых виртуальных машинах. Автор исследования отметил, что на этом публичный этап его эксперимента по поиску уязвимостей с помощью искусственного интеллекта, скорее всего, завершается.
Ссылки
- https://heyitsas.im/posts/lpe-quartet/
- https://github.com/manizada/DiagSpill
- https://github.com/manizada/PPPoEject
- https://github.com/manizada/TUNderflow
- https://github.com/manizada/DirtyAH6