CVE-2026-41651 — PackageKit TOCTOU تصعيد الامتيازات المحلي
التصنيف: أداة تقييم الفريق الأرجواني
للاستخدام المصرح به فقط. هذه الوثيقة والبرنامج النصي للاختبار المرفق مخصصان حصريًا للتحقق الأمني الداخلي على الأنظمة التي تم الحصول على إذن كتابي لها.
إثبات الاستغلال

جدول المحتويات
- نظرة عامة على الثغرة
- التحليل الفني
- وصف البرنامج النصي للاختبار
- مؤشرات الاختراق
- منطق الكشف
- الأنظمة والإصدارات المتأثرة
- المعالجة
- المراجع
نظرة عامة على الثغرة
PackageKit هي طبقة تجريد D-Bus لإدارة حزم النظام، وهي موجودة افتراضيًا على أجهزة سطح المكتب القائمة على GNOME عبر Debian وUbuntu وFedora وRHEL وSUSE وArch Linux. نظرًا لأنها تتوسط عمليات الحزم المميزة نيابة عن المستخدمين غير المميزين، فإن وجود خلل في تدفق التفويض الخاص بها له تأثير جذري على مستوى النظام بأكمله.
التحليل الفني
السبب الجذري
pk-transaction.c (قبل الإصدار 1.3.5) لم يفرض حارس حالة على إعادة استدعاء طرق الإجراء. يمكن لعميل D-Bus استدعاء InstallFiles (أو طرق إجراء أخرى) عدة مرات على نفس كائن المعاملة بعد أن انتقل بالفعل خارج PK_TRANSACTION_STATE_NEW.
سلسلة الهجوم
المهاجم (غير مميز)
│
├─① CreateTransaction() → PackageKit يُرجع مسار كائن المعاملة (tid)
│
├─② InstallFiles(tid, FLAG_SIMULATE=4, [dummy.pkg])
│ PackageKit يضع فحص تفويض polkit في قائمة الانتظار لـ dummy.pkg.
│ لا يحدث أي تثبيت بعد — SIMULATE تعني تشغيل تجريبي فقط.
│
├─③ InstallFiles(tid, FLAG_NONE=0, [payload.pkg]) ← نافذة TOCTOU
│ إعادة استدعاء على نفس tid قبل اكتمال التفويض.
│ الإصدارات المعرضة تستبدل المعاملات في قائمة الانتظار بـ payload.pkg.
│
└─④ polkit يمنح التفويض (وافق المستخدم أو تفويض تلقائي)
packagekitd يثبّت payload.pkg كجذر.
سكربت postinst/post الخاص بالحزمة: install -m 4755 /bin/bash /tmp/.suid_bash
المهاجم ينفذ /tmp/.suid_bash -p → قشرة جذر.
لماذا يفوز السباق
الخطوتان ② و③ تُرسلان كاستدعاءات D-Bus غير متزامنة غير محظورة على نفس الاتصال وتُفرَّغان في كتابة واحدة. تصل الرسالتان إلى packagekitd قبل أن يتمكن من معالجة ② وتقديم آلة الحالة، مما يترك نافذة TOCTOU مفتوحة. يضيف الإصلاح في 1.3.5 فحص حالة صريحًا يُرجع PK_TRANSACTION_ERROR_INVALID_STATE على أي إعادة استدعاء بعد PK_TRANSACTION_STATE_NEW.
وصف البرنامج النصي للاختبار
الملف: cve-2026-41651-purpleteam.py
اللغة: Python 3
التبعيات: python3-gi (ربط GObject introspection / GLib/Gio)
الغرض
يوضح قابلية استغلال CVE-2026-41651 على نظام اختبار مُجهّز لأغراض:
- التحقق مما إذا كان إصدار PackageKit المثبت معرضًا للخطر
- توليد بيانات IOC واقعية لضبط SIEM/EDR
- اختبار تغطية الكشف قبل وبعد التصحيح
السلوك
دعم البيئات المحصّنة
يمكن للأنظمة المحصّنة افتراضيًا حظر الاستغلال عند نقطتين مستقلتين. يتعامل البرنامج النصي مع كلتيهما تلقائيًا.
1. umask تقييدي (027 / 077)
يؤدي umask الموروث من العملية بقيمة 027 أو 077 إلى إنتاج mkdir() لأدلة 750 أو 700. يجب على كل من dpkg-deb وrpmbuild اجتياز شجرة البناء الكاملة — إذا كان أي دليل غير قابل للقراءة يفشل البناء بصمت.
الإصلاح المطبق: يتم استدعاء os.umask(0o022) عند بدء التشغيل قبل إنشاء أي ملف أو دليل. بالإضافة إلى ذلك، يتلقى كل دليل وملف في شجرة البناء chmod صريحًا فور الإنشاء (0o755 للأدلة والسكربتات، 0o644 لملفات البيانات)، بحيث تكون الأذونات الصحيحة مضمونة بغض النظر عن umask الموروث.
2. أعلام تحميل nosuid / noexec على /tmp
| العلم | التأثير على الاستغلال |
|---|
nosuid | النواة تزيل بصمت بت SUID من أي ملف مخزن على نظام الملفات هذا — bash المنسوخ لا يصبح جذرًا أبدًا |
noexec | لا يمكن تنفيذ ثنائي SUID على الإطلاق |
الإصلاح المطبق: عند بدء التشغيل، يقرأ _find_suid_dir() ملف /proc/mounts ويختبر الأدلة المرشحة بترتيب الأفضلية حتى يجد نظام ملفات لا يحتوي على أي من العلمين. يتم بعد ذلك دمج المسار المُحل في سكربت ما بعد التثبيت للحمولة ويُستخدم للتحقق والتنفيذ.
إذا كانت جميع المرشحات محظورة يخرج البرنامج النصي برسالة خطأ واضحة بدلاً من الفشل بصمت.
التوافق
| عائلة التوزيعات | أداة الحزم | تم الاختبار |
|---|
| Debian / Ubuntu | dpkg-deb | ✓ |
| RHEL / Fedora |
مؤشرات الاختراق
تُدرج مؤشرات الاختراق من المستوى العام/البنية التحتية وصولًا إلى آثار البرنامج النصي المحددة. سيكتشف الكشف المبني على المؤشرات العامة هذه الثغرة بغض النظر عن متغير PoC المستخدم.
نظام الملفات
العمليات والتنفيذ
نشاط D-Bus
أنماط سجلات التدقيق
التفعيل مع: auditctl -a always,exit -F arch=b64 -S all -F path=/usr/bin/packagekitd
أو استخدم القواعد أدناه في /etc/audit/rules.d/:
# كشف إنشاء ملفات SUID في جميع أدلة الإسقاط المرشحة
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/tmp -k suid_drop
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/var/tmp -k suid_drop
-a always,exit -F arch=b64 -S chmod,fchmod,fchmodat -F a2&04000 -F dir=/dev/shm -k suid_drop
# كشف dpkg-deb / rpmbuild بواسطة غير الجذر
-w /usr/bin/dpkg-deb -p x -k pkg_build_nonroot
-w /usr/bin/rpmbuild -p x -k pkg_build_nonroot
# كشف تنفيذ bash SUID من أي دليل إسقاط مرشح
-a always,exit -F arch=b64 -S execve -F dir=/tmp -F uid!=0 -F euid=0 -k priv_esc_drop
-a always,exit -F arch=b64 -S execve -F dir=/var/tmp -F uid!=0 -F euid=0 -k priv_esc_drop
-a always,exit -F arch=b64 -S execve -F dir=/dev/shm -F uid!=0 -F euid=0 -k priv_esc_drop
آثار مدير الحزم
آثار تصعيد الامتيازات
منطق الكشف
قاعدة SIEM شبه رمزية (عامة — تغطي جميع متغيرات CVE-2026-41651)
(
event.category == "process"
AND process.name IN ("dpkg-deb", "rpmbuild")
AND process.user.id != "0"
AND NOT process.parent.name IN ("apt", "apt-get", "dpkg", "rpm", "dnf", "yum", "zypper", "mock", "koji")
)
OR
(
event.category == "file"
AND file.path LIKE "/tmp/%" OR file.path LIKE "/var/tmp/%" OR file.path LIKE "/dev/shm/%"
AND file.owner == "root"
AND (file.mode LIKE "04%")
)
OR
(
event.category == "process"
AND process.name == "bash"
AND process.real_user.id != "0"
AND process.effective_user.id == "0"
AND NOT process.parent.name IN ("sudo", "su", "sshd", "login", "pam")
)
سلسلة سلوك EDR
packagekitd
└─ sh / bash (cwd أو الوسيطة تطابق /tmp, /var/tmp, /dev/shm, أو $HOME)
└─ install / cp / chmod (الهدف لديه SUID + المالك root)
قم بوضع علامة على السلسلة الكاملة. أي خطوة فردية وحدها قد تكون حميدة؛ علاقة الأصل-الفرع عبر packagekitd إلى أمر يضبط SUID عالية الدقة بغض النظر عن دليل الإسقاط المحدد. وسّع القواعد القائمة على المسار لتغطية جميع المرشحات الأربعة.
الأنظمة والإصدارات المتأثرة
تحقق من الإصدار المثبت: pkcon backend-details أو packagekit --version
معرضة إذا كان الإصدار المبلغ عنه ≤ 1.3.4.
المعالجة
الأساسي: ترقية PackageKit إلى 1.3.5 أو تطبيق النقل الخلفي الخاص بالبائع.
# Debian / Ubuntu
apt update && apt install --only-upgrade packagekit
# Fedora / RHEL
dnf upgrade packagekit
# SUSE
zypper update packagekit
التخفيفات (إذا لم يكن التصحيح ممكنًا فورًا):
المراجع
تم الإنشاء: 2026-04-24 | تم التحديث: 2026-04-25 | تقييم الفريق الأرجواني | للاستخدام الداخلي فقط