
CVE-2026-43499-aristotle-apk build-43
Androidカーネルエクスプロイト(CVE-2026-43499、Futex-PI use-after-free)で、Xiaomi XIG04上で一時的なroot権限を取得してADBを有効化します。自動化されたペイロードのビルドとワンタップでの有効化を備えています。
Aristotle 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 つ:
- APK からエクスプロイトペイロード (
preload.so) をアプリのプライベートfilesDirに展開し、chmod 0700を実行します。 LD_PRELOADをそのペイロードに向けた状態で短時間だけ起動する/system/bin/trueを実行し、カーネルのバグを発火させます。ペイロードの ELF コンストラクタが Futex-PI の use-after-free をトリガーし、一時 root を取得して、suクライアントとデーモンを自己インストールします。su -c idを実行してuid=0を確認し、root を確認します。- root として ADB を有効化します:
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をビルドします)。- Gradle タスク
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 は不要です)。
CI / リリース
.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を実行します。- XIG04 にインストールして起動します。有効にしたいのが ADB の場合は、デバイス自体 (ファイルマネージャー / ブラウザのダウンロード) から APK をインストールし、ランチャーから開きます。
- Enable ADB (tmp-root) をタップしてログを確認します。成功すると
adb_enabled is now: 1で終了します。 - 通常どおり PC から ADB を接続します。
制限事項 / 注意点
- 単一ビルドのみ。 オフセットは上記の ROM に固定されています。別のビルドではペイロードの再移植が必要です。
- tmp-root は揮発性です。 再起動すると root は失われます。グローバル設定の
adb_enabledは通常保持され、一度有効化されれば adbd は root を必要としません。 - SELinux / W^X。
LD_PRELOAD経由のアプリプライベートファイルの実行は、アプリのドメインによっては拒否される可能性があります。エクスプロイト側の戦略がこれを処理し、拒否された場合も隠蔽されずログに表示されます。 - 自分所有デバイスのみ。 これは自分が所有するハードウェアで ADB をロック解除するためのものです。