
إثبات المفهوم لثغرة Polkit Pkexec: CVE-2021-4034 (تصعيد الامتيازات المحلي لـ Pkexec)
يحتوي هذا المستودع على استغلال (exploit) طوّرته لفهم كيفية عمل ثغرة Polkit Pkexec: CVE-2021-4034 (Pkexec Local Privilege Escalation). Polkit (المعروف سابقًا باسم PolicyKit) هو مكوّن وظيفته التحكم في الصلاحيات في أنظمة التشغيل من نوع Unix. يوفر بطريقة منظمة وسيلة للعمليات غير الممتازة بالتواصل مع العمليات التي تمتلك صلاحيات. تسمح هذه الثغرة لأي مستخدم، حتى مستخدم عادي في النظام دون صلاحيات إدارية، بالوصول إلى أقصى صلاحية في النظام.
تحدث الثغرة عندما تقوم الدالة main() الخاصة بـ pkexec بمعالجة وسائط سطر الأوامر حيث تكون الوسيطة 0. تحاول الدالة الوصول إلى قائمة الوسائط وينتهي بها الأمر بمحاولة الوصول إلى argv (وحدة التحكم بوسائط سطر الأوامر)، أي أنها تحدث عندما لا يتعامل pkexec بشكل صحيح مع معاملات الاستدعاء وينتهي به الأمر بمحاولة تنفيذ متغيرات البيئة كأوامر. النتيجة هي قراءة وكتابة الذاكرة خارج الحدود، حيث يمكن للمهاجم استغلال ذلك وحقن متغير بيئة يمكن أن يتسبب في تحميل كود خبيث.
من السهل فهم الأمر؛ فحقيقة إمكانية إدخال متغيرات البيئة هذه تجعل الكود عرضة للاختراق. الطريقة التي استخدمتها لاستغلال الثغرة هي نفسها التي استخدمها Qualys. العملية بسيطة، فقط حقن متغير GCONV_PATH في بيئة عمل pkexec، أي أي دليل متاح للمستخدمين العاديين في النظام. سيقوم هذا المتغير بتنفيذ مكتبة مشتركة بصلاحيات root. يجب أن نوضح أن هذه التقنية صاخبة وتترك آثارًا كثيرة، لأن حقن المتغير ينشئ دليلًا ويشارك الصلاحيات مع مستخدم root.
إذا لاحظت أن نظامك معرّض للثغرة، قم بالتحديث في أقرب وقت. وإذا كنت ما زلت تعتقد أنه معرّض، يمكنك إزالة بِت SUID من pkexec كإجراء تخفيف مؤقت، بهذه الطريقة: # chmod 0755 /usr/bin/pkexec
مزيد من التفاصيل حول كيفية عمل الثغرة هنا.
سيعمل الاستغلال فورًا على التوزيعات المعرّضة للثغرة المبنية على Debian وUbuntu وFedora وCentOS. أُنشئ لأغراض دراسية حول الثغرة ولأرى إلى أين يمكنني الوصول حاليًا بمفردي باستخدام لغة C :D. لا تستخدمه لفعل ما لا يجب.
$ git clone https://github.com/Nosferatuvjr/PwnKit
$ cd PwnKit
$ chmod +x ./PwnKit.sh
$ ./PwnKit.sh
# id
أو
$ git clone https://github.com/Nosferatuvjr/PwnKit
$ cd PwnKit
$ chmod +x ./PwnKit
$ ./PwnKit
$ ./PwnKit id #shell interativa

gcc -shared PwnKit.c -o PwnKit -Wl,-e,entry -fPIC