
Utilisez CVE-2026-43074 pour désactiver SELinux sur Android (Linux 6.6/6.12)
Extraction autonome de l'étape de désactivation de SELinux de l'exploit UAF eventpoll CVE-2026-43074. Il entre en concurrence (race condition) avec la vérification de profondeur de boucle eventpoll (ep_get_upwards_depth_proc) pour écrire un zéro dans selinux_state.enforcing, basculant l'appareil en mode Permissif via une écriture noyau d'un seul octet. Il s'agit uniquement de la primitive de désactivation du MAC — aucune escalade de privilèges.
[!WARNING] Preuve de concept d'exploit noyau. Peut planter le noyau, corrompre des données ou laisser l'appareil incohérent. Exécutez uniquement sur des appareils que vous possédez ou que vous êtes autorisé à tester. Sauvegardez d'abord.
Extraite du PoC complet par NebuSec (arborescence source). L'UAF se trouve dans la vérification de profondeur de boucle eventpoll (ep_get_upwards_depth_proc), qui parcourt epi->ep sous RCU pendant que ep_free() peut libérer le struct eventpoll depuis un thread concurrent. En amont, cela a été corrigé en différant la libération à une période de grâce RCU (commit 07712db8; NVD, OSV).
Ceci est distinct de "Bad Epoll" (CVE-2026-46242), un autre use-after-free dans ep_remove() dans le même code eventpoll ; la race condition ici concerne spécifiquement le bogue de durée de vie de la vérification de profondeur de boucle corrigé par 07712db8.
Selon le CNA de kernel.org (via OSV/NVD), les branches stables vulnérables et leurs correctifs :
6.4.0 – <6.6.136 (corrigé en 6.6.136)6.7.0 – <6.12.83 (corrigé en 6.12.83)6.13.0 – <6.18.24 (corrigé en 6.18.24)6.19.0 – <6.19.14 (corrigé en 6.19.14)Le noyau cible épinglé 6.6.118-android15-8 se trouve dans la plage 6.6 affectée (corrigé en 6.6.136). Les noyaux des fournisseurs qui ont backporté le correctif sans incrémenter la version amont ne sont pas vulnérables — vérifiez la présence réelle du patch plutôt que de vous fier uniquement à uname -r.
Épinglé à une build exacte — l'octet enforcing est atteint via un alias KVA codé en dur et la race condition dépend de l'agencement slab de ce noyau :
6.6.118-android15-8-g53e6e091166e-ab15266607-4kgoogle/blazer/blazer:17/CP2A.260705.006/15641320:user/release-keysTARGET_SELINUX_ENFORCING_ALIAS = 0xffffff800236a2e0Re-cibler une autre build nécessite de recalculer l'alias (offset image de selinux_state + base de mappage + adresse de chargement) dans src/target.h.
Nécessite le NDK Android avec la chaîne d'outils clang aarch64. Par défaut : NDK_ROOT=/opt/android-ndk, API=35 :
make # → build/disabler
Remplacer si nécessaire :
make API=35 NDK_ROOT=/path/to/android-ndk
Poussez build/disabler sur l'appareil et exécutez en tant qu'utilisateur shell (uid 2000). SELinux doit être Enforcing au départ ; le binaire s'arrête sinon. En cas de succès :
SELINUX_AFTER Permissive
RESULT PASS selinux_zero attempt=N
Vérifiez avec getenforce → Permissive.
L'exploit original ajoute, par-dessus cette primitive, une redirection flags de pipe-buffer (écriture de style DirtyPipe dans une page cache en lecture seule) qui patch /system/bin/dumpstate pour lancer un démon root. Ces étapes (pipe.c, patch.c, su.c, payloads.S et l'orchestration originale main.c) sont supprimées ici, et late_refs.c est réduit à son chemin de redirection d'octet zéro. Désactiver SELinux seul n'accorde pas root — cela supprime uniquement l'application du MAC afin que la charge utile porteuse puisse s'exécuter sans restriction.