
Используйте CVE-2026-43074 для отключения SELinux на Android (Linux 6.6/6.12)
Автономное извлечение этапа отключения SELinux из эксплойта UAF для CVE-2026-43074 в eventpoll. Он гоняет проверку глубины цикла eventpoll (ep_get_upwards_depth_proc), чтобы записать ноль в selinux_state.enforcing, переводя устройство в режим Permissive с помощью одно-байтовой записи в ядро. Это только примитив для отключения MAC — повышения привилегий нет.
[!WARNING] Proof-of-concept эксплойта для ядра. Может привести к краху ядра, повреждению данных или неконсистентному состоянию устройства. Запускайте только на устройствах, которыми владеете или на тестирование которых уполномочены. Сделайте резервную копию.
Вырезано из полного PoC от NebuSec (дерево исходников). UAF находится в проверке глубины цикла eventpoll (ep_get_upwards_depth_proc), которая обходит epi->ep под RCU, в то время как ep_free() может освободить struct eventpoll из параллельного потока. Upstream исправил это, отложив освобождение до периода RCU grace (коммит 07712db8; NVD, OSV).
Это отличается от «Bad Epoll» (CVE-2026-46242), отдельного use-after-free в ep_remove() в том же коде eventpoll; данная гонка — это именно баг времени жизни проверки глубины цикла, исправленный коммитом 07712db8.
Согласно CNA от kernel.org (через OSV/NVD), уязвимые стабильные ветки и их исправления:
6.4.0 – <6.6.136 (исправлено на 6.6.136)6.7.0 – <6.12.83 (исправлено на 6.12.83)6.13.0 – <6.18.24 (исправлено на 6.18.24)6.19.0 – <6.19.14 (исправлено на 6.19.14)Целевое ядро 6.6.118-android15-8 попадает в затронутый диапазон 6.6 (исправлено на 6.6.136). Вендорные ядра, которые перенесли исправление без обновления версии upstream, не уязвимы — проверяйте фактическое наличие патча, а не полагайтесь только на uname -r.
Привязано к одной конкретной сборке — байт enforcing достигается через жёстко заданный псевдоним KVA, и гонка зависит от slab-планировки этого ядра:
6.6.118-android15-8-g53e6e091166e-ab15266607-4kgoogle/blazer/blazer:17/CP2A.260705.006/15641320:user/release-keysTARGET_SELINUX_ENFORCING_ALIAS = 0xffffff800236a2e0Перенацеливание на другую сборку требует пересчёта псевдонима (смещение selinux_state в образе + база отображения + адрес загрузки) в src/target.h.
Требуется Android NDK с тулчейном aarch64 clang. По умолчанию NDK_ROOT=/opt/android-ndk, API=35:
make # → build/disabler
При необходимости можно переопределить:
make API=35 NDK_ROOT=/path/to/android-ndk
Отправьте build/disabler на устройство и запустите от пользователя shell (uid 2000). SELinux изначально должен быть Enforcing; иначе бинарник пропускает выполнение. В случае успеха:
SELINUX_AFTER Permissive
RESULT PASS selinux_zero attempt=N
Проверьте с помощью getenforce → Permissive.
Оригинальный эксплойт поверх этого примитива добавляет переадресацию flags в pipe-буфере (запись в стиле DirtyPipe в страницу page-cache, доступную только для чтения), которая патчит /system/bin/dumpstate для запуска root-демона. Эти этапы (pipe.c, patch.c, su.c, payloads.S и оркестрация оригинального main.c) здесь опущены, а late_refs.c сокращён до пути переадресации нулевого байта. Отключение одного лишь SELinux не даёт root — оно только снимает принудительное применение MAC, чтобы несущий полезную нагрузку мог работать без ограничений.