مؤخرا تم الكشف عن معلومات الثغرة الأمنية (CVE-2022-29582) في تنفيذ واجهة الإدخال / الإخراج غير المتزامنة io_uring ، المضمنة في Linux kernel منذ الإصدار 5.1 ، والتي تسمح للمستخدم غير المتميز بأن يصبح جذرًا على النظام ، حتى عند تنفيذ استغلال الحاوية.
ومن الجدير بالذكر أن قال أنه تم الإبلاغ عن الضعف قبل ما يزيد قليلاً عن 3 أشهر (في أوائل شهر مايو من هذا العام تقريبًا) ، ولكن لم يتم الإفصاح عن المعلومات الكاملة والإفصاح إلا مؤخرًا.
فيما يتعلق بالضعف ، يذكر أن هذا يحدث عند الوصول إلى كتلة من الذاكرة تم تحريرها بالفعل، تتجلى في نواة Linux بدءًا من الفرع 5.10.
حول الثغرة الأمنية CVE-2022-29582
هذا الضعف يسمح بالوصول إلى الذاكرة المحررة كنتيجة لظروف السباق عند التعامل مع المهلات في وظيفة io_flush_timeouts () ، والتييزيل e إدخال المهلة من القائمة ويلغيها ، دون التحقق من إنشاء وحذف المهلة في تلك المرحلة.
تم بالفعل تقديم وصف عام محدث لـ io_uring بواسطة الآخرين. إنهم يشرحون ذلك أفضل ألف مرة مما نفعله ، لذلك سنقوم فقط بتغطية النظام الفرعي على نطاق أوسع (انظر مقالة Grapl Security هذه ومقال Flatt Security هذا للحصول على مقدمة رائعة).
ما هو أكثر أهمية، يحدد حقل كود التشغيل نوع العملية المطلوب تنفيذها. لكل "كود تشغيل" يتطلب ذلك ، يحدد الحقل fd واصف الملف الذي سيتم تنفيذ الإدخال / الإخراج المطلوب عليه. تحتوي جميع مكالمات نظام الإدخال / الإخراج العادية تقريبًا (قراءة ، إرسال إلى ، إلخ) على رمز تشغيل غير متزامن مكافئ. يمكن لكل مجال أن يأخذ أدوارًا مختلفة اعتمادًا على العملية.
بمجرد استردادها من SQ ، يتم تحويل SQE إلى تمثيل داخلي موصوف بواسطة Struct io_kiocb (إعادة استدعاء إدخال / إخراج kernel). تُعرف هذه الكائنات عمومًا باسم الطلبات.
يتم استخدام Struct io_kiocb كمكافئ لـ SQE "جاهز للتشغيل" الذي يعتمد عليه ، حيث يتم حل أي واصف ملف إلى بنية ملف * s ، يتم إرفاق بيانات اعتماد المستخدم ، ويتم إرفاق الشخصية (التي سيتم تشغيل النوى فيها) ، إلخ.
بعد اكتمال العملية المطلوبة ، تتم كتابتها في قائمة انتظار الإكمال (CQ) إدخال يتوافق مع SQE. يسمى هذا الإدخال بإدخال قائمة انتظار الإكمال (CQE) ويحتوي على حقول مثل رمز الخطأ وقيمة النتيجة. يمكن لتطبيق مساحة المستخدم استقصاء CQ للإدخالات الجديدة لتحديد ما إذا كانت SQEs المرسلة قد انتهت من المعالجة وما كانت نتيجتها.
يذكر أن هناك بعض السيناريوهات التي يسهل فيها استبدال كائن على التقدم. لكن هناك نوعان من القيود:
- يجب تعيين LT وتهيئته في نافذة السباق. أي بعد تحرير LT ولكن قبل الوصول إلى نقطة في LT لم يعد الوصول إليها ممكنًا.
- يمكن أن يكون LT 'كائنًا آخر من هياكل io_kiocb. نظرًا لعزل الكومة ، حيث يتم فصل الكائنات الموجودة في الكومة وفقًا لنوعها ، فمن الصعب جدًا إعادة تعيينها كنوع مختلف من الكائنات داخل نافذة السباق.
أعد الباحثون استغلالا وظيفيا التي لا تتطلب تضمين مساحات أسماء معرف المستخدم (مساحات أسماء المستخدمين) لتشغيلها ويمكن أن توفر وصول الجذر إلى المضيف عندما يقوم مستخدم غير متمتع ببدء الاستغلال في حاوية معزولة.
يستهدف استغلالنا إصدار kernel 5.10.90 ، وكان الإصدار Google يعمل عن بُعد في ذلك الوقت. كان علينا تعديل استغلالنا وفقًا للمواصفات المحددة للخادم (4 Skylake Xeon cores @ 2.80Ghz ، 16GiB RAM) ، ولكن مع بعض التغيير والتبديل ، يجب أن تكون أي آلة تشغل نواة ضعيفة قابلة للاستغلال.
الثغرة تعمل أيضًا في بيئة نجيل معزولة عن توزيع Google COS (Container Optimized OS) استنادًا إلى نظام التشغيل Chromium OS واستخدامه في Google Cloud Platform على الأجهزة الافتراضية Compute Engine. تم تصميم الاستغلال للعمل مع فروع kernel من 5.10 إلى 5.12. أخيرًا ، الجدير بالذكر أن تم إصلاح المشكلة في أبريل في التحديثات 5.10.111 و 5.15.34 و 5.17.3.
أخيرًا ، إذا كنت مهتمًا بمعرفة المزيد عن الثغرة الأمنية ، يمكنك الرجوع إلى المنشور المنشور في الرابط التالي.