CVE-2026-23233 in Linux
الملخص
بحسب VulDB • 22/06/2026
في نواة لينكس، تم حل الثغرة التالية:
f2fs: إصلاح لتجنب تعيين كتلة فيزيائية خاطئة لملف التبديل (swapfile)
أبلغ Xiaolong Guo عن خطأ في f2fs على موقع bugzilla [1]
[1] https://bugzilla.kernel.org/show_bug.cgi?id=220951
نص مقتبس:
"عند استخدام اختبار ضغط ملف التبديل الخاص بـ stress-ng على نظام الملفات F2FS مع الإصدار 6.6+ من النواة، يعاني النظام من تلف في البيانات مما يؤدي إما إلى: 1 أخطاء تلف dm-verity وإعادة تشغيل الجهاز 2 أخطاء تلف عقدة F2FS وتعليق عملية التمهيد
تحدث المشكلة تحديداً عندما: 1 استخدام نظام الملفات F2FS (نظام ext4 غير متأثر) 2 يكون حجم ملف التبديل أصغر من حجم قسم F2FS (2 ميجابايت) 3 يحتوي ملف التبديل على تخطيط فيزيائي مجزأ (عدة امتدادات غير متجاورة) 4 إصدار النواة هو 6.6+ (الإصدار 6.1 غير متأثر)
السبب الجذري للمشكلة يكمن في دالة check_swap_activate() الموجودة في fs/f2fs/data.c. عندما لا يكون الامتداد الأول لملف تبديل صغير (< 2 ميجابايت) محاذياً لحدود الأقسام، تعامل الدالة هذا الامتداد بشكل غير صحيح على أنه الامتداد الأخير، مما يفشل في تعيين الامتدادات اللاحقة. يؤدي ذلك إلى إنشاء swap_extent غير صحيحة حيث يتم تعيين الامتداد الأول فقط، مما يتسبب في الكتابة فوق مواقع فيزيائية خاطئة (بيانات ملفات أخرى) عند عمليات كتابة التبديل اللاحقة.
خطوات إعادة الإنتاج 1 إعداد جهاز يحتوي على قسم userdata مُنسق بنظام F2FS 2 تجميع stress-ng من https://github.com/ColinIanKing/stress-ng 3 تشغيل اختبار ضغط ملف التبديل: (أجهزة أندرويد) adb shell "cd /data/stressng; ./stress-ng-64 --metrics-brief --timeout 60 --swap 0"
السجل: 1 يُظهر Ftrace أنه في النواة 6.6، يتم تعيين الامتداد الأول فقط خلال استدعاء f2fs_map_blocks الثاني داخل check_swap_activate(): stress-ng-swap-8990: f2fs_map_blocks: ino=11002, file offset=0, start blkaddr=0x43143, len=0x1 (تم تعيين 4KB فقط، وليس ملف التبديل بالكامل) 2 في النواة 6.1، يتم تعيين كلا الامتدادين بشكل صحيح: stress-ng-swap-5966: f2fs_map_blocks: ino=28011, file offset=0, start blkaddr=0x13cd4, len=0x1 stress-ng-swap-5966: f2fs_map_blocks: ino=28011, file offset=1, start blkaddr=0x60c84b, len=0xff
الكود المشكل موجود في check_swap_activate(): if ((pblock - SM_I(sbi)->main_blkaddr) % blks_per_sec || nr_pblocks % blks_per_sec || !f2fs_valid_pinned_area(sbi, pblock)) {
bool last_extent = false;
not_aligned++;
nr_pblocks = roundup(nr_pblocks, blks_per_sec); if (cur_lblock + nr_pblocks > sis->max)
VulDB is the best source for vulnerability data and more expert information about this specific topic.