
هذا هو تنفيذي البسيط لاستغلال ثغرة PwnKit.
ملاحظة: هذا المستودع ومحتواه جزء من مشروع التخرج (GrAL)، أُنشئ لأغراض تعليمية وبحث أكاديمي فقط.
يحتوي هذا المستودع على إثبات مفهوم (PoC - Proof of Concept) لثغرة CVE-2021-4034 (المعروفة أيضًا باسم PwnKit). تؤثر هذه الثغرة من نوع تلف الذاكرة على مكوّن pkexec في Polkit في أنظمة Linux. عند تنفيذ pkexec بقائمة وسائط فارغة (argc == 0)، يمكن التلاعب بمتغيرات البيئة لإجباره على تحميل مكتبة مشتركة عشوائية، وبالتالي تحقيق تصعيد صلاحيات محلي.
فيما يلي الخطوات اللازمة لتجهيز بيئة التنفيذ لاستغلال الخلل. توضح هذه العملية كيفية استغلال خطأ القراءة/الكتابة في الذاكرة في pkexec:
gconv)يستغل هذا الإكسبلويت الطريقة التي تتعامل بها GLib مع تحويل الأحرف عند محاولة طباعة رسالة خطأ. للقيام بذلك، تتمثل الخطوة الأولى في إنشاء بنية دليل محددة تعمل كمستودع محلي لوحدات تحويل GCONV بالنسبة إلى GLib.
مفتاح الثغرة هو حقن متغير البيئة GCONV_PATH، عبر استغلال الكتابة خارج الحدود الناتجة عن حالة argc == 0 في pkexec. بهذه الطريقة، يُجبر البرنامج على استخدام مجموعة أحرف شاذة، مما يوجّه GLib إلى البحث عن وحدات تحويل الأحرف في الدليل المتحكم فيه الذي تم إنشاؤه في الخطوة السابقة.
.so)لتنفيذ الكود الخاص بنا، يجب تجميع مكتبة مشتركة (shared object أو .so). عندما يحاول pkexec معالجة مجموعة أحرف لا يستطيع العثور عليها، فسيقوم بتحميل هذه المكتبة من دليل gconv الزائف الخاص بنا. بما أن pkexec هو ملف ثنائي مع تفعيل بِت SUID (يُنفَّذ بصلاحيات root)، فإن تحميل هذه المكتبة سيجعل الكود الخاص بنا يحصل على صلاحيات root، مستحوذًا على السيطرة الكاملة على النظام (على سبيل المثال، فتح قشرة root).
gconv-modulesأخيرًا، يجب إنشاء ملف إعداد باسم gconv-modules في هذا الدليل المحلي. يعمل هذا الملف كفهرس: يخبر GLib بالمكتبة المحددة (.so) التي يجب تحميلها لإجراء تحويل مجموعة الأحرف المحددة المطلوبة. يربط هذا الملف بين التحويل الذي يطلبه pkexec والمكتبة المشتركة التي أُنشئت في الخطوة 3.
يحتوي المشروع على Makefile لأتمتة تجميع ملف C الثنائي وتنظيف البيئة.
لتجميع المشروع: $ make
لتنظيف الملفات الناتجة (الملفات المؤقتة والمجلدات والملفات الثنائية): $ make clean