Android内核漏洞利用,针对CVE-2026-43499(Futex-PI释放后使用),可在小米XIG04上获取临时root权限以启用ADB。包含自动化有效载荷构建和一键激活。
一个极简的安卓应用,用于在无法进入开发者选项的 au/KDDI 小米 "aristotle" (XIG04, Android 12) 上开启 ADB,通过 CVE-2026-43499 获取的临时 root 权限实现。它与 KingRoot 属于同一类设备所有者工具:通过 root 自己的手机来切换一个设置。
范围:你自己的运行
Xiaomi/XIG04_jp_kdi/XIG04:12/SP1A.210812.016/V14.0.3.0.TMFJPKD的 XIG04。 非通用或远程利用。
一键完成:
preload.so)从 APK 中部署到应用的私有 filesDir,并 chmod 0700。/system/bin/true,并将 LD_PRELOAD 指向该载荷来触发内核漏洞。载荷的 ELF 构造函数触发 Futex-PI 释放后使用(use-after-free),获取临时 root,并自行安装 su 客户端和守护进程。su -c id 并检查输出是否为 uid=0 来确认 root 权限。settings put global development_settings_enabled 1settings put global adb_enabled 1stop adbd; start adbd(如果失败则回退到 setprop ctl.restart adbd)每一步都会显示在屏幕日志中。
CVE-2026-43499 — Linux 内核 Futex-PI 路径(kernel/locking/rtmutex.c,remove_waiter())中的释放后使用漏洞。aristotle 的 5.10.136-android12 内核受影响(CONFIG_FUTEX_PI=y,CONFIG_RT_MUTEXES=y)。该利用采用纯数据的“直接 root”(交换 cred,关闭 SELinux 强制模式),并暴力破解 MTE 标签以绕过设备的加固。利用源码和测量的 aristotle 偏移量位于本仓库的 exploit/ git 子模块中。
preload.so 不提交。它由 exploit/ 子模块生成,并在构建时嵌入 APK:
exploit/ — git 子模块:CVE-2026-43499 aristotle 利用(构建 preload.so)。buildExploitSo(接入 preBuild)运行利用的 make ... API=31,然后将生成的 preload.so 复制到 app/src/main/assets/exploit/preload.so,之后 APK 被打包。因此,正常运行 ./gradlew assembleDebug 即可构建并包含载荷,前提是已安装 Android NDK。
# 1. 获取利用子模块
git submodule update --init --recursive
# 2. 安装 Android NDK r29(利用的 Makefile 会自动检测,或者设置 ANDROID_NDK_ROOT 环境变量),以及 JDK 17 和 Android SDK platform 34
# 3. 构建 — 自动构建 preload.so(API=31)并嵌入
./gradlew assembleDebug # -> app/build/outputs/apk/debug/app-debug.apk
没有 NDK / 只想要应用外壳?跳过载荷构建(应用会显示“利用载荷未部署”,且运行时不做任何更改):
./gradlew assembleDebug -PskipExploitBuild
Wrapper jar: gradle-wrapper.jar 不提交。使用 gradle wrapper --gradle-version 8.2 生成一次,或使用系统 Gradle 构建(CI 使用系统 Gradle,因此不需要 wrapper jar)。
.github/workflows/build-release.yml(GitHub Actions)在 每次推送 时构建 APK,并将其作为 GitHub Release(标签 build-<run>)发布,附带上 app-debug.apk。该工作流检出 exploit 子模块,安装 JDK 17 / Android SDK 34 / NDK r29,并运行 gradle assembleDebug,该命令会构建并嵌入 preload.so(API=31)。
一次性设置:将此仓库和利用仓库推送到 同一 GitHub 所有者 下作为兄弟仓库,以便子模块的相对 URL 能解析。如果利用仓库是私有的,请添加一个具有 repo 范围的 PAT 作为密钥 SUBMODULE_PAT,并取消工作流中 token: 行的注释。
.
├── settings.gradle / build.gradle / gradle.properties Gradle 配置
├── gradlew(.bat) + gradle/wrapper/ wrapper
├── exploit/ git 子模块(构建 preload.so)
└── app/
├── build.gradle minSdk 31 / targetSdk 31 / compileSdk 34, arm64-v8a; buildExploitSo 任务
└── src/main/
├── AndroidManifest.xml 单个启动 Activity,无危险权限
├── java/.../MainActivity.kt 按钮 + 滚动日志
├── java/.../ExploitRunner.kt 部署 → LD_PRELOAD → su -c "settings ..."
├── res/{layout,values}/ UI、字符串、主题
└── assets/exploit/ 构建时 preload.so 嵌入于此
git submodule update --init --recursive,安装 NDK,然后 ./gradlew assembleDebug。adb_enabled is now: 1 结束。adb_enabled 通常保持不变,启用后 adbd 不需要 root。LD_PRELOAD 执行应用私有文件可能会被拒绝,取决于应用域;利用自身的策略处理了这一点,任何拒绝都会在日志中显示,而非隐藏。