
لقد قمت بتحليل الثغرة الأمنية المعروفة شائعًا باسم Pwnkit لأغراض تعليمية وكتبت لها PoC. يُستخدم حصريًا لأغراض تعليمية
إخلاء المسؤولية: هذه المادة مقدمة لأغراض تعليمية حصراً. استخدام الاستغلال (exploit) دون موافقة كتابية من مالك النظام المستهدف غير أخلاقي وقد يعرض صاحبه للمساءلة القانونية.
chmod +x build.sh../build.sh../mls_envp. ستحصل على صلاحيات root.في النسخة المصابة من polkit (0.105)، افترض المؤلف ديفيد زويتن أن pkexec سيُستدعى دائماً من الطرفية (console). وقد انطلق من أن argc (عدد الوسائط) أكبر من 1 دائماً، لأن argv[0] هو اسم البرنامج نفسه. غير أن pkexec يمكن استدعاؤه عبر استدعاء النظام execve بتمرير مصفوفة وسائط فارغة. ونتيجة لذلك تتعطل منطقية البرنامج.
في شيفرة pkexec يوجد افتراض ثابت بأن argv يحتوي على عنصر واحد على الأقل. وعندما يكون argc مساوياً لـ 0، يحاول البرنامج رغم ذلك الوصول إلى argv[1]. ويؤدي هذا إلى تجاوز حدود مصفوفة argv وقراءة العنصر الأول من مصفوفة envp (متغيرات البيئة). وفي حالتنا هذه توجد هناك السلسلة "exp_exe".
يحاول pkexec العثور على البرنامج exp_exe باستخدام الدالة g_find_program_in_path. وتستخدم هذه الدالة المتغير PATH للبحث. ونحن نستبدل PATH بالقيمة GCONV_PATH=.. ونتيجة لذلك يعثر pkexec على الملف الوهمي exp_exe في مجلدنا المحلي ويعيد المسار GCONV_PATH=./exp_exe. وبسبب الخلل المتعلق بـ argc يُكتب هذا المسار مرة أخرى في envp[0]، مما «يُقنّن» المتغير GCONV_PATH.
قبل تشغيل البرنامج يتحقق pkexec من متغيرات البيئة (بما فيها SHELL). ونحن نمرر صدفة (shell) غير موجودة (SHELL=xyz) لإحداث خطأ. وعند إخراج الخطأ تُستدعى log_message التي تستخدم آليات glibc. تنظر glibc إلى المتغير CHARSET=bohemcavanna، وعند عدم عثورها على المحوّل القياسي تلجأ إلى المجلد المحدد في GCONV_PATH (الذي دسسناه). وهناك تقرأ الملف gconv-modules، وتحمّل مكتبتنا exploit.so، وتنفّذ الشيفرة داخلها بصلاحيات root.