
Androidカーネルエクスプロイト(CVE-2026-43499、Futex-PI use-after-free)で、Xiaomi XIG04上で一時的なroot権限を取得してADBを有効化します。自動化されたペイロードのビルドとワンタップでの有効化を備えています。
「開発者向けオプション」に到達できない au/KDDI Xiaomi "aristotle" (XIG04, Android 12) で、CVE-2026-43499 から取得した一時的な root を利用して ADB を有効にする、最小限の Android アプリです。KingRoot と同じカテゴリのデバイスオーナーツールであり、自分のスマートフォンを root 化して設定を 1 つ切り替えるためのものです。
対象範囲: 以下の ROM を実行している自分所有の XIG04
Xiaomi/XIG04_jp_kdi/XIG04:12/SP1A.210812.016/V14.0.3.0.TMFJPKD。 汎用エクスプロイトやリモートエクスプロイトではありません。
ボタン 1 つ、仕事は 1 つ:
preload.so) をアプリのプライベート filesDir に展開し、chmod 0700 を実行します。LD_PRELOAD をそのペイロードに向けた状態で短時間だけ起動する /system/bin/true を実行し、カーネルのバグを発火させます。ペイロードの 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()) における use-after-free です。aristotle の 5.10.136-android12 カーネルが影響を受けます (CONFIG_FUTEX_PI=y、CONFIG_RT_MUTEXES=y)。このエクスプロイトは、データのみの「ダイレクトルート」( cred の交換、SELinux enforcing の反転) を使用し、デバイスのハードニングを回避するため MTE タグを総当たりで試行します。エクスプロイトのソースと計測済みの aristotle オフセットは、このリポジトリの exploit/ git サブモジュール にあります。
preload.so は コミットされていません。exploit/ サブモジュールから生成され、ビルド時に APK に埋め込まれます:
exploit/ — git サブモジュール: CVE-2026-43499 aristotle エクスプロイト (preload.so をビルドします)。buildExploitSo (preBuild に組み込み済み) がエクスプロイトの make ... API=31 を実行し、APK がパッケージングされる前に生成された preload.so を app/src/main/assets/exploit/preload.so にコピーします。したがって、通常の ./gradlew assembleDebug は、Android NDK がインストールされていればペイロードをビルドして同梱します。
# 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
NDK がない場合やアプリのシェルだけが必要な場合は、ペイロードのビルドをスキップしてください (その場合、アプリは「exploit payload NOT deployed」と報告し、実行時に何も変更しません):
./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 をビルドし、app-debug.apk を添付した GitHub Release (タグ build-<run>) として公開します。このワークフローは exploit サブモジュールをチェックアウトし、JDK 17 / Android SDK 34 / NDK r29 をインストールして、gradle assembleDebug を実行します。これにより preload.so (API=31) がビルドされ、埋め込まれます。
初回セットアップ: このリポジトリとエクスプロイトリポジトリを、サブモジュールの相対 URL が解決されるように、同じ GitHub オーナー の兄弟リポジトリとしてプッシュしてください。エクスプロイトリポジトリがプライベートの場合は、repo スコープの PAT をシークレット SUBMODULE_PAT として追加し、ワークフローの token: 行のコメントを解除してください。
.
├── 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 を実行し、NDK をインストールしてから、./gradlew assembleDebug を実行します。adb_enabled is now: 1 で終了します。adb_enabled は通常保持され、一度有効化されれば adbd は root を必要としません。LD_PRELOAD 経由のアプリプライベートファイルの実行は、アプリのドメインによっては拒否される可能性があります。エクスプロイト側の戦略がこれを処理し、拒否された場合も隠蔽されずログに表示されます。