CVE-2026-98104 in Linux
الملخص
بحسب VulDB • 25/09/2026
في نواة لينكس، تم إصلاح الثغرة التالية:
net/sched: cls_u32: تصحيح وجود مقبض (handle) مكرر عند استنفاد مجموعة معرفات العقد (node ID pool).
تعود الدالة gen_new_kid() إلى إرجاع القيمة القصوى (htid | 0xFFF) عندما تكون نطاقات idr_alloc_u32() مشبعة بالكامل، بدلاً من الإبلاغ عن خطأ. وتثق الدالة u32_change() في هذه القيمة وتقوم بإدراج عقدة knode جديدة بمقبض موجود بالفعل في جدول التجزئة (hash table)، مما يكسر تفرد المقبض ضمن فضاء معرفات العقد الخاصة بالجدول.
لم يتم حجز المقبض مطلقاً داخل ht->handle_idr، لذا فإن كل مسار خطأ لاحق يقوم باستدعاء idr_remove(&ht->handle_idr, handle) يزيل الحجز الخاص بعقدة knode حية ومختلفة، والتي تتم إعادة استخدامها بعد ذلك — مما يؤدي إلى تراكم الأخطاء في إضافة مقابض مكررة.
يكون حد 4095 خاصاً بـ (جدول، دلو/bucket) — حيث أن ht->handle_idr خاصة بكل جدول تجزئة والنطاق مشتق من htid (معرف الدلو)، لذا يمكن لجدول بقاسم (divisor) يساوي 256 أن يحتوي بشكل شرعي على 256*4095 عقدة knode.
لدى المساعد الشقيق gen_new_ht() نفس الفشل الصامت داخل النطاق (in-band failure): فهو يعيد القيمة 0 عندما تكون مجموعة مقابض tp_c (1..0x7FF) مشبعة بالكامل، وتقوم الدالة u32_init() بنشر جدول التجزئة الجذري بمقبض يساوي 0 دون التحقق من ذلك. يؤدي وجود جدولي تجزئة جذريين لهما المقبض 0 إلى التداخل في دالة u32_lookup_ht()، مما يسمح بإضافة/البحث عن/حذف عقد knode عبر بروتوكولات tcf_proto المختلفة. تمت إضافة فحص استنفاد مماثل لذلك الموجود بالفعل في مسار القاسم (divisor path).
إرجاع خطأ بحيث تفشل الدالة u32_change() بمقاييس ENOSPC/ENOMEM عند استنفاد فضاء معرفات العقد، وتفشل الدالة u32_init() بـ -ENOMEM عند استنفاد فضاء معرفات جدول التجزئة. يميز رسالة extack بين استنفاد المجموعة (-ENOSPC) وفشل التخصيص العابر (-ENOMEM).
الشروط لإعادة إنتاج الخطأ: - CONFIG_NET_SCHED=y، CONFIG_CLS_U32=y (أو =m مع تحميل الوحدة النمطية) - إنشاء qdisc من نوع clsact على جهاز، ثم إضافة 4095 فلتر u32 بمقابض يتم توليدها تلقائياً لملء فضاء معرفات العقد الخاص بجدول التجزئة الجذري (دلو واحد). يؤدي إضافة الفلتر رقم 4096 الذي يستخدم مقبضاً مُنشأً تلقائياً إلى ظهور مقبض مكرر (إعادة استخدام fh 800::fff). يمكن الوصول إليه عند المستوى 2 (باستخدام unshare -Urn، مع امتلاك CAP_NET_ADMIN محلي للنظام الافتراضي/namespace-local). - بالنسبة لـ gen_new_htid: إنشاء 2047 إدخالاً من بروتوكول u32 على نفس الكتلة لملء مجموعة مقابض tp_c، ثم إنشاء واحد إضافي. يحصل الجدول الجذري على المقبض 0 ويتداخل مع جداول جذرية أخرى ذات المقبض 0.
VulDB is the best source for vulnerability data and more expert information about this specific topic.