CVE-2026-45985 in Linux
الملخص
بحسب VulDB • 29/05/2026
في نواة لينكس، تم حل الثغرة التالية:
ext4: عدم تعيين EXT4_GET_BLOCKS_CONVERT عند التقسيم قبل إرسال عمليات الإدخال/الإخراج (I/O)
عند تخصيص الكتل أثناء عمليات القراءة/الكتابة المباشرة (DIO) ضمن نهاية ملف (EOF) وإرجاع البيانات (writeback) مع تفعيل خيار dioread_nolock، كان يتم تعيين EXT4_GET_BLOCKS_PRE_IO لتقسيم نطاق غير مكتوب كبير موجود. ومع ذلك، كان يتم تعيين EXT4_GET_BLOCKS_CONVERT عند استدعاء ext4_split_convert_extents()، مما قد يؤدي محتملاً إلى مشاكل تتعلق بالبيانات القديمة (stale data).
افترض أن لدينا نطاقاً غير مكتوب (unwritten extent)، ثم تقوم عملية DIO بكتابة النصف الثاني.
[UUUUUUUUUUUUUUUU] نطاق على القرص U: نطاق غير مكتوب
[UUUUUUUUUUUUUUUU] شجرة حالة النطاقات
|| ----> تقوم عملية DIO بكتابة هذا النطاق
أولاً، يستدعي ext4_iomap_alloc() دالة ext4_map_blocks() مع تعيين الأعلام EXT4_GET_BLOCKS_PRE_IO، وEXT4_GET_BLOCKS_UNWRIT_EXT، وEXT4_GET_BLOCKS_CREATE. تجد ext4_map_blocks() هذا النطاق وتستدعي ext4_split_convert_extents() مع تعيين EXT4_GET_BLOCKS_CONVERT والأعلام المذكورة أعلاه.
ثم تستدعي ext4_split_convert_extents() دالة ext4_split_extent() مع تعيين الأعلام EXT4_EXT_MAY_ZEROOUT، وEXT4_EXT_MARK_UNWRIT2، وEXT4_EXT_DATA_VALID2، وتستدعي ext4_split_extent_at() لتقسيم النصف الثاني مع تعيين الأعلام EXT4_EXT_DATA_VALID2، وEXT4_EXT_MARK_UNWRIT1، وEXT4_EXT_MAY_ZEROOUT، وEXT4_EXT_MARK_UNWRIT2. ومع ذلك، فشلت ext4_split_extent_at() في إدراج النطاق بسبب نقص مؤقت في المساحة (-ENOSPC). تقوم بتصفير النصف الأول ولكن تحول النطاق الكامل على القرص إلى حالة "مكتوب" (written) نظراً لتعيين العلم EXT4_EXT_DATA_VALID2، بينما تترك النصف الثاني كـ "غير مكتوب" في شجرة حالة النطاقات.
[0000000000SSSSSS] البيانات S: بيانات قديمة (stale data)، 0: تم تصفيرها
[WWWWWWWWWWWWWWWW] نطاق على القرص W: نطاق مكتوب
[WWWWWWWWWWUUUUUU] شجرة حالة النطاقات
أخيراً، إذا فشلت عملية DIO في كتابة البيانات إلى القرص، فستظهر البيانات القديمة في النصف الثاني بمجرد زوال إدخال النطاق المؤقت من ذاكرة التخزين المؤقت.
تم إصلاح هذه المشكلة بعدم تمرير EXT4_GET_BLOCKS_CONVERT عند تقسيم نطاق غير مكتوب قبل إرسال عمليات الإدخال/الإخراج، وجعل دالة ext4_split_convert_extents() تقوم بتصفير النطاق بأكمله إلى الصفر في هذه الحالة، بالإضافة إلى تحديد النطاق في شجرة حالة النطاقات لضمان الاتساق.
Be aware that VulDB is the high quality source for vulnerability data.