
Эксплойт для повышения привилегий в ядре Linux, эксплуатирующий CVE-2026-46242 (race-condition use-after-free в epoll), с 99% надёжным получением root на настольных компьютерах, серверах и Android-устройствах.

Непривилегированный процесс повышает привилегии до root на Google kernelCTF.
Bad Epoll (CVE-2026-46242) — это use-after-free из-за состояния гонки в подсистеме epoll ядра Linux. Эта уязвимость позволяет непривилегированному процессу получить права root не только на десктопах и серверах Linux, но и на устройствах Android.
Bad Epoll была обнаружена и эксплуатирована Jaeyoung Chung как 0-day, поданный на Google kernelCTF, который выплачивает $71,337+ за эксплойт для ядра Linux.
[!NOTE] ИИ Anthropic, Mythos, нашёл ещё одну гонку в том же коде epoll, но пропустил Bad Epoll.
Редкая уязвимость, способная дать root на Android. Большинство багов повышения привилегий в Linux вообще не способны дать root на Android. Например, Copy Fail и его варианты требуют модулей, которые Android никогда не загружает. Из примерно 130 уязвимостей, эксплуатированных на Google kernelCTF, лишь около десяти подходят для получения root на Android. Bad Epoll — одна из них.
Нет аварийного отключения. Copy Fail и его варианты можно нейтрализовать, выгрузив их уязвимые модули, но у epoll такой возможности нет. Это базовая функция ядра, на которую полагаются операционная система, сетевые сервисы и браузеры. Единственный способ исправить её — применить патч.
Крошечное окно гонки, но атака надёжна на 99%. Окно гонки уязвимости составляет всего около шести инструкций, и обычная попытка почти никогда в него не попадает. Эксплойт расширяет это окно и выполняет цикл повторов, который никогда не приводит к падению ядра. В результате получается эксплойт с надёжностью 99%, как описано в обзоре атаки ниже.
Один-единственный коммит в 2023 году внёс в код epoll — всего около 2 500 строк — две отдельные гонки. Обе оказались критическими уязвимостями, способными привести к повышению привилегий.
Первую гонку нашёл Mythos от Anthropic; она получила идентификатор CVE-2026-43074. Сам по себе этот результат впечатляет, поскольку известно, что гонки в ядре находить трудно. Он показал способность передовой ИИ-модели находить гонки. Позже независимый исследователь отправил для неё 1-day эксплойт на kernelCTF.
Вторая гонка — это Bad Epoll, которую Mythos пропустил. Учитывая, что Mythos нашёл первую уязвимость в этом небольшом участке кода epoll, он, вероятно, изучал ту же область с немалой глубиной. Мы не можем точно знать, почему он её пропустил, но, скорее всего, два фактора затруднили обнаружение.
Окно гонки крошечное. Его ширина — всего около шести инструкций, поэтому точное чередование потоков трудно представить, даже глядя на уязвимый код.
Было мало динамических свидетельств. После исправления CVE-2026-43074 use-after-free в Bad Epoll обычно не вызывает срабатывания KASAN — главного детектора ошибок памяти ядра. Без такого сигнала у Mythos, возможно, не было достаточной уверенности, чтобы сообщить о ней как о реальной уязвимости.
Исправить Bad Epoll тоже было непросто. Первый патч мейнтейнеров не полностью устранял проблему, а корректный патч появился только через два месяца после первого сообщения об уязвимости. Это долгий срок для ядра, которое обычно решает проблемы безопасности оперативно.
В целом Bad Epoll показывает, насколько сложны гонки на каждом этапе. Их трудно найти даже передовой модели, трудно правильно исправить и, как показывает следующий раздел, трудно надёжно эксплуатировать. Это также подсказывает направление исследований уязвимостей, которое остаётся перспективным и при наличии передовых ИИ-моделей: выявление реального влияния на безопасность за узкими временными условиями и слабыми свидетельствами.
Вот обзор атаки на высоком уровне — для тех, кому интересно.
Два связанных объекта epoll. Одновременное закрытие обоих запускает гонку.
Два пути закрытия epoll выполняются одновременно и сталкиваются. Один освобождает объект, пока другой всё ещё пишет в него, — это и есть use-after-free (UAF).
Окно гонки и то, как эксплойт им управляет.
Эксплойт использует четыре объекта epoll, сгруппированных в две пары. Одна пара запускает гонку, а другая становится жертвой. Далее эксплойт превращает 8-байтовую UAF-запись в UAF на файловом объекте и с помощью cross-cache атаки получает полный контроль над содержимым файла.
Превращение уязвимости в произвольное чтение памяти ядра через /proc/self/fdinfo.
Обладая таким контролем, эксплойт получает произвольное чтение памяти ядра через /proc/self/fdinfo. Наконец, он перехватывает поток управления и выполняет ROP-цепочку, чтобы получить root-шелл.
Больше подробностей доступно в полном разборе и коде эксплойта.
Поскольку epoll нельзя отключить, у Bad Epoll нет простого обходного пути. Единственное решение — применить патч.
a6dc643c6931,
или бэкпорт вашего дистрибутива, как только он станет доступен.Bad Epoll была внедрена коммитом
58c9b016e128 (2023-04-08)
и исправлена коммитом
a6dc643c6931 (2026-04-24).
Многие дистрибутивы Linux могут быть затронуты, если они используют ядра на основе v6.4 или новее и ещё не перенесли исправление. Проверьте обновления безопасности ядра вашего дистрибутива на предмет бэкпорта указанного выше исправляющего коммита. Более старые ядра на основе v6.1 не затронуты, поскольку уязвимость была внедрена в v6.4.
Текущий эксплойт написан для следующих целей Google kernelCTF.
lts-6.12.67 (LTS), надёжность 99%cos-121-18867.294.100 (COS), надёжность 98%Эксплойт для Android всё ещё в разработке.
Название продолжает серию "Bad" — багов ядра, дающих root на Android. К более ранним представителям относятся Bad Binder, Bad IO_uring и Bad Spin. Bad Epoll — аналог для epoll.
Эта страница — краткая версия. Полный анализ первопричины, разбор эксплойта и код эксплойта вы найдёте по следующим ссылкам.
Bad Epoll была обнаружена и эксплуатирована Jaeyoung Chung.
Огромное спасибо нашей исследовательской группе, CompSec Lab, и особенно Eulgyu Kim, Woohyuk Choi, Dae R. Jeong и моему научному руководителю Byoungyoung Lee, за их руководство и поддержку.
| Дата | Событие |
|---|
| 2023-04-08 | Уязвимость была внедрена в epoll (коммит 58c9b016e128). |
| 2026-02-17 | Мы сообщили об уязвимости на [email protected]. |
| 2026-02-17 | Мейнтейнеры предложили прототип патча, но это не было корректным исправлением, и обсуждение затем застопорилось. |
| 2026-04-02 | Исправление уязвимости, найденной Mythos (CVE-2026-43074), попало в mainline. |
| 2026-04-22 | Мы повторно сообщили об оставшейся проблеме. |
| 2026-04-24 | Исправление этой уязвимости попало в mainline (коммит a6dc643c6931). |