
Exploit del kernel de Android para CVE-2026-43499 (use-after-free en Futex-PI) que obtiene root temporal en Xiaomi XIG04 para habilitar ADB. Incluye compilación automatizada del payload y activación con un solo toque.
Una aplicación minimalista de Android que activa ADB en un au/KDDI Xiaomi "aristotle" (XIG04, Android 12) cuyas opciones de desarrollador son inaccesibles, usando un root temporal obtenido de CVE-2026-43499. Es una herramienta de propietario del dispositivo de la misma categoría que KingRoot: rootea tu propio teléfono para cambiar un ajuste.
Ámbito: tu propio XIG04 con
Xiaomi/XIG04_jp_kdi/XIG04:12/SP1A.210812.016/V14.0.3.0.TMFJPKD. No es un exploit de propósito general ni remoto.
Un botón, una sola tarea:
preload.so) extraído del APK en el
filesDir privado de la app, chmod 0700./system/bin/true efímero con
LD_PRELOAD apuntando a ese payload. El constructor ELF del payload activa
el use-after-free de Futex-PI, toma tmp-root y autoinstala un su
cliente + daemon.su -c id y comprobando uid=0.settings put global development_settings_enabled 1settings put global adb_enabled 1stop adbd; start adbd (alternativa: setprop ctl.restart adbd)Cada paso se registra en un log en pantalla.
CVE-2026-43499 — un use-after-free en la ruta Futex-PI del kernel de Linux
(kernel/locking/rtmutex.c, remove_waiter()). El kernel 5.10.136-android12
de aristotle está afectado (CONFIG_FUTEX_PI=y,
CONFIG_RT_MUTEXES=y). El exploit usa un "direct-root" solo de datos (intercambia cred,
cambia SELinux a enforcing) y fuerza bruta las etiquetas MTE para superar el
endurecimiento del dispositivo. El código fuente del exploit y los offsets medidos de aristotle
están en el submódulo git exploit/ de este repositorio.
preload.so no está versionado. Se genera a partir del submódulo exploit/
y se incrusta en el APK durante la compilación:
exploit/ — submódulo git: el exploit de aristotle para CVE-2026-43499 (compila
preload.so).buildExploitSo (integrada en preBuild) ejecuta el
make ... API=31 del exploit y copia el preload.so resultante en
app/src/main/assets/exploit/preload.so antes de empaquetar el APK.Por tanto, un ./gradlew assembleDebug normal compila el payload y lo incluye,
siempre que el Android NDK esté instalado.
# 1. fetch the exploit submodule
git submodule update --init --recursive
# 2. install the Android NDK r29 (the exploit Makefile auto-detects it,
# or export ANDROID_NDK_ROOT), plus JDK 17 and Android SDK platform 34
# 3. build — auto-builds preload.so (API=31) and embeds it
./gradlew assembleDebug # -> app/build/outputs/apk/debug/app-debug.apk
¿Sin NDK / solo quieres el esqueleto de la app? Omite la compilación del payload (la app entonces informa de "exploit payload NOT deployed" y no cambia nada en tiempo de ejecución):
./gradlew assembleDebug -PskipExploitBuild
Jar del wrapper: gradle-wrapper.jar no está versionado. Genéralo una vez con
gradle wrapper --gradle-version 8.2, o compila con un Gradle del sistema (la CI usa un
Gradle del sistema, por lo que no se requiere el jar del wrapper allí).
.github/workflows/build-release.yml (GitHub Actions) compila el APK en cada
push y lo publica como una GitHub Release (etiqueta build-<run>), con el
app-debug.apk adjunto. El workflow hace checkout del submódulo exploit,
instala JDK 17 / Android SDK 34 / NDK r29 y ejecuta gradle assembleDebug,
que compila e incrusta preload.so (API=31).
Configuración única: sube este repositorio y el del exploit al mismo propietario de GitHub
como repositorios hermanos, para que la url relativa del submódulo se resuelva. Si el
repositorio del exploit es privado, añade un PAT con ámbito repo como secreto SUBMODULE_PAT
y descomenta la línea token: en el workflow.
.
├── settings.gradle / build.gradle / gradle.properties Gradle wiring
├── gradlew(.bat) + gradle/wrapper/ wrapper
├── exploit/ git submodule (builds preload.so)
└── app/
├── build.gradle minSdk 31 / targetSdk 31 / compileSdk 34, arm64-v8a; buildExploitSo task
└── src/main/
├── AndroidManifest.xml single launcher Activity, no dangerous perms
├── java/.../MainActivity.kt button + scrolling log
├── java/.../ExploitRunner.kt stage → LD_PRELOAD → su -c "settings ..."
├── res/{layout,values}/ UI, strings, theme
└── assets/exploit/ preload.so is embedded here at build time
git submodule update --init --recursive, instala el NDK y luego
./gradlew assembleDebug.adb_enabled is now: 1.adb_enabled en los ajustes
globales suele persistir, y adbd no necesita root una vez habilitado.LD_PRELOAD puede ser denegado
según el dominio de la app; la propia estrategia del exploit lo gestiona, y cualquier
denegación se muestra en el log en lugar de ocultarse.