
Usa CVE-2026-43074 per disabilitare SELinux su Android (Linux 6.6/6.12)
Estrazione autonoma della fase di disabilitazione di SELinux dall'exploit UAF di eventpoll per CVE-2026-43074. Sfrutta una race condition nel controllo della profondità del loop di eventpoll (ep_get_upwards_depth_proc) per scrivere uno zero in selinux_state.enforcing, portando il dispositivo in modalità Permissive tramite una scrittura di un singolo byte nel kernel. Questa è solo la primitiva di disabilitazione MAC — nessuna escalation di privilegi.
[!WARNING] Proof of concept di un exploit per il kernel. Può mandare in crash il kernel, corrompere dati o lasciare il dispositivo in uno stato incoerente. Esegui solo su dispositivi di tua proprietà o autorizzati al test. Esegui prima un backup.
Ritagliato dalla PoC completa di NebuSec (albero dei sorgenti). La UAF risiede nel controllo della profondità del loop di eventpoll (ep_get_upwards_depth_proc), che scorre epi->ep in regime RCU mentre ep_free() può liberare la struct eventpoll da un thread concorrente. A monte è stato corretto differendo la liberazione a un periodo di grazia RCU (commit 07712db8; NVD, OSV).
È distinto da "Bad Epoll" (CVE-2026-46242), un use-after-free separato in ep_remove() nello stesso codice eventpoll; la race qui riguarda specificamente il bug di durata del controllo della profondità del loop corretto da 07712db8.
Secondo il CNA di kernel.org (tramite OSV/NVD), i rami stabili vulnerabili e le relative correzioni:
6.4.0 – <6.6.136 (corretto in 6.6.136)6.7.0 – <6.12.83 (corretto in 6.12.83)6.13.0 – <6.18.24 (corretto in 6.18.24)6.19.0 – <6.19.14 (corretto in 6.19.14)Il kernel di riferimento 6.6.118-android15-8 rientra nell'intervallo 6.6 interessato (corretto in 6.6.136). I kernel dei vendor che hanno integrato la correzione senza aggiornare la versione upstream non sono vulnerabili — verifica l'effettiva presenza della patch invece di affidarti solo a uname -r.
Ancorato a una build esatta: il byte di enforcing viene raggiunto tramite un alias KVA hardcoded e la race dipende dal layout slab di quel kernel:
6.6.118-android15-8-g53e6e091166e-ab15266607-4kgoogle/blazer/blazer:17/CP2A.260705.006/15641320:user/release-keysTARGET_SELINUX_ENFORCING_ALIAS = 0xffffff800236a2e0Per ri-ancorare un'altra build è necessario ricalcolare l'alias (offset dell'immagine di selinux_state + base di mappatura + indirizzo di caricamento) in src/target.h.
Richiede l'Android NDK con la toolchain clang aarch64. I valori predefiniti sono NDK_ROOT=/opt/android-ndk, API=35:
make # → build/disabler
Sovrascrivi se necessario:
make API=35 NDK_ROOT=/path/to/android-ndk
Carica build/disabler sul dispositivo ed eseguilo come utente shell (uid 2000). All'avvio SELinux deve essere Enforcing; altrimenti il binario non fa nulla. In caso di successo:
SELINUX_AFTER Permissive
RESULT PASS selinux_zero attempt=N
Verifica con getenforce → Permissive.
L'exploit originale aggiunge, oltre a questa primitiva, un reindirizzamento dei flags del pipe-buffer (scrittura in stile DirtyPipe in una pagina read-only della page cache) che modifica /system/bin/dumpstate per generare un demone root. Queste fasi (pipe.c, patch.c, su.c, payloads.S e l'orchestrazione dell'main.c originale) sono state rimosse qui e late_refs.c è ridotto al suo percorso di reindirizzamento a byte zero. Disabilitare SELinux da solo non concede root: rimuove solo l'enforcement MAC così che il payload possa essere eseguito senza confinamento.