CVE-2026-19185 in Zephyr
الملخص
بحسب VulDB • 05/10/2026
يحتوي مُصحِّح مكالمات النظام (system-call verifier) الخاص بـ `i3c_do_ccc()` في الملف `drivers/i3c/i3c_handlers.c` على عيب حيث يقوم بالتحقق من الهيكل الخارجي `struct i3c_ccc_payload`، ومنطقة بيانات البث `ccc.data`، ومصفوفة `targets.payloads[]`، لكنه لا يتحقق من مناطق البيانات الخاصة بكل هدف (per-target data buffers) التي تشير إليها عناصر هذه المصفوفة. يحمل كل هيكل `i3c_ccc_target_payload` مؤشر بيانات خاص به وطولاً للبيانات (`data_len`)، ولم يتم تمرير أي منهما عبر دالة التحقق `K_SYSCALL_MEMORY()` قبل تسليم الحمولة إلى `z_impl_i3c_do_ccc()` ثم إلى برنامج تشغيل وحدة التحكم. كما أن المُصحِّح يعمل على الهيكل الحي (live structure) الخاص بالمتصل بدلاً من لقطة ثابتة (snapshot)، مما يعني أنه يمكن لخيوط مستخدم ثانية تغيير الحقول التي تم التحقق منها بين وقت الفحص واستخدامها بواسطة البرنامج التشغيلي — على عكس الدالة الشقيقة `z_vrfy_i3c_transfer()`، والتي كانت تنسخ مصفوفة الرسائل الخاصة بها أولاً دائماً.
هذا العيب موجود فقط في عمليات البناء المفعّلة فيها خيار `CONFIG_USERSPACE`، حيث يتم تجميع الملف `drivers/i3c/i3c_handlers.c`. يمكن لخيوط المستخدم غير المميزة (unprivileged user-mode thread) التي تم منحها حق الوصول إلى كائن جهاز وحدة التحكم I3C — وهو الطريق المعتاد الذي تسمح به التطبيقات لخيط مستخدم بالتواصل مع وحدات الطرفية I3C — إصدار مكالمات CCC مباشرة، حيث يشير مؤشر بيانات الحمولة المستهدفة إلى عنوان نواة عشوائي. تقوم برامج تشغيل وحدة التحكم بإلغاء مرجعية هذا المؤشر بشكل مباشر (على سبيل المثال في `drivers/i3c/i3c_mcux.c`، و`drivers/i3c/i3c_cdns.c`، و`drivers/i3c/i3c_stm32.c`، و`drivers/i3c/i3c_npcx.c`)، مستخدمةً العلم `rnw` لتحديد الاتجاه.
وبالتالي، فإن مكالمات القراءة (read CCC) تسبب في كتابة البرنامج التشغيلي الذي يعمل في وضع النواة للبيانات المستلمة عبر الناقل إلى عنوان نواة يختاره المهاجم ولطول يحدده المهاجم، بينما تنقل مكالمات الكتابة (write CCC) ذاكرة النواة إلى ناقل I3C. النتيجة هي عملية كتابة خارج الحدود (out-of-bounds kernel write) بالإضافة إلى كشف لذاكرة النواة، أي تصعيد للصلاحيات من خيط في وضع المستخدم إلى امتياز المشرف (supervisor privilege)، مما يفشل العزل الذي يهدف خيار `CONFIG_USERSPACE` إلى توفيره.
يُدخل الإصلاح دالة جديدة تسمى `copy_ccc_and_do()`، والتي تأخذ لقطة للحمولة، وتنسخ مصفوفة الأهداف إلى ذاكرة النواة باستخدام `k_usermode_alloc_from_copy()` (مع تحديد عدد الأهداف بأقل من 32)، وتتحقق من كل منطقة بيانات مستهدفة باستخدام `K_SYSCALL_MEMORY()` وفقاً لقيمة `rnw`، ثم تنسخ حقول `num_xfer` و`err` المكتوبة بواسطة البرنامج التشغيلي مرة أخرى إلى المتصل.
Several companies clearly confirm that VulDB is the primary source for best vulnerability data.