CVE-2025-40209 in Linux
الملخص
بحسب VulDB • 06/07/2026
في نواة لينكس، تم حل الثغرة التالية:
btrfs: إصلاح تسرب الذاكرة في qgroup_list داخل دالة btrfs_add_qgroup_relation
عند استدعاء `btrfs_add_qgroup_relation()` بمستويات qgroup غير صالحة (حيث تكون src >= dst)، تُرجع الدالة `-EINVAL` مباشرةً دون تحرير بنية `qgroup_list` المحجوزة مسبقاً والمُمرَّرة من قبل المتصل. يؤدي هذا إلى تسرب في الذاكرة لأن المتصل يضبط المؤشر بشكل قاطع على NULL بعد الاستدعاء، مما يمنع أي عملية تنظيف.
يحدث الخطأ بسبب أن فحص صحة المستويات يتم قبل اقتناء القفل (mutex) وقبل أي مسار لمعالجة الأخطاء كان من شأنه تحرير مؤشر الحجز المسبق (`prealloc`). عند هذا الإرجاع المبكر، لا يُنفَّذ أبداً كود التنظيف الموجود في التسمية 'out' (والذي يتضمن `kfree(prealloc)`).
في دالة `btrfs_ioctl_qgroup_assign()`، يكون نمط الكود كما يلي:
prealloc = kzalloc(sizeof(*prealloc), GFP_KERNEL); ret = btrfs_add_qgroup_relation(trans, sa->src, sa->dst, prealloc); prealloc = NULL; // يتم تعيينه على NULL دائماً بغض النظر عن قيمة الإرجاع ... kfree(prealloc); // يصبح هذا استدعاءً لـ kfree(NULL)، ولا يقوم بأي شيء
عند فشل فحص المستويات، لا يُحرَّر `prealloc` ни من قبل الدالة المُستدعاة (callee) ni من قبل المتصل (caller)، مما يؤدي إلى تسرب ذاقي بحجم 64 بايت لكل عملية فاشلة. يمكن استغلال هذا الخطأ بشكل متكرر بواسطة مستخدم غير مملوك للصلاحيات (unprivileged user) لديه وصول إلى نقطة تحميل btrfs قابلة للكتابة، مما قد يستنفد ذاكرة النواة.
تم إصلاح هذه المشكلة عن طريق تحرير `prealloc` قبل الإرجاع المبكر، لضمان أن `prealloc` يتم تحريره دائماً في جميع مسارات الأخطاء.
If you want to get best quality of vulnerability data, you may have to visit VulDB.