ثغرة أمنية في Linux kernel يمكنها العبث بملفات القراءة فقط

تم التعرف على ثغرة أمنية في Linux kernel (CVE-2022-0847) تسمح بالكتابة فوق محتويات ذاكرة التخزين المؤقت للصفحة لأي ملفات، بما في ذلك تلك الموجودة في وضع القراءة فقط، أو المفتوحة بعلامة O_RDONLY، أو الموجودة على أنظمة الملفات. شنت في وضع القراءة فقط. ومن الناحية العملية، يمكن استخدام الثغرة الأمنية لإدراج تعليمات برمجية في عمليات عشوائية أو تلف البيانات في الملفات المفتوحة. على سبيل المثال، يمكنك تغيير محتويات ملف Author_keys لعملية sshd. النموذج الأولي للاستغلال متاح للاختبار.

تمت تسمية المشكلة باسم Dirty Pipe، على غرار الثغرة الأمنية الخطيرة Dirty COW التي تم تحديدها في عام 2016. تجدر الإشارة إلى أنه من حيث مستوى الخطر، فإن Dirty Pipe على نفس مستوى Dirty COW، ولكن تشغيلها أسهل بكثير. تم التعرف على الثغرة أثناء تحليل الشكاوى المتعلقة بالفساد الدوري للملفات التي تم تنزيلها عبر الشبكة في نظام يقوم بتنزيل الأرشيفات المضغوطة من خادم السجل (37 حالة تلف في 3 أشهر على نظام محمل)، والتي تم استخدام عملية splice() في إعدادها والأنابيب غير المسماة.

وتظهر الثغرة بدءًا من إصدار Linux kernel 5.8 الذي تم إصداره في أغسطس 2020، أي. موجود في Debian 11، لكنه لا يؤثر على النواة الأساسية في Ubuntu 20.04 LTS. تعتمد نواة RHEL 8.x وopenSUSE/SUSE 15 في البداية على الفروع القديمة، ولكن من الممكن أن يكون التغيير الذي تسبب في المشكلة قد تم نقله إليها (لا توجد بيانات دقيقة حتى الآن). يمكنك متابعة نشر تحديثات الحزمة في التوزيعات على هذه الصفحات: Debian، SUSE، Ubuntu، RHEL، Fedora، Gentoo، Arch Linux. تم اقتراح إصلاح الثغرة الأمنية في الإصدارات 5.16.11 و5.15.25 و5.10.102. تم تضمين الإصلاح أيضًا في النواة المستخدمة في نظام Android الأساسي.

سبب الثغرة الأمنية هو عدم تهيئة قيمة "buf->flags" في كود الوظيفتين Copy_page_to_iter_pipe() وpush_pipe()، على الرغم من عدم مسح الذاكرة عند تخصيص البنية وأثناء عمليات معالجة معينة باستخدام أنابيب غير مسماة، قيمة من عملية أخرى. باستخدام هذه الميزة، يمكن لمستخدم محلي لا يتمتع بالامتياز تحقيق مظهر قيمة PIPE_BUF_FLAG_CAN_MERGE في العلامة، مما يسمح لك بتنظيم الكتابة فوق البيانات في ذاكرة التخزين المؤقت للصفحة عن طريق كتابة بيانات جديدة ببساطة إلى أنبوب غير مسمى تم إعداده خصيصًا.

بالنسبة للهجوم، يجب أن يكون الملف الهدف قابلاً للقراءة، وبما أنه لا يتم التحقق من حقوق الوصول عند الكتابة إلى توجيه الإخراج، فيمكن أيضًا إجراء استبدال في ذاكرة التخزين المؤقت للصفحة للملفات الموجودة في الأقسام المثبتة للقراءة فقط (على سبيل المثال، للملفات c CD- ذاكرة للقراءة فقط). بعد استبدال المعلومات الموجودة في ذاكرة التخزين المؤقت للصفحة، عند قراءة البيانات من ملف، لن تتلقى العملية البيانات الفعلية، ولكن البيانات المستبدلة.

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

المصدر: opennet.ru

إضافة تعليق