## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-SORALIS0912-CVE-2026-43499-ARISTOTLE
# CVE-2026-43499 — `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`. Это не универсальный и не удалённый эксплойт.
## Цель
root@kitploit:~
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`, , ).
## Что отличается от апстрима (popsicle → aristotle)
Апстрим нацелен на 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`.
* **В этом ядре нет BTF** , поэтому смещения структур восстанавливаются дизассемблированием и подставляются, а не читаются из BTF.
* Все смещения, RVA и якоря KASLR были измерены именно для этого ядра — см. `ARISTOTLE_CVE43499_PORT.md`.
## Генерация целевого заголовочного файла
Измеренный `source/src/target.h` для XIG04 уже закоммичен, так что можно сразу собирать. Чтобы перегенерировать его из boot-образа, используйте генератор aristotle (без `--xbl-config`; он выдаёт RVA `memstart_addr`/`kimage_voffset` для динамического использования):
root@kitploit:~
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:
root@kitploit:~
make -C source clean preload API=31
Если NDK не определяется автоматически:
root@kitploit:~
NDK_ROOT=/path/to/android-ndk make -C source clean preload API=31
Конечный артефакт:
root@kitploit:~
source/build/bin/preload.so
## Запуск
root@kitploit:~
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'
При успехе:
root@kitploit:~
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`.