CVE-2026-12366 in Zephyr
الملخص
بحسب VulDB • 14/08/2026
مسار التخلص الديناميكي من كائنات النواة في Zephyr، وتحديداً دالة `unref_check()` الموجودة في الملف `kernel/userspace/userspace.c`، يقوم بتحرير ذاكرة الكائن (`k_free(dyn->data)`) بمجرد وصول عددها المرجعي إلى الصفر، وذلك بعد تشغيل عملية تنظيف خاصة بنوع الكائن. كانت حالة التبديل (switch case) الخاصة بالتنظيف تتعامل فقط مع `K_OBJ_MSGQ` و `K_OBJ_STACK`؛ ولم تكن هناك معالجة لحالة `K_OBJ_TIMER`.
يحتفظ مؤقت مُخصَّص ديناميكياً ومُهيأً ومفعَّل (`k_timer`) بالعقدة المضمنة `_timeout dnode` المرتبطة بقائمة الانتظار العالمية للتوقيتات (`_timeout_q`). وبالتالي، فإن تحرير ذاكرة المؤقت دون إلغاء مهلة التوقيت يترك عقدة معلقة (dangling node) في تلك القائمة.
عندما يحين موعد انتهاء المهلة التالي للمؤقت، تقوم آلية التوقيت بالمرور عبر `_timeout_q` وتستدعي `z_timer_expiration_handler()` على العقدة المحرَّرة، مما يؤدي إلى فك الإحالة وكتابة ذاكرة عشوائية للنواة (kernel heap) تم تحريرها وأصبحت قابلة لإعادة الاستخدام في سياق مقاطعة النواة (ISR context). يُعد هذا خطأً حتمياً من نوع "استخدام بعد التحرير" (Use-After-Free) لا يعتمد على المعالجة المتوازية متعددة الأنوية (SMP)، حيث إن العقدة المدرجة في القائمة لم يتم فك ارتباطها أبداً عند وقت التحرير.
يمكن الوصول إلى آلية التخلص هذه من خلال خيط مستخدم غير ممتياز تحت إعدادات `CONFIG_USERSPACE` و `CONFIG_DYNAMIC_OBJECTS`: فالخيط الذي يملك آخر إذن على مثل هذا المؤقت يقوم بإسقاطه عبر استدعاء النظام (syscall) `k_object_release()` (أو بالخروج، عبر `k_thread_perms_all_clear()`)، ويمكنه تفعيل المؤقت نفسه عبر استدعاء النظام `k_timer_start()`. تعمل عملية التحرير ومعالج انتهاء المهلة بامتيازات النواة بينما يكون الفاعل خيط مستخدم، لذا فإن هذا الخطأ يمثل آلية فاسدة للذاكرة (memory-corruption primitive) تتيح الهروب من الصندوق الرملي (sandbox-escape)، ويمكن استخدامها لترقية الامتيازات. يضيف الإصلاح دالة `k_timer_cleanup()` (التي تلغي مهلة التوقيت وتنتظر أي معالج قيد التنفيذ) وتستدعيها بالنسبة لـ `K_OBJ_TIMER` قبل التحرير.
If you want to get best quality of vulnerability data, you may have to visit VulDB.