
CVE-2026-43499 استغلال GhostLock للحصول على صلاحيات الجذر على Chromecast مع Google TV (sabrina)
استغلال للحصول على صلاحيات الجذر (root) لجهاز Chromecast with Google TV (sabrina) عبر CVE-2026-43499 -- ثغرة use-after-free في النظام الفرعي futex PI (وراثة الأولوية) في نواة Linux.
يحقق صلاحيات الجذر على جهاز ذي bootloader مقفل يعمل بنظام Android 14 مع نواة 5.15.170 (PGO+BOLT+LTO، clang 17).
يستغل GhostLock خطأً في remove_waiter() يتم استدعاؤه من مسار التراجع -EDEADLK في rt_mutex_start_proxy_lock(). تقوم الدالة بمسح current->pi_blocked_on (الخاصة بمُعيد الطلب، وهي NULL بالفعل) بدلاً من مهمة المنتظر. لا يتم مسح pi_blocked_on الخاصة بالمنتظر أبداً، مما يترك مؤشراً معلقاً (dangling pointer) إلى rt_mutex_waiter محرر على مكدس النواة.
يؤدي استدعاء sched_setattr لاحق إلى تشغيل rt_mutex_adjust_pi -> rt_mutex_adjust_prio_chain، الذي يتبع المؤشر المعلق ويمر عبر سلسلة PI على بيانات يتحكم بها المهاجم على صفحة heap مُعاد استخدامها -- مما يمنح بدائية كتابة عشوائية (arbitrary write) عبر rb_erase.
ucounts = NULL -- يطابق cap_capable في التكرار الأول وينتهي inc_rlimit_ucounts بعد حلقة واحدة، مما يلغي الحاجة إلى تسريب &init_user_nsPERF_SAMPLE_TID أن تُحتسب فقط لقطات سجلات الخيط المستدعي، مما يمنع خدمات النظام النشطة من السيطرة على تصويت الوضع (mode-vote)5.15.170-android14-11-gf4a1f03072af (aarch64، PGO+BOLT+LTO، clang 17.0.2)CONFIG_FUTEX_PI=y، CONFIG_IO_URING=y، perf_event_paranoid=-1، SELinux في وضع enforcing، panic_on_oops=1، لا توجد user namespacesexport ANDROID_NDK_HOME=/path/to/android-ndk
make -j$(nproc)
يتطلب Android NDK (تم اختباره مع r27). ينتج ملفاً ثنائياً aarch64 مرتبطاً بشكل ثابت.
adb push ghostlock /data/local/tmp/
adb shell "cd /data/local/tmp && ./ghostlock --cred"
يستغرق الاستغلال حوالي 20 ثانية (heap spray + قوة غاشمة KernelSnitch). عند النجاح، تنفذ العملية exec لـ /system/bin/sh ببيانات اعتماد uid=0.
تم نقل وتطوير هذا الاستغلال بواسطة Claude Opus 4.6 (Anthropic) مع GLM-5.3 (Z.ai) كمستشار في استغلال النواة.
kernel/futex/، kernel/locking/rtmutex.c، lib/rbtree.cنُشر هذا الاستغلال لأغراض البحث الأمني والتعليم. يستهدف جهازاً مملوكاً للباحث. لا تستخدمه على أجهزة لا تملكها أو دون تصريح.
MIT
| المرحلة | التقنية |
|---|
| تسريب KASLR | perf_event_open مع PERF_SAMPLE_IP (مقيد بـ TID) |
| تسريب task struct | perf_event_open مع PERF_SAMPLE_REGS_INTR (مقيد بـ TID، وضع عناوين linear-map) |
| تسريب mm_struct | KernelSnitch -- قناة جانبية توقيتية عبر تصادم futex hash |
| Heap spray | تنسيق إسقاط SLUB (memfd-close، تجاوز CPU-partial) + استعادة صفحات من الرتبة 2 عبر io_uring_setup(256) |
| تراكب المكدس | AF_UNIX SOCK_SEQPACKET sendmsg -- ينسخ move_addr_to_kernel بنية sockaddr بحجم 128 بايت إلى مكدس النواة، متراكبةً فوق حقول task/lock/prio الخاصة بالمنتظر المعلق |
| تشغيل المسار | sched_setattr مع سلّم nice تصاعدي (7 -> 14 -> 19) يُفعّل مسار سلسلة PI |
| بدائية الكتابة | rb_erase الحالة 1a تكتب child (fake_cred) إلى parent->rb_right = task->cred |
| تبديل بيانات الاعتماد | task->cred = fake_cred (uid=0، جميع الصلاحيات، user_namespace مزيف مكتفٍ ذاتياً على صفحة الرش) |
| صدفة الجذر | execve("/system/bin/sh") -- ينسخ commit_creds في مسار exec قيمة fake_cred إلى بيانات اعتماد نظيفة في slab |