
(CVE-2026-43499)استغلال النواة لأجهزة OnePlus ذات محمل الإقلاع المقفل.
استغلال النواة يستهدف أجهزة OnePlus ذات مُحمل الإقلاع المقفل. يستخدم CVE-2026-43499 للحصول على صلاحيات الجذر دون فتح مُحمل الإقلاع أو تعديل boot.img.
لأغراض البحث الأمني المُعتمد والتعليم فقط.
| العنصر | التفاصيل |
|---|---|
| CVE | CVE-2026-43499 |
| النوع | استخدام بعد التحرير (Use-After-Free) في Futex PI (Priority Inheritance) |
| النطاق | نواة لينكس من 2.6.39 إلى 7.1 |
| تم الإصلاح في | النسخة الرئيسية 7.1 (الالتزام 3bfdc63936dd) |
| حالة أندرويد | GKI 6.12.x لا تزال ضعيفة |
يقوم استدعاء النظام pselect6 بنسخ fd_set إلى مكدس النواة. عندما يُدمج مع آلية انتظار Futex PI، يمكن إعادة تخصيص إطار مكدس تم تحريره كبنية rt_mutex_waiter. أثناء اجتياز سلسلة PI، تؤدي إعادة توازن شجرة rb إلى كتابة بيانات مُتحكم بها في عناوين نواة عشوائية.
Futex PI UAF (CVE-2026-43499)
├─ تزوير كائن rt_mutex_waiter
├─ التحكم في مكدس النواة عبر تخطيط fd_set الخاص بـ pselect/select
├─ تشغيل عملية PI الخاصة بـ rt_mutex لكتابة عشوائية
├─ الكتابة 1: selinux_state.enforcing = 0
└─ الكتابة 2: cred → init_cred (uid=0، صلاحيات كاملة)
يمكن تكييف أجهزة OnePlus الأخرى التي تستخدم نفس عائلة SoC، أو أندرويد 16، أو نواة 6.12.x عبر استخراج الإزاحات من boot.img.
يتولى GhostLock رفع الصلاحيات. يتطلب تثبيت KernelSU وجود ksud (مُرفق مع kernelsu.ko الخاص بـ KMI):
| المصدر | ملاحظات |
|---|---|
| ReSukiSU APK (موصى به) | قم بتثبيت ReSukiSU؛ يحتوي APK على |
بدون ksud، سيظل الاستغلال يمنح صلاحية الجذر (uid=0)، لكن KernelSU لن يُثبت ولن يستمر وجود
su.
ANDROID_NDK_HOME أو ANDROID_NDK_ROOT# الافتراضي (API 35)
make
# تحديد مستوى API
make API=34
# تحديد مسار NDK
NDK=/path/to/android-ndk make
ghostlock — ملف تنفيذي ARM64 ELF مرتبط بشكل ثابت.
# 1. تمكين وضع ADB TCP
adb tcpip 5555
# 2. دفع مفتاح ADB (مطلوب لوضع التمهيد)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
# 3. دفع ملف الاستغلال
adb push ghostlock /data/local/tmp/a/e
adb shell chmod 755 /data/local/tmp/a/e
بعد النجاح الأول، يقوم
resetpropتلقائيًا بتعيينpersist.adb.tcp.port=5555، مما يسمح بتشغيل تلقائي كامل في عمليات إعادة التشغيل اللاحقة.
/data/local/tmp/a/e
/data/local/tmp/a/e --bootstrap
setprop لتمكين ADB TCP 5555127.0.0.1:5555/data/local/tmp/a/e --write1
الإزاحات مخزنة في جدول بحث src/devices/offsets.h، مُفهرسة بـ uname -r. يقوم البرنامج بالمطابقة تلقائيًا عند البدء؛ يتم رفض النوى غير المعروفة.
static const struct kernel_offsets known_offsets[] = {
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14275539-4k", ...),
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14552068-4k", ...),
OFFSETS_ENTRY("6.12.23-android16-5-...-ab14541642-4k", ...),
{ .uname_r = NULL } /* حارس */
};
عندما تكون مؤشرات النواة مقيدة (kptr_restrict)، يتم تسريب العنوان الأساسي عبر boot_id المكتوب بعنوان نواة:
قراءة /proc/sys/kernel/random/boot_id
└─ UUID يحتوي على عنوان nfulnl_logger
└─ انزلاق KASLR = العنوان المسرب - إزاحة الصورة
└─ kaslr_base
عندما يكون جهاز ashmem قابلاً للوصول، استخدم بدائيات القراءة/الكتابة الخاصة بـ configfs لقراءة مؤشرات الدوال من جدول fops الخاص بـ ashmem وحساب إزاحة KASLR.
تزوير كائنات النواة على صفحات من الدرجة الثالثة (32 كيلوبايت):
file_operations مزيف — اختطاف مؤشر fops لجهاز miscdevice الخاص بـ ashmemrt_mutex_waiter مزيف — محاكاة عقدة منتظِمة في سلسلة PItask_struct مزيف — مرجع مهمة أثناء اجتياز PIrt_mutex (قفل) مزيف — معلومات صحيحة عن المنتظِم والمالكتم التنفيذ عبر SKB (socket buffer) + KernelSnitch:
mm_structsendmsg لملء كومة النواةبعد الحصول على أساس KASLR، استخدم مخازن pipe للوصول إلى الذاكرة الفعلية:
1. تحديد موقع مخزن pipe في physmap
2. تزوير جدول عمليات pipe_buffer مشيرًا إلى pipe_buf_ops معروف
3. اختطاف pipe_buffer.page للوصول إلى العنوان الفعلي المستهدف
4. قراءة/كتابة فيزيائية عشوائية عبر عمليات pipe العادية
المدعوم: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data
الهدف: selinux_state.enforcing (إزاحة 0x00)
الطريقة: كتابة PI عبر العقدة الفرعية → تزوير __rb_parent_color
مشيرًا إلى selinux_enforcing - 8
إعادة توازن شجرة rb يكتب 0x00
الهدف: مؤشر cred للعملية الفرعية
الطريقة: 1. fork طفل → perf_find_task() لتحديد موقع task_struct
2. حساب إزاحة حقل cred
3. كتابة PI عبر العقدة الفرعية → cred = init_cred (uid=0، صلاحيات كاملة)
4. مسح seccomp (TIF_SECCOMP + بنية seccomp مصفرة)
يتم التحقق من القراءة الخلفية للصلاحيات بعد استبدال cred.
src/core/miniadb.c — عميل بروتوكول ADB خفيف الوزن لوضع التمهيد:
1. اتصال TCP بـ 127.0.0.1:5555
2. A_CNXN → طلب اتصال
3. A_AUTH → تحدي رمز RSA
4. dlopen("libcrypto.so") → PEM_read_bio_RSAPrivateKey → RSA_sign
5. A_AUTH (AUTH_SIGNATURE) → استجابة موقعة
6. A_CNXN → إنشاء الاتصال
7. A_OPEN "shell:/data/local/tmp/a/e" → استغلال كامل
يدعم خوارزميات التوقيع SHA-1 و SHA-256.
ghostlock-oneplus/
├── Makefile # تكوين البناء (NDK cross-compile)
├── README.md # التوثيق
├── src/
│ ├── core/ # كود الاستغلال الأساسي
│ │ ├── main.c # نقطة الدخول: كتابة مرحلتين + شل الجذر
│ │ ├── fops.c # وضع FOPS/CFI: مسار pselect، كتابة PI، تسريب KASLR
│ │ ├── util.c # الأدوات: رش الكومة، KASLR، بدائيات R/W للنواة
│ │ ├── slide.c # وضع SLIDE: تسريب boot_id KASLR + مسار pselect
│ │ ├── pipe.c # قراءة/كتابة الذاكرة الفعلية لمخزن pipe (physrw)
│ │ ├── root.c # استبدال cred، مسح seccomp، إدارة الطفل الجذر
│ │ ├── miniadb.c # عميل ADB مدمج (TCP + مصادقة RSA)
│ │ ├── common.h # وحدات ماكرو عالمية، بنى، تصريحات، ثوابت
│ │ ├── target.h # تخطيط الذاكرة المستهدف / إزاحات البنى / معاملات KASLR
│ │ ├── offset.h # جسر تكوين الهدف في وقت الترجمة (#include TARGET_CONFIG_H)
│ │ └── kernelsnitch/ # KernelSnitch — تسريب عنوان mm_struct
│ │ ├── kernelsnitch.h # الخوارزمية الأساسية: تصادم تجزئة futex + القوة الغاشمة
│ │ ├── futex_hash.h # دالة تجزئة futex
│ │ ├── timeutils.h # قياس الطابع الزمني لوحدة المعالجة المركزية (RDTSC)
│ │ └── utils.h # وحدات ماكرو مساعدة (pr_info / SYSCHK / ASSERT إلخ.)
│ └── devices/ # جداول إزاحات الأجهزة
│ ├── offsets.h # تجميع جميع إزاحات الأجهزة (جدول بحث + حارس)
│ ├── ace6t/offsets.h # إزاحات OnePlus Ace 6T (نسختا نواة)
│ └── op15/offsets.h # إزاحات OnePlus 15 (نسخة نواة واحدة)
└── tools/ # سلسلة أدوات استخراج الإزاحات
├── extract_target.py # استخراج إزاحات الرموز العامة من kallsyms (28 عنصرًا)
└── extract_btf.py # استخراج إزاحات حقول بنى BTF (57 عنصرًا)
فقط boot.img الخاص بالجهاز المستهدف مطلوب — لا حاجة لصلاحية الجذر أو وصول للجهاز.
# 1. استخراج النواة من boot.img
python -c "import struct; d=open('boot.img','rb').read(); \
open('kernel','wb').write(d[4096:4096+struct.unpack_from('<I',d,8)[0]])"
# 2. الحصول على kallsyms (الجذر: adb shell su -c 'cat /proc/kallsyms' > kallsyms.txt)
# أو من vmlinux: nm vmlinux > kallsyms.txt
# 3. استخراج إزاحات الرموز العامة
python tools/extract_target.py # 28 إزاحة، تحقق تلقائي
# 4. استخراج إزاحات حقول البنى
python tools/extract_btf.py kernel # 57 إزاحة، تحقق تلقائي
src/devices/<name>/offsets.h (انظر ace6t/offsets.h)#include) في src/devices/offsets.hsrc/core/target.h لـ KIMAGE_TEXT_BASE وتخطيط الذاكرة إذا لزم الأمر| العنصر | ملاحظات |
|---|
تأكد من أنك تعمل في ADB shell. سياق التطبيق يتطلب --bootstrap.
إصدار النواة الخاص بك غير مدعوم بعد. اتبع إضافة أجهزة جديدة لاستخراج الإزاحات وإعادة البناء.
CORE macro)PSELECT_ENTER_DELAY_USECperf_event_open (استخدم --bootstrap في سياق التطبيق)kaslr_base صحيح)ksud وقابليته للتنفيذload_policy)لأغراض البحث الأمني المُعتمد والتعليم فقط.
| الجهاز | الاسم الرمزي | SoC | النواة | البرنامج الثابت | الحالة |
|---|
| OnePlus Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14275539-4k | ColorOS 16.0.2.403 | ✅ تم التحقق |
| OnePlus Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14552068-4k | ColorOS 16.0.8.301 | ✅ تم التحقق |
| OnePlus 15 | PLK110 | SM8845 (Snapdragon 8s Elite) | 6.12.23-android16-5-...-ab14541642-4k | — | ✅ تم التحقق |
libksud.so| إصدار CI | قم بالتنزيل من ReSukiSU CI (ksud-aarch64-linux-android.zip) |
| النوع | العدد | الاستخراج |
|---|
| رموز kallsyms العامة | 28 | tools/extract_target.py |
| حقول بنى BTF | 57 | tools/extract_btf.py |
| قيم مشتقة | 9 | محسوبة تلقائيًا |
| ثوابت ثابتة | 12 | مشفرة صلبًا |
| البنية | الحقول | الغرض |
|---|
task_struct | 17 | واصف العملية، cred، seccomp |
rt_mutex_waiter | 6 | هدف تزوير UAF |
cred | 4 | بيانات الاعتماد، الصلاحيات |
seccomp | 3 | حالة مرشح seccomp |
pipe_inode_info | 11 | عمليات الـ pipe buffer |
file_operations | 13 | جدول fops مزيف |
mm_struct | 1 | مالك واصف الذاكرة |
| الوحدة | الملف(ات) | المسؤولية |
|---|
| الدخول | main.c | تحليل CLI، توزيع W1/W2، تدفق التمهيد |
| مسار PI | fops.c / slide.c | تخطيط مكدس pselect/select، التلاعب بسلسلة Futex PI |
| KASLR | util.c / fops.c / slide.c | تجاوز ثنائي الوضع: تسريب boot_id + تسريب جدول fops |
| رش الكومة | util.c | تخصيص صفحات الدرجة الثالثة، رش SKB، تخطيط الكائنات المزيفة |
| قراءة/كتابة فيزيائية | pipe.c | اختطاف مخزن pipe، الوصول العشوائي للذاكرة الفعلية |
| رفع الصلاحيات | root.c | استبدال cred، التحقق من الصلاحيات، مسح seccomp |
| ADB | miniadb.c | عميل بروتوكول ADB خفيف الوزن، مصادقة RSA |
| محرك التسريب | kernelsnitch/ | تصادم تجزئة futex لتحديد موقع mm_struct |
VA_BITS | 48 مقابل 39 → تحديث تخطيط الذاكرة في target.h |
| التوقيت | ضبط معاملات PSELECT_* في common.h |
| Ashmem | تطبيق C مقابل Rust → تحديث مطابقة الرموز في extract_target.py |
| Secureguard | الأجهزة غير OnePlus قد تبسط النشر |