
Exploit del kernel Android per CVE-2026-43499 (Futex-PI use-after-free) che concede root temporaneo su Xiaomi XIG04 per abilitare ADB. Include creazione automatica del payload e attivazione con un solo tocco.
Un'app Android minimale che attiva ADB su un au/KDDI Xiaomi "aristotle" (XIG04, Android 12) le cui opzioni sviluppatore non sono raggiungibili, utilizzando un root temporaneo ottenuto da CVE-2026-43499. È uno strumento device-owner nella stessa categoria di KingRoot: esegue il root del tuo telefono per modificare un'impostazione.
Ambito: il tuo XIG04 con
Xiaomi/XIG04_jp_kdi/XIG04:12/SP1A.210812.016/V14.0.3.0.TMFJPKD. Non è un exploit generico o remoto.
Un pulsante, un solo compito:
preload.so) dall'APK nella filesDir privata dell'app, chmod 0700./system/bin/true di breve durata con LD_PRELOAD che punta a quel payload. Il costruttore ELF del payload attiva la use-after-free Futex-PI, ottiene tmp-root e auto-installa un client su + demone.su -c id e verificando uid=0.settings put global development_settings_enabled 1settings put global adb_enabled 1stop adbd; start adbd (in alternativa setprop ctl.restart adbd)Ogni passaggio viene riportato in un log a schermo.
CVE-2026-43499 — una use-after-free nel percorso Futex-PI del kernel Linux (kernel/locking/rtmutex.c, remove_waiter()). Il kernel 5.10.136-android12 di aristotle è affetto (CONFIG_FUTEX_PI=y, CONFIG_RT_MUTEXES=y). L'exploit utilizza un "direct-root" solo dati (swap di cred, commutazione di SELinux enforcing) e forza bruta sui tag MTE per superare l'hardening del dispositivo. Il sorgente dell'exploit e gli offset misurati per aristotle si trovano nel git submodule exploit/ di questo repository.
preload.so non è incluso nel repository. Viene prodotto dal submodule exploit/ e incorporato nell'APK in fase di build:
exploit/ — git submodule: l'exploit CVE-2026-43499 per aristotle (compila preload.so).buildExploitSo (integrato in preBuild) esegue il make ... API=31 dell'exploit, quindi copia il preload.so risultante in app/src/main/assets/exploit/preload.so prima che l'APK venga pacchettizzato.Un normale ./gradlew assembleDebug quindi compila e distribuisce il payload, a condizione che l'Android NDK sia installato.
# 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
Niente NDK / vuoi solo la shell dell'app? Salta la build del payload (l'app riporterà quindi "exploit payload NOT deployed" e non modificherà nulla in fase di runtime):
./gradlew assembleDebug -PskipExploitBuild
Jar wrapper: gradle-wrapper.jar non è incluso. Generalo una volta con gradle wrapper --gradle-version 8.2, oppure compila con un Gradle di sistema (la CI usa un Gradle di sistema, quindi lì non è richiesto alcun wrapper jar).
.github/workflows/build-release.yml (GitHub Actions) compila l'APK a ogni push e lo pubblica come GitHub Release (tag build-<run>), con l'app-debug.apk allegato. Il workflow scarica il submodule exploit, installa JDK 17 / Android SDK 34 / NDK r29 ed esegue gradle assembleDebug, che compila e incorpora preload.so (API=31).
Configurazione una tantum: pubblica questo repo e il repo dell'exploit sullo stesso proprietario GitHub come repository fratelli, così l'url relativo del submodule viene risolto. Se il repo dell'exploit è privato, aggiungi un PAT con scope repo come secret SUBMODULE_PAT e decommenta la riga token: nel 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, installa il NDK, poi ./gradlew assembleDebug.adb_enabled is now: 1.adb_enabled nelle impostazioni globali di solito persiste e adbd non richiede root una volta abilitato.LD_PRELOAD può essere negata a seconda del dominio dell'app; la strategia dell'exploit gestisce questo aspetto e qualsiasi negazione viene mostrata nel log anziché nascosta.