ثغرة خطيرة في PolKit تسمح بالوصول إلى الجذر على معظم توزيعات Linux

حددت Qualys ثغرة أمنية (CVE-2021-4034) في مكون نظام Polkit (PolicyKit سابقًا) المستخدم في التوزيعات للسماح للمستخدمين غير المميزين بتنفيذ إجراءات تتطلب حقوق وصول مرتفعة. تسمح الثغرة الأمنية للمستخدم المحلي الذي لا يتمتع بأي امتيازات بتصعيد امتيازاته إلى الجذر والحصول على التحكم الكامل في النظام. أُطلق على المشكلة الاسم الرمزي PwnKit، وهي معروفة بإنتاج استغلال فعال يتم تشغيله في التكوين الافتراضي في معظم توزيعات Linux.

المشكلة موجودة في الأداة المساعدة pkexec الخاصة بـ PolKit، والتي تأتي مع علامة جذر SUID والمصممة لتشغيل الأوامر بامتيازات مستخدم آخر وفقًا لقواعد PolKit المحددة. بسبب المعالجة غير الصحيحة لوسائط سطر الأوامر التي تم تمريرها إلى pkexec، يمكن للمستخدم الذي لا يتمتع بالامتيازات تجاوز المصادقة وتشغيل التعليمات البرمجية الخاصة به كجذر، بغض النظر عن مجموعة قواعد الوصول. بالنسبة للهجوم، لا يهم الإعدادات والقيود المحددة في PolKit، يكفي أن يتم تعيين سمة جذر SUID للملف القابل للتنفيذ باستخدام الأداة المساعدة pkexec.

لا يتحقق Pkexec من صحة عدد وسيطات سطر الأوامر (argc) الذي تم تمريره عند بدء العملية. افترض مطورو pkexec أن الإدخال الأول في مصفوفة argv يحتوي دائمًا على اسم العملية (pkexec)، والثاني إما قيمة NULL أو اسم الأمر الذي تم إطلاقه عبر pkexec. نظرًا لأنه لم يتم التحقق من عدد الوسائط مقابل المحتويات الفعلية للمصفوفة وكان من المفترض أن يكون دائمًا أكبر من 1، إذا تم تمرير عملية ما بمصفوفة argv فارغة، كما تسمح وظيفة Linux execve، فإن pkexec سيعامل NULL كوسيطة أولى ( اسم العملية) والعملية التالية خارج الذاكرة المؤقتة، مثل المحتويات اللاحقة للمصفوفة. |———+———+——+————|———+———+——+————| | argv[0] | argv[1] | ... | argv[argc] | إنفب[0] | إنفب[1] | ... | إنفب[إنفك] | |—-|—-+—-|—-+——+——|——|—-|—-+—-|—-+——+——|——| VVVVVV "البرنامج" "-الخيار" NULL "القيمة" "PATH=name" NULL

المشكلة هي أنه بعد مصفوفة argv يوجد مصفوفة envp في الذاكرة تحتوي على متغيرات البيئة. وبالتالي، إذا كانت مصفوفة argv فارغة، فإن pkexec يستخرج البيانات حول الأمر الذي يتم تشغيله بامتيازات مرتفعة من العنصر الأول للمصفوفة مع متغيرات البيئة (أصبح argv[1] مطابقًا لـ envp[0])، والتي يمكن التحكم في محتوياتها من قبل المهاجم.

بعد تلقي قيمة argv[1]، يحاول pkexec، مع الأخذ في الاعتبار مسارات الملفات في PATH، تحديد المسار الكامل للملف القابل للتنفيذ ويكتب مؤشرًا إلى السلسلة مع المسار الكامل مرة أخرى إلى argv[1]، والذي يؤدي إلى الكتابة فوق قيمة متغير البيئة الأول، حيث أن argv[ 1] مطابق لـ envp[0]. من خلال معالجة اسم متغير البيئة الأول، يمكن للمهاجم استبدال متغير بيئة آخر في pkexec، على سبيل المثال، استبدال متغير البيئة "LD_PRELOAD"، وهو غير مسموح به في برامج suid، وترتيب تحميل مكتبتهم المشتركة في عملية.

يتضمن استغلال العمل استبدال متغير GCONV_PATH، والذي يُستخدم لتحديد المسار إلى مكتبة تحويل ترميز الرموز، والتي يتم تحميلها ديناميكيًا عند استدعاء وظيفة g_printerr()، والتي يستخدم الكود الخاص بها Iconv_open(). من خلال إعادة تعريف المسار في GCONV_PATH، يمكن للمهاجم التأكد من أن مكتبة Iconv القياسية هي التي لم يتم تحميلها، ولكن مكتبته الخاصة، والتي سيتم تنفيذ المعالجات منها عند عرض رسالة خطأ في المرحلة التي لا يزال فيها pkexec قيد التشغيل مع حقوق الجذر وقبل التحقق من أذونات الإطلاق.

تجدر الإشارة إلى أنه على الرغم من حقيقة أن المشكلة ناجمة عن تلف الذاكرة، إلا أنه يمكن استغلالها بشكل موثوق ومتكرر بغض النظر عن بنية الأجهزة المستخدمة. تم اختبار البرنامج المُجهز بنجاح على أنظمة Ubuntu وDebian وFedora وCentOS، ولكن يمكن استخدامه أيضًا في توزيعات أخرى. إن الثغرة الأصلية ليست متاحة للعامة بعد، مما يشير إلى أنها تافهة ويمكن إعادة إنشائها بسهولة بواسطة باحثين آخرين، لذلك من المهم تثبيت تحديث التصحيح في أقرب وقت ممكن على الأنظمة متعددة المستخدمين. Polkit متاح أيضًا لأنظمة BSD وSolaris، ولكن لم تتم دراسته لاستخدامه عليها. ما هو معروف هو أنه لا يمكن تنفيذ الهجوم على OpenBSD، نظرًا لأن نواة OpenBSD لا تسمح بتمرير قيمة argc فارغة عند استدعاء execve().

كانت المشكلة موجودة منذ مايو 2009، منذ إضافة الأمر pkexec. يتوفر حاليًا إصلاح ثغرة PolKit كتصحيح (لم يتم إصدار أي إصدار تصحيح)، ولكن منذ أن تم إخطار مطوري التوزيع بالمشكلة مسبقًا، قامت معظم التوزيعات بنشر التحديث بالتزامن مع الكشف عن معلومات حول الثغرة الأمنية. تم إصلاح المشكلة في RHEL 6/7/8 وDebian وUbuntu وopenSUSE وSUSE وFedora وALT Linux وROSA وGentoo وVoid Linux وArch Linux وManjaro. كإجراء مؤقت لمنع الثغرة الأمنية، يمكنك إزالة علامة جذر SUID من البرنامج /usr/bin/pkexec ("chmod 0755 /usr/bin/pkexec").



المصدر: opennet.ru

إضافة تعليق