
رفع الامتيازات عبر سباق التوقيت (race condition) في polkit
رفع الامتيازات عبر حالة السباق في polkit.
CVE-2021-3560 هي حالة سباق في polkit تسمح لمستخدم محلي غير مصرح له بالحصول على صلاحيات root. توجد الثغرة في طريقة معالجة polkit لأخطاء D-Bus عند انقطاع الاتصال.
لتحديد التوقيت الأمثل، نفّذ الأمر التالي:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:testuser string:"Test User" int32:1
يستخدم الكود نطاقًا من نصف الوقت الحقيقي ± 0.003.
لماذا التوقيت مهم؟
إذا تم إنهاء العملية مبكرًا جدًا — فلن يتم إرسال الطلب
إذا تم إنهاؤها متأخرًا جدًا — سينجح polkit في التحقق من الصلاحية ويرفض
يجب الوصول إلى "النافذة الذهبية" عندما يكون polkit قد تلقى الطلب بالفعل، لكنه لم يتحقق من الصلاحية بعد
كيف يعمل الاستغلال؟
يتم إرسال طلب D-Bus لإنشاء مستخدم مع المعلمة int32:1 (إضافة إلى مجموعة wheel)
يتم قطع الطلب في منتصفه (حالة سباق)
لا يتمكن polkit من إكمال التحقق من الصلاحية
لا يستطيع D-Bus العثور على المرسل
يعالج polkit الخطأ بشكل خاطئ ويُسند UID = 0 (root)
يتم إنشاء المستخدم دون مصادقة
يتم إرسال طلب تعيين كلمة مرور للمستخدم الجديد (بنفس التوقيت)
إحصائيات النجاح
يمكن للمستخدم أن يُنشأ من 1-2 محاولات
يتطلب تعيين كلمة المرور محاولات أكثر
100 تكرار تعطي احتمال نجاح مرتفع
إذا لم يعمل الاستغلال، جرب:
توسيع TIMING_RANGE في الكود
تشغيل السكربت عدة مرات
التأكد من أنك في جلسة SSH (وليس في واجهة رسومية)