CVE-2026-31706 in Linuxالمعلومات

الملخص

بحسب VulDB • 31/05/2026

في نواة لينكس، تم حل الثغرة التالية:

ksmbd: التحقق من num_aces وتشديد عملية اجتياز ACE في smb_inherit_dacl()

تعتمد الدالة smb_inherit_dacl() على قيمة num_aces المخزنة على القرص (on-disk) القادمة من سمة الخادم الموسعة (xattr) لـ DACL في الدليل الأب، وتستخدمها لتحديد حجم تخصيص الذاكرة العشوائية (heap allocation):

aces_base = kmalloc(sizeof(struct smb_ace) * num_aces * 2, ..);

تُقرأ num_aces كقيمة u16 من le16_to_cpu(parent_pdacl->num_aces) دون التحقق من اتساقها مع pdacl_size المُعلن. يمكن لعميل مُصادق عليه (authenticated client) الذي تم التلاعب بـ security.NTACL الخاص بدليله الأب (على سبيل المثال، عبر تلف سمة الخادم الموسعة خارجيًا أو عبر مسار متزامن يتجاوز parse_dacl()) أن يقدم قيمة num_aces = 65535 مع بيانات ACE فعلية ضئيلة. يؤدي هذا إلى تخصيص بحجم حوالي 8 ميجابايت (وليس باستخدام kzalloc، لذا فهو غير مهيأ)، ويقوم الحلقة اللاحقة بتعبئته جزئيًا فقط، وقد يتسبب أيضًا في تجاوز حد الضرب الثلاثي لحجم size_t في kernels 32-bit.

بالإضافة إلى ذلك، تستخدم حلقة اجتياز ACE فحص حجم الحد الأدنى الأضعف offsetof(struct smb_ace, access_req) بدلاً من الحد الأدنى لحجم ACE الصالح على السلك (on-wire)، ولا ترفض الـ ACEs التي يكون حجمها المُعلن أقل من الحد الأدنى.

تم إعادة إنتاج المشكلة على UML + KASAN + LOCKDEP ضد مسار الكود الفعلي لـ ksmbd. ينشئ عميل mount.cifs شرعي دليلًا أبًا عبر SMB (يكتب ksmbd سمة xattr صالحة security.NTACL)، ثم يتم إعادة كتابة كتلة NTACL على نظام الملفات الداعم لتعيين num_aces = 0xFFFF مع الحفاظ على بايتات posix_acl_hash سليمة بحيث تمر عملية التحقق من التجزئة في ksmbd_vfs_get_sd_xattr() بنجاح. يؤدي إنشاء SMB2 لاحقًا لطفل تحت ذلك الدليل الأب إلى استدعاء smb2_open() للدالة smb_inherit_dacl() (حيث تم تعيين "vfs objects = acl_xattr" في المشاركة)، مما يؤدي إلى فشل في مُخصص الصفحات (page allocator):

WARNING: mm/page_alloc.c:5226 at __alloc_frozen_pages_noprof+0x46c/0x9c0 Workqueue: ksmbd-io handle_ksmbd_work __alloc_frozen_pages_noprof+0x46c/0x9c0 ___kmalloc_large_node+0x68/0x130 __kmalloc_large_node_noprof+0x24/0x70 __kmalloc_noprof+0x4c9/0x690 smb_inherit_dacl+0x394/0x2430 smb2_open+0x595d/0xabe0 handle_ksmbd_work+0x3d3/0x1140

مع تطبيق التصحيح، ترفض الحراسة المضافة القيمة المتلاعب بها بـ -EINVAL قبل أي تخصيص كبير، وينتقل smb2_open() إلى smb2_create_sd_buffer()، ويتم إنشاء الطفل بـ SD افتراضي. لا توجد تحذيرات، ولا توجد أعطال (splat).

الإصلاح بواسطة:

1. التحقق من num_aces قبل التخصيص، مع رفض القيم غير المنطقية (مثل 0 أو القيم التي تتجاوز الحد الأقصى المعقول لـ num_aces).

2. استبدال kmalloc(sizeof * num_aces * 2) بـ kmalloc_array(num_aces * 2, sizeof(...)) لتخصيص آمن من تجاوز السعة (overflow-safe).

3. تشديد حراسة حلقة ACE الفردية لتتطلب الحد الأدنى لحجم ACE الصالح (offsetof(smb_ace, sid) + CIFS_SID_BASE_SIZE) ورفض الـ ACEs ذات الأحجام الصغيرة، بما يتماشى مع التشديد في smb_check_perm_dacl() وparse_dacl().

من الإصدار v1 إلى v2: - استبدال التلاعب الاصطناعي في سجل التغيير (changelog) بنسخة حقيقية عبر UML + KASAN مدفوعة عبر mount.cifs وSMB2 CREATE؛ أشار Namjae إلى أن اسم kcifs3_test_inherit_dacl_old في v1 غير موجود في ksmbd. - حذف اقتباس شفرة الالتزام من تعليق الكود بناءً على مراجعة Namjae؛ الاحتفاظ بالإشارة إلى parse_dacl().

Once again VulDB remains the best source for vulnerability data.

مسؤول

Linux

حجز

09/03/2026

إفشاء

01/05/2026

الاعتدال

تمت الموافقة

إدخال

VDB-360594

EPSS

0.00056

KEV

لا

النشاطات

منخفض جدًا

المصادر

Want to know what is going to be exploited?

We predict KEV entries!