
CVE-2021-3560 — استغلال تصعيد الامتيازات في Polkit عبر سباق حالة في accounts-daemon لـ D-Bus
CVE-2021-3560 هي ثغرة تصعيد امتيازات محلية في Polkit (سابقًا PolicyKit)، وهو إطار التفويض المستخدم في بيئات سطح المكتب لينكس. يمكن لمهاجم محلي غير مميز استغلال حالة سباق (race condition) في واجهة D-Bus الخاصة بـ accounts-daemon لإنشاء مستخدم مميز، تعيين كلمة مرور له، والحصول في النهاية على صلاحيات الجذر (root).
accounts-daemon (org.freedesktop.Accounts) هي خدمة D-Bus نظامية تدير حسابات المستخدمين (الإنشاء، الحذف، تغيير كلمة المرور، إلخ). تعرض طرق مثل:
| الطريقة | الإجراء |
|---|---|
CreateUser | إنشاء مستخدم نظام جديد |
SetPassword | تعيين كلمة مرور المستخدم |
DeleteUser | حذف مستخدم |
تتطلب هذه العمليات تفويضًا. عندما تصل استدعاء D-Bus، يكون Polkit وسطًا بين المتصل و accounts-daemon:
Caller → D-Bus → Polkit (authorization check) → accounts-daemon (action)
يقرر Polkit ما إذا كان المتصل لديه الإذن، وإذا كان الأمر كذلك، يعيد توجيه الطلب إلى accounts-daemon للتنفيذ.
الثغرة هي TOCTOU (وقت التحقق، وقت الاستخدام) سباق. إليك الفكرة الأساسية:
accounts-daemon (مثل CreateUser).accounts-daemon من المعالجة — يتم إنشاء المستخدم دون توثيق مناسب، ومع ذلك ينتهي سجل المستخدم غير مكتمل (مثل، بدون كلمة مرور، بدون دليل المنزل).SetPassword على المستخدم المنشأ حديثًا (ولكن غير الموثوق)، أو الحالة غير المكتملة نفسها تمنح امتيازات مرتفعة.باختصار: اقتل الطلب في الوقت المناسب، وسوف تتجاوز التوثيق.
يقوم هذا السكريبت exploit.sh بأتمتة سلسلة الهجوم الكاملة:
# Clone the repository
git clone https://github.com/Jeanback1/CVE-2021-3560.git
cd CVE-2021-3560
# Make the exploit executable
chmod +x exploit.sh
# Run it
./exploit.sh
بمجرد اكتمال الاستغلال، سيكون لديك شل جذر:
whoami
# root

| المكون | متأثر |
|---|---|
| polkit | ≤ 0.119 (غير مصحح) |
| accounts-daemon (accountsservice) | جميع الإصدارات التي تستخدم polkit المتأثر |
تم تصحيح الثغرة في polkit 0.120 والإصدارات الأحدث.
التوزيعات التي تم تصحيحها (غير شاملة):
هذا المستودع مخصص لأغراض تعليمية وبحوث أمنية مرخصة فقط. لا تستخدم هذا الاستغلال على أنظمة لا تملكها أو ليس لديك إذن صريح لاختبارها. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.
| الخطوة | الإجراء |
|---|
| 1. معايرة الوقت | يستخدم استدعاء وهمي CreateUser("nobody") لقياس الوقت الذي تستغرقه الرحلة ذهابًا وإيابًا لـ D-Bus، لحساب "نافذة القتل" |
| 2. إنشاء المستخدم | يرسل استدعاء CreateUser لاسم مستخدم محدد، يبدأه في الخلفية، ينتظر للنافذة المحسوبة، ثم يقتله — مستغلاً السباق لإنشاء مستخدم غير مفوض |
| 3. تعيين كلمة المرور | بمجرد وجود المستخدم (في حالة غير مكتملة)، يرسل استدعاء SetPassword بنفس تقنية السباق لتعيين كلمة مرور معروفة |
| 4. تصعيد الامتيازات | يستخدم su للتبديل إلى المستخدم الجديد، يشغل sudo (الذي يعمل لأن المستخدم تم إنشاؤه عبر مسار تفويض تم تجاوزه)، ينسخ /bin/bash إلى /var/tmp/bash مع SUID root، ويطلق شل جذر |