
Use CVE-2026-43074 para desabilitar o SELinux no Android (Linux 6.6/6.12)
Extração independente do estágio de desativação do SELinux do exploit UAF eventpoll CVE-2026-43074. Ele realiza uma corrida contra a verificação de profundidade de loop do eventpoll (ep_get_upwards_depth_proc) para escrever um zero em selinux_state.enforcing, mudando o dispositivo para Permissive através de uma escrita de um único byte no kernel. Isso é apenas a primitiva de desativação de MAC — sem escalonamento de privilégios.
[!WARNING] Prova de conceito de exploit de kernel. Pode travar o kernel, corromper dados ou deixar o dispositivo inconsistente. Execute apenas em dispositivos que você possui ou está autorizado a testar. Faça backup primeiro.
Extraído do PoC completo por NebuSec (árvore de código). O UAF reside na verificação de profundidade de loop do eventpoll (ep_get_upwards_depth_proc), que percorre epi->ep sob RCU enquanto ep_free() pode liberar struct eventpoll de uma thread concorrente. O upstream corrigiu isso adiando a liberação para um período de graça RCU (commit 07712db8; NVD, OSV).
Isso é distinto do "Bad Epoll" (CVE-2026-46242), um use-after-free separado em ep_remove() no mesmo código eventpoll; a corrida aqui é especificamente o bug de tempo de vida da verificação de profundidade de loop corrigido por 07712db8.
De acordo com o CNA do kernel.org (via OSV/NVD), os streams estáveis vulneráveis e suas correções:
6.4.0 – <6.6.136 (corrigido em 6.6.136)6.7.0 – <6.12.83 (corrigido em 6.12.83)6.13.0 – <6.18.24 (corrigido em 6.18.24)6.19.0 – <6.19.14 (corrigido em 6.19.14)O kernel alvo fixado 6.6.118-android15-8 está dentro do intervalo 6.6 afetado (corrigido em 6.6.136). Kernels de fornecedores que retroportaram a correção sem aumentar a versão upstream não são vulneráveis — verifique a presença real do patch em vez de confiar apenas em uname -r.
Fixado a uma compilação exata — o byte enforcing é alcançado através de um alias KVA hardcoded e a corrida depende do layout slab desse kernel:
6.6.118-android15-8-g53e6e091166e-ab15266607-4kgoogle/blazer/blazer:17/CP2A.260705.006/15641320:user/release-keysTARGET_SELINUX_ENFORCING_ALIAS = 0xffffff800236a2e0Re-direcionar para outra compilação requer recalcular o alias (offset da imagem de selinux_state + base de mapeamento + endereço de carregamento) em src/target.h.
Requer o Android NDK com a toolchain clang aarch64. Padrões para NDK_ROOT=/opt/android-ndk, API=35:
make # → build/disabler
Override conforme necessário:
make API=35 NDK_ROOT=/path/to/android-ndk
Envie build/disabler para o dispositivo e execute como o usuário shell (uid 2000). O SELinux deve estar Enforcing no início; o binário ignora caso contrário. Em caso de sucesso:
SELINUX_AFTER Permissive
RESULT PASS selinux_zero attempt=N
Verifique com getenforce → Permissive.
O exploit original adiciona, além desta primitiva, um redirecionamento de flags do pipe-buffer (escrita estilo DirtyPipe em uma página de cache de página somente leitura) que modifica /system/bin/dumpstate para gerar um daemon root. Esses estágios (pipe.c, patch.c, su.c, payloads.S e a orquestração original main.c) foram removidos aqui, e late_refs.c é reduzido ao seu caminho de redirecionamento de byte zero. Desativar o SELinux sozinho não concede root — ele apenas remove a imposição de MAC para que a carga útil transportadora possa ser executada sem confinamento.