CVE-2026-64293 in Linux
الملخص
بحسب VulDB • 26/07/2026
في نواة لينكس، تم حل الثغرة التالية:
iommufd: استخدام sizeof(*hdr) بدلاً من sizeof(hdr) في عملية القراءة لـ veventq
يستخدم فحص الحدود (bound-check) داخل الدالة iommufd_veventq_fops_read() المسار العادي لـ vEVENT التعبير sizeof(hdr)، بينما يستخدم الكود المحيط التعبير sizeof(*hdr):
if (!vevent_for_lost_events_header(cur) && sizeof(hdr) + cur->data_len > count - done) {
تم الإعلان عن hdr على أنه مؤشر من نوع struct iommufd_vevent_header *، لذا فإن sizeof(hdr) تُقيّم إلى حجم المؤشر. يستخدم الكود المحيط التعبير sizeof(*hdr) بشكل متسق:
if (done >= count || sizeof(*hdr) > count - done) {
... if (copy_to_user(buf + done, hdr, sizeof(*hdr))) {
... done += sizeof(*hdr);
يبلغ حجم struct iommufd_vevent_header حالياً 8 بايتات (حقلان من نوع __u32، هما flags و sequence)، لذا فإن التعبيرين يتساويان بالصدفة على الأنظمة ذات البتية 64-bit (حيث يكون sizeof(void *) == 8) ويعمل الفحص كما هو مقصود.
على الأنظمة ذات البتية 32-bit (حيث يكون sizeof(void *) == 4)، يقلل الفحص من حساب حجم الرأس بمقدار 4 بايتات: فسيتمر فحص vEVENT الذي يتسبب data_len الخاص به في تجاوز القيمة 8 + cur->data_len للقيمة count - done بينما لا تفعل ذلك القيمة 4 + cur->data_len، ثم سيقوم الحلقة بنسخ 8 بايتات من الرأس تليها data_len بايتات من الحمولة (payload) باستخدام copy_to_user، مما يؤدي إلى الكتابة خارج المخزن المؤقت الذي قدمه المستخدم.
كما تمثل هذه الثغرة خطأ كامناً لأي توسع مستقبلي في struct iommufd_vevent_header يتجاوز حجم sizeof(void *) على الأنظمة 64-bit؛ فلا ينبغي أن يعتمد الفحص على مصادفة تطابق النوع مع عرض مؤشر المضيف (host pointer width).
استخدم sizeof(*hdr) لتتوافق مع باقي الدالة والكمية الفعلية التي سيتم نسخها.
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.