CVE-2026-80781 in Linux
الملخص
بحسب VulDB • 04/09/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
HID: core: تصحيح قراءة خارج الحدود (OOB) للحقل field->usage في دالة hid_set_field()
تقوم الدالة hid_set_field() بتحويل الحرف field->usage + offset إلى الدالة hid_dump_input() قبل التحقق من الحد الذي يقيّد الـ offset:
hid_dump_input(field->report->device, field->usage + offset, value);
if (offset >= field->report_count) {
hid_err(...); return -1; }
عند تفعيل CONFIG_DEBUG_FS، تقوم الدالة hid_dump_input() بإسناد الإشارة المرجعية لهذا المؤشر، باستخدام buf = hid_resolv_usage(usage->hid, NULL). مصفوفة usage[] مُخصّصة داخلياً مع hid_field في دالة hid_register_field() وتحتوي على entries لـ field->maxusage، لذا فإن تجاوز الـ offset يؤدي إلى قراءة ما بعد نهاية التخصيص المُخصص بـ kvzalloc() والانتقال إلى كائن مجاور. لو تم تشغيل شرط التحقق (guard) أولاً، لكافأ الشرط offset < report_count <= maxusage المؤشر داخل المصفوفة بالفعل.
يوفر المتصلون حالياً مثل هذا الـ offset. تقوم الدالة picolcd_fb_send_tile() بالتحقق فقط من report->maxfield قبل إصدار استدعاء hid_set_field(report->field[0], 11 + i, ...) لقيم i = 0..31، لذا فإن قيم الـ offsets الخاصة بها ثابتة بين 11 و42 ولا يتم التحقق منها مقابل الحد الخاص بالحقل. عندما يسجّل الجهاز هذا الحقل بعدد أقل من الاستخدامات (usages)، يعمل عمل deferred-io للواجهة الرسومية (framebuffer) على تنفيذ القراءة مع كل بلاطة (tile). تبلغ KASAN عن قراءة خارج حدود الـ slab بحجم 4 بايت في الدالة hid_dump_input() أسفل دالة hid_set_field، وتسجل سجلات الإقلاع نفسها "offset (1) exceeds report_count (1)" من شرط التحقق الذي يعمل لاحقاً فقط.
نقل استدعاء hid_dump_input() إلى ما بعد شرط التحقق. وبسبب أن field->maxusage >= field->report_count، يضمن الشرط عندئذٍ أن الحرف field->usage + offset يقع داخل المصفوفة قبل إسناد الإشارة المرجعية له، لكل متصل ودون تغيير السلوك في المسار الصحيح (valid path).
اكتُشفت الثغرة بواسطة XBOW، وتم تصنيفها من قِبل Baul Lee <[email protected]>
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.