
Exploit d'élévation de privilèges locale pour Xiaomi XIG04 (Android 12) via le use-after-free du noyau CVE-2026-43499. Technique de root direct limitée aux données avec force brute des tags MTE pour le rootage du propriétaire de l'appareil.
aristotle (au/KDDI Xiaomi XIG04)Élévation de privilèges locale (tmp-root) pour le au/KDDI Xiaomi "aristotle" (XIG04) sous Android 12, via CVE-2026-43499. Il s'agit d'une primitive de root de type device-owner : elle roote votre propre téléphone (p. ex. pour réactiver ADB lorsque les options de développeur sont inaccessibles).
Ceci est un port aristotle de l'implémentation amont :
https://github.com/x-spy/CVE-2026-43499-popsicle — qui cible le Xiaomi
17 / Pro / Ultra (popsicle, Snapdragon, Android 16, noyau 6.12.23). Tout le
crédit pour la technique d'exploitation revient au projet amont ; ce fork ne fait
que le réadapter à un autre appareil et une autre génération de noyau.
Périmètre : votre propre XIG04 exécutant
Xiaomi/XIG04_jp_kdi/XIG04:12/SP1A.210812.016/V14.0.3.0.TMFJPKD. Il ne s'agit pas d'un exploit à usage général ou à distance.
device : aristotle (au/KDDI XIG04), MediaTek, Android 12
kernel : 5.10.136-android12-9-00020-gc9f59ef34367-ab9585114 (VA=39, 4K pages, KASLR)
CVE-2026-43499 est une use-after-free dans le chemin Futex-PI du noyau Linux :
remove_waiter() dans kernel/locking/rtmutex.c opère sur current au lieu de
waiter::task lors du rollback du verrou proxy depuis futex_requeue(), laissant
un pi_blocked_on pendant. C'est un bug ancien et de longue durée (qui a
affecté Linux 2.6.39 – 6.18.x), donc le noyau 5.10.136 ici est dans la plage
concernée (CONFIG_FUTEX_PI=y, CONFIG_RT_MUTEXES=y). L'exploit utilise un
« direct-root » data-only (échange cred → init_cred, basculement de SELinux
enforcing) et soumet les tags MTE à une attaque par force brute pour survivre au
durcissement de l'appareil (KASAN_HW_TAGS, MTE, , ).
Le projet amont cible Snapdragon / Android 16 / noyau 6.12 ; aristotle est MediaTek / Android 12 / noyau 5.10, donc le port redérive tout ce qui est spécifique à l'appareil :
rt_mutex_waiter est l'ancienne disposition plate 5.10 (pas de rt_waiter_node
imbriqué, ni de wake_state/ww_ctx). Les tables de faux waiter dans
source/src/{slide,fops}.c et source/src/util.c sont reconstruites pour passer
de 13 mots à 10.xbl_config. KASLR est contourné dynamiquement (fuite d'informations
du noyau dans slide.c) ; les deux constantes physiques que le projet amont tirait
du Qualcomm XBL sont remplacées par une base DRAM statique (0x40000000, issue de
l'arbre de périphériques) plus memstart_addr / kimage_voffset au moment de
l'exécution.ARISTOTLE_CVE43499_PORT.md.Un source/src/target.h mesuré pour XIG04 est déjà inclus dans le dépôt, vous
pouvez donc compiler directement. Pour le régénérer à partir d'une image boot,
utilisez le générateur aristotle (pas de --xbl-config ; il émet les RVA
memstart_addr/kimage_voffset pour une utilisation dynamique) :
python3 gen_aristotle_target.py \
--boot boot.img \
--pselect-shift 0 \
--loggers 0xffffffc012771380 \
--boot-id-data 0xffffffc012886cf8 \
--kernel-phys-load 0x40080000 \
-o source/src/target.h
(Les trois ancres et le kernel-phys-load sont les valeurs intégrées dans l'en-tête
inclus ; voir ARISTOTLE_CVE43499_PORT.md pour savoir comment elles ont été obtenues.)
Nécessite Python 3 et le NDK Android (r29). API=31 est requis afin que la
charge utile se charge sur Android 12 :
make -C source clean preload API=31
Si le NDK n'est pas détecté automatiquement :
NDK_ROOT=/path/to/android-ndk make -C source clean preload API=31
Artefact final :
source/build/bin/preload.so
adb push source/build/bin/preload.so /data/local/tmp/preload.so
adb shell 'chmod 0644 /data/local/tmp/preload.so'
adb shell 'LD_PRELOAD=/data/local/tmp/preload.so /system/bin/true'
adb shell '/data/local/tmp/su -c id'
En cas de succès :
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
direct-root-summary root=1 id=1 su=1/... selinux=1->0 uid=0 euid=0 gid=0 egid=0
preload.so intègre et auto-installe son propre client + démon su lorsqu'il est
chargé, donc aucun binaire su séparé n'est nécessaire.
Statut : le port est complet au niveau du code d'après l'analyse statique, mais pas encore validé sur du matériel réel. Validez d'abord le déclencheur du crash, puis le root, sur votre propre appareil. Les éléments de réglage spécifiques au noyau (
MM_ORDER,P0_KERNEL_PHYS_LOAD, le comportement du flat-waiter) sont listés dansARISTOTLE_CVE43499_PORT.md.
CFISCS