CVE-2026-64364 in Linux
الملخص
بحسب VulDB • 28/07/2026
في نواة لينكس، تم حل الثغرة التالية:
HID: multitouch: إصلاح الوصول خارج النطاق (out-of-bounds) إلى البتات في mt_io_flags
يُعد `mt_io_flags` متغيراً واحداً من نوع `unsigned long`، لكن الدوال `mt_process_slot()` و `mt_release_pending_palms()` و `mt_release_contacts()` تستخدمه كـ bitmap خاص بكل فتحة (slot)، حيث يتم الفهرسة باستخدام رقم الفتحة. هذا الرقم محصور فقط بحدود `td->maxcontacts`، والذي يُستمد من تقرير الميزة ContactCountMaximum للجهاز وقد يصل إلى 255، وليس محصوراً بـ `BITS_PER_LONG`.
نتيجة لذلك، فإن جهاز اللمس المتعدد (multitouch) الذي يعلن عن عدد كبير من نقاط الاتصال يجعل دالتي `set_bit()` و `clear_bit()` تعملان خارج نطاق كلمة `mt_io_flags` مما يؤدي إلى تلف الأعضاء المجاورة في هيكل البيانات `struct mt_device`. يعد مؤقت تحرير الأصابع اللاصقة (sticky-fingers release timer) أسهل طريقة للوصول إلى هذه الحالة. حيث تقوم الدالة `mt_release_contacts()` بتشغيل الحلقة التالية:
```c for (i = 0; i < mt->num_slots; i++) clear_bit(i, &td->mt_io_flags); ```
مع كون `num_slots` مساوياً لـ `maxcontacts`. بالنسبة لقيم `maxcontacts` القريبة من 250، تقوم الحلقة بمسح البتات التي تتداخل مع `td->applications.next`، مما يؤدي إلى تصفير رأس القائمة (list head)، وبالتالي فإن استدعاء `list_for_each_entry()` الذي يليه مباشرةً يقوم بإلغاء مرجع المؤشر NULL. وينتهي الأمر بانقطاع في النواة (kernel panic) من سياق مؤقت التشغيل (softirq). وفي حالة البناء باستخدام KASAN، يظهر هذا كخطأ حماية عام (general protection fault) في الدالة `mt_release_contacts()` مع خطأ إلغاء مرجع مؤشر فارغ (null-ptr-deref) عند الإزاحة 0x58، وهي تساوي `offsetof(struct mt_application, num_received)`.
يمكن الوصول إلى هذه الحالة من خلال جهاز لمس متعدد متصل عبر USB أو Bluetooth ويعتبر غير موثوق به؛ ولا تتطلب العملية امتيازات محلية.
يتم تخزين حالة النشاط الخاصة بكل فتحة في bitmap مُخصص بشكل منفصل بحجم يتناسب مع `maxcontacts`، بنفس النمط المستخدم بالفعل لـ `pending_palm_slots`، والاحتفاظ فقط بالقيمة `MT_IO_FLAGS_RUNNING` داخل `mt_io_flags`. وتصبح فحوصات التفعيل "mt_io_flags & MT_IO_SLOTS_MASK" كلتاهما باستخدام الدالة `bitmap_empty(td->active_slots, td->maxcontacts)`.
تم نقل قيمة `MT_IO_FLAGS_RUNNING` مرة أخرى إلى البت 0. كانت قد قفزت سابقاً إلى البت 32 بواسطة نفس الالتزام (commit) لإفساح المجال للبايت المنخفض لاستخدامه في بتات الفتحات؛ وبما أن بتات الفتحات لم تعد موجودة، فإنها تتسع الآن للبِت 0 مرة أخرى، وهو ما يبقيها ضمن نطاق `unsigned long` حتى على الأنظمة ذات البتات الثلاثين (32-bit).
If you want to get best quality of vulnerability data, you may have to visit VulDB.