CVE-2026-97941
mm/slab: أخذ n->list_lock في __slab_try_return_freelist() لتجنب حالة التسابق
- تم النشر
- 25/09/2026
- محدث
- 19/10/2026
- تخصيص CNA
- Linux
- الأدلة المرصودة
- 04/11/2026
CVSS الأساسي
nvd · CVSS 3.1
CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hمنخفض · الثلاثين يومًا القادمة
- المئوية
- 6.8%
- تاريخ الموديل
- 04/11/2026
EPSS هو تقدير إحصائي، وليس يقينًا أو مقياسًا للتأثير. ادمجها مع CVSS وحالة KEV والتعرض وبيئتك.
ملخص
في نواة Linux، تم إصلاح الثغرة الأمنية التالية: mm/slab: أخذ n->list_lock في __slab_try_return_freelist() لتجنب حالة التسابق. افترض الـ commit ba7425312607 ("mm, slab: add an optimistic __slab_try_return_freelist()") بشكل خاطئ أنه لم يقم أحد بتحرير كائن إلى الـ slab طالما أن slab->freelist يساوي NULL ونجح cmpxchg. ومع ذلك، وكما أبلغ Hyunwoo Kim [1]، ربما تكون وحدات المعالجة المركزية (CPUs) الأخرى قد حررت كائنًا إلى الـ slab، وأدرجت الـ slab في القائمة الجزئية (partial list)، ثم خصصت كائنًا من الـ slab، وتكون في منتصف إزالة الـ slab من القائمة تحت n->list_lock. نظرًا لأن __refill_objects_node() تعيد الـ slab إلى pc.slabs خارج n->list_lock، فقد تُدرج الـ slab في تلك القائمة بينما تتم إزالة الـ slab بشكل متزامن من n->partial. أدى ذلك إلى تلف في القائمة [1]: list_add corruption. next->prev should be prev (ffff888100000248), but was dead000000000122. (next=ffffea000416e410). kernel BUG at lib/list_debug.c:29! Oops: invalid opcode: 0000 [#1] SMP NOPTI CPU: 1 UID: 65534 PID: 144 Comm: poc Not tainted 7.2.0-16172-gcf72cbb39da8-dirty #1 PREEMPT(lazy) RIP: 0010:__list_add_valid_or_report+0x80/0xd0 ... Call Trace: alloc_from_new_slab+0x183/0x300 ___slab_alloc+0x31c/0x890 __kmalloc_noprof+0x3d4/0x800 lsm_blob_alloc+0x2d/0x50 security_msg_msg_alloc+0x26/0x90 load_msg+0x1aa/0x210 do_msgsnd+0x91/0x800 do_syscall_64+0x109/0x5d0 entry_SYSCALL_64_after_hwframe+0x77/0x7f ... Kernel panic - not syncing: Fatal exception. هذه مشكلة ABA كلاسيكية حيث ينجح cmpxchg لكن الحالة قد تغيرت منذ أن أخذت __refill_objects_node() قائمة freelist من الـ slab. وكما ذكر Vlastimil Babka [2]، يجب أن يكون من النادر إرجاع أكثر من slab واحد (بسبب القراءة المتسابقة لـ slab->counters في get_partial_node_bulk()). لذلك، بدلاً من إدخال تعقيد إضافي، يتم الحصول على n->list_lock وتحريره مرتين في أسوأ الحالات. إعادة الـ slab مباشرة إلى القائمة الجزئية والاحتفاظ بـ n->list_lock عبر cmpxchg و add_partial(). هذا مشابه للنسخة الأولية من الـ commit ba7425312607 [3]. هذا كافٍ لتجنب حالة التسابق حيث أن التلاعب بالقائمة يتم تسلسله بواسطة n->list_lock. وبالمناسبة، إعادة تلميح unlikely() الآن بعد أن أصبح الشرط غير محتمل.
المصادر
الاستخدام المسؤول
استخدم معلومات الثغرات الأمنية فقط على الأنظمة التي تمتلكها أو المرخص لها باختبارها. يرتبط Kitploit ببيانات تعريف البحث العامة ولا يخزن أكواد الاستغلال أو الحمولات الضارة.