
تصعيد الامتيازات محليًا عبر حالة سباق TOCTOU في PackageKit.
CVSS 3.x : 7.8 HIGH
CWE : CWE-367 (Time-of-Check Time-of-Use)
Fix : PackageKit 1.3.5+
Affects : PackageKit 1.0.2 – 1.3.4
تصعيد محلي للامتيازات عبر حالة سباق TOCTOU في معالج معاملات D-Bus الخاص بـ PackageKit.
يمكن لأي مستخدم محلي غير مميّز تثبيت حزم عشوائية بصلاحيات الجذر — دون الحاجة إلى مصادقة تتجاوز امتلاك جلسة محلية.
للاختبار / الاستخدام المصرّح به فقط (HTB، CTF، أو مهمة ضمن نطاق مكتوب).
python3 exploit.py
هذا كل شيء. يُنشئ /tmp/.suid_bash، ثم ينفّذ exec داخل قشرة بصلاحيات الجذر.
مسار SUID مخصص أو مهلة زمنية:
SUID_BIN=/dev/shm/.sh TIMEOUT=90 python3 exploit.py
apt install python3-gi dpkg-dev
يولّد الاستغلال حزمتَي .deb وقت التشغيل — لا حاجة إلى مترجم (compiler).
ثلاث علل في src/pk-transaction.c تتكاتف معًا:
تستبدل InstallFiles() القيمَ cached_transaction_flags وcached_full_paths بدون أي فحص للحالة؛ إذ تستبدل مكالمة D-Bus ثانية على نفس المعاملة هذه القيم بلا تمييز — حتى أثناء تشغيل المعاملة بالفعل.
ترفض pk_transaction_set_state() الانتقالات الخلفية غير القانونية (مثل RUNNING→READY وغيرها) دون التراجع عن العلامات المستبدَلة من العلة 1. وتبقى العلامات التالفة قائمة.
يقرأ pk_transaction_run() القيمةَ cached_transaction_flags في وقت الإرسال (عند idle في GLib)، وليس في وقت التفويض. وبهذا يرى الطرف الخلفي علامات المهاجم.
إعداد PK_TRANSACTION_FLAG_SIMULATE (0x4) يتجاوز بالكامل فحص تفويض polkit. فتتم الموافقة على المكالمة الأولى دون أي تفاعل من المستخدم.
Attacker packagekitd
│ │
│ CreateTransaction() │ state = NEW
│─────────────────────────────────►│
│ │
│ InstallFiles(SIMULATE, dummy) │ polkit skipped (SIMULATE)
│─────────────────────────────────►│ state = READY, idle queued
│ │
│ InstallFiles(NONE, payload) │ flags+paths overwritten
│─────────────────────────────────►│ set_state(WAITING_FOR_AUTH) rejected
│ │ state stays READY (BUG 2)
│ │
│ [idle fires]│
│ │ pk_transaction_run() reads NONE (BUG 3)
│ │ → dpkg installs payload as root
│ │ → postinst: chmod +s /tmp/.suid_bash
│ │
│ execv("/tmp/.suid_bash -p") │
│─────────────────────────────────►│ euid=0(root)
تصل المكالمتان قبل لحظة إطلاق idle الخاصة بـ GLib — فلا توجد سباق يجب كسبه؛ الأمر حتمي الحدوث.
Ubuntu Desktop 18.04–26.04، وDebian Trixie، وFedora 43، وRockyLinux 10.1، وأي توزيعة توفّر PackageKit 1.0.2–1.3.4 مع تشغيل الخادم الخفي (daemon).
systemctl mask packagekittransaction->state != PK_TRANSACTION_STATE_NEW ← ارفض