تم تأخير إصدار Linux 6.13 بسبب مشكلات ناجمة عن التصحيح الذي أرسلته Microsoft

لينكس

إطلاق نسخة النواة الجديدة لقد تم تأجيل Linux 6.13 بسبب مشاكل الاستقرار ولدت بسبب التغيير الذي أدخله أحد موظفي Microsoft. يذكر أن هذا التغيير تم قبوله في الفرع الرئيسي في نوفمبر الماضي بشكل فاجأ الكثيرين، حيث أنه لم يتبع الممارسات المعتادة.

تم إرسال التصحيح بطريقة غير قياسية وتمت الموافقة عليه دون تلقي إقرارات (ACK) من قبل أحد أقران المشرفين على بنية x86، مما يشكل انتهاكًا للمعايير المقبولة في تطوير kernel.

تم تقديم التصحيح المعني دعم لاستخدام صفحات الذاكرة الكبيرة في وضع ROX (للقراءة فقط والقابل للتنفيذ) عند تخصيص الذاكرة المخصصة للتعليمات البرمجية القابلة للتنفيذ وكان الغرض من التصحيح المرسل تعزيز أمان النظام من خلال جعل استغلال نقاط الضعف أكثر صعوبة عن طريق تنفيذ تعليمات برمجية ضارة في الذاكرة التي تم وضع علامة عليها للقراءة فقط.

يؤدي استخدام الصفحات الكبيرة لتعيين مناطق النص إلى تقليل ضغط iTLB وتحسين الأداء.

قم بتوسيع excmem_alloc() مع القدرة على استخدام الصفحات الكبيرة بأذونات ROX كذاكرة تخزين مؤقت للتخصيصات الأصغر. لملء ذاكرة التخزين المؤقت، يتم تخصيص صفحة كبيرة قابلة للكتابة من vmalloc باستخدام VM_ALLOW_HUGE_VMAP، مملوءة بتعليمات غير صالحة، ثم يتم إعادة تعيينها كـ ROX.

يتم استبعاد الاسم المستعار للخريطة المباشرة لتلك الصفحة الكبيرة من الخريطة المباشرة. يتم منح أجزاء من هذه الصفحة الكبيرة للمتصلين بـ excmem_alloc() دون أي تغيير في الأذونات. عندما يتم تحرير الذاكرة باستخدام excmem_free()، يتم إبطالها مرة أخرى بحيث لا تحتوي على تعليمات قديمة. 

ويذكر أن التأخير في إصدار النواة 6.13 هذا بسبب باستخدام ذاكرة تخزين مؤقت كبيرة لصفحة الذاكرة القابلة للتنفيذ في الوضع تم تمكين ROX افتراضيًا للوحدات النمطية الموجودة على أنظمة x86_64. تناول التغيير مشكلة فنية كبيرة: تخصيص الصفحات في وضع ROX للتعليمات البرمجية القابلة للتنفيذ والتي لم يتم إعدادها بالكامل بعد.

أدى هذا إلى تجنب الحاجة إلى إعادة تعيين الصفحات مؤقتًا من وضع ROX إلى وضع الكتابة حتى تصبح وحدات kernel جاهزة للتشغيل. ومع ذلك، على الرغم من الفوائد المتوقعة، فإن مشاكل الاستقرار التي تم تحديدها تثير التساؤلات حول جودة التصحيح وأمانه، مما يؤدي إلى الحاجة إلى تمديد الاختبار قبل الإصدار النهائي.

ويبدو أن المطورين لم يكونوا مخطئين، لأنه خلال مرحلة الاختبار النهائي لنواة Linux 6.13، قام أحد مهندسي Intel تم اكتشاف مشكلة حرجة أن أثرت على تشغيل النظام على بعض أجهزة الكمبيوتر المحمولة مع معالجات تعتمد على معمارية Alderlake الدقيقة. تجلت المشكلة عند محاولة إخراج النواة من وضع السكون، وهو فشل ذو صلة بشكل خاص بالأجهزة المحمولة.

x86: تعطيل دعم EXECMEM_ROX

تسببت الوحدة Module_writable_address() في حدوث فوضى كبيرة.
Alternative.c، ناهيك عن أنه لا يزال يحتوي على أخطاء، بعضها جدير بالملاحظة.
متغيرات CFI تفشل وتفشل.

كان مايك يعمل على تصحيحات لتنظيف هذا الأمر مرة أخرى، ولكن نظرًا للوضع الحالي، فإن هذا ببساطة ليس جاهزًا.

قم بالتعطيل الآن، فلنحاول مرة أخرى في الدورة التالية.

نشأت المشكلة عند تجميع النواة مع المترجم Clang وتمكين وضع الحماية CFI (التحكم في سلامة التدفق). تم تصميم هذا الوضع لتعزيز الأمان عن طريق منع عمليات المعالجة غير الصحيحة لتدفق التحكم، مثل تلك التي تحدث في الهجمات التي تغير مؤشرات الوظائف في الذاكرة. ومع ذلك، فقد ثبت أن التفاعل بين CFI والتحسينات الجديدة التي تم إدخالها في النواة للتعامل مع صفحات ذاكرة ROX (للقراءة فقط والقابلة للتنفيذ) يمثل مشكلة.

الآلية EXECMEM_ROX، والذي يسمح باستخدام ذاكرة التخزين المؤقت لصفحات الذاكرة القابلة للتنفيذ التي تم وضع علامة عليها للقراءة فقط، يبدو أنه السبب الجذري للفشل الذي لوحظ عند إعادة تنشيط النظام. كحل مؤقت، اقترح مشرفو Intel وAMD المسؤولون عن بنية x86 تعطيل EXECMEM_ROX في إصدار kernel 6.13. سيسمح هذا بتحرير النواة أثناء العمل على تصحيح نهائي يعمل على حل المشكلة دون المساس بالاستقرار أو الأمان.