
# مختبر Docker بأسلوب CTF لـ CVE-2026-41651 (Pack2TheRoot): تصعيد صلاحيات محلي عبر PackageKit مع سياسة polkit متساهلة
مختبر محلي لتصعيد الصلاحيات بأسلوب CTF، مبني على Docker، ويستند إلى
استشارة Pack2TheRoot (CVE-2026-41651)، وهي ثغرة عمرها 12 عامًا في
خادم PackageKit
تم الكشف عنها من قبل الفريق الأحمر لشركة Deutsche Telekom في 22 أبريل 2026.
يتضمن المختبر ثلاث حاويات: تحدي CTF بسياسات polkit متساهلة، هدف مقارنة مُحصّن، وإعادة إنتاج كاملة لثغرة TOCTOU تبني PackageKit الضعيف من المصدر وتشغّل استغلال السبب الجذري الفعلي لـ CVE-2026-41651.
| الحاوية | المنفذ | الدور | نتيجة الاستغلال |
|---|---|---|---|
pack2theroot-vuln | tcp/2222 (ssh) | PackageKit ≤ 1.3.4 + قاعدة polkit متساهلة | جذر (Root) عبر حزمة RPM مصمّمة |
pack2theroot-patched | tcp/2223 (ssh) | نفس الشيء، لكن مع polkit مُحصّن | فشل الاستغلال |
pack2theroot-exploit | — | PackageKit 1.3.4 ضعيف مبني من المصدر | جذر (Root) عبر سباق D-Bus من نوع TOCTOU |
بالإضافة إلى:
docs/CHALLENGE.md)docs/HINTS.md)docs/SOLUTION.md)docs/diagrams/)pk-transaction.cيرسل الاستغلال استدعاءين غير متزامنين لـ InstallFiles() عبر D-Bus على نفس
المعاملة: الأول مع SIMULATE (يتجاوز polkit، ويُدرج استدعاء GLib خامل في قائمة الانتظار)،
ثم فورًا مع NONE + الحزمة الخبيثة (يستبدل العلامات/المسارات المخزنة قبل تنفيذ الاستدعاء الخامل).
يضمن ترتيب الأولوية في GLib إرسال رسالتي D-Bus قبل الاستدعاء الخامل — مما يجعل
هذا حتميًا وليس سباق توقيت.
مؤشر اختراق معروف (من الاستشارة):
journalctl --no-pager -u packagekit | grep -iE 'emitted_finished|pk_transaction_finished_emit|pk-transaction\.c:514'
git clone https://github.com/dinosn/pack2theroot-lab.git
cd pack2theroot-lab
docker compose build
docker compose up -d
ssh labuser@localhost -p 2222 # كلمة المرور: labuser
# ثم اعمل على docs/CHALLENGE.md
العلم موجود في /root/flag.txt (الوضع 0400 root:root). الصيغة:
PACK2THEROOT{...}
# البناء والتشغيل — الوضع التلقائي ينفّذ الاستغلال فورًا:
docker compose run --rm exploit
# أو الوضع اليدوي:
docker compose run --rm --entrypoint /entrypoint.sh exploit
# ثم داخل الحاوية:
su - victim -c /exploit/cve-2026-41651
يبني الاستغلال حزمتي .deb بلغة C (بدون أدوات خارجية)،
ويرسل سباق D-Bus المزدوج، وينشئ bash بصلاحيات SUID في
/tmp/.suid_bash. راجع docs/SOLUTION.md للحصول على
الشرح الفني الكامل.
الإيقاف:
docker compose down -v
pack2theroot-lab/
├── README.md
├── docker-compose.yml
├── docs/
│ ├── CHALLENGE.md # موجز اللاعب
│ ├── HINTS.md # تلميحات تدريجية (كلا المسارين)
│ ├── SOLUTION.md # شرح كامل + العلم
│ ├── references.md # المصادر الأولية والثانوية
│ ├── threat-model.md # افتراضات المهاجم/المدافع
│ └── diagrams/ # رسوم بيانية SVG لمسار الاستغلال
│ ├── 01-docker-build.svg
│ ├── 02-container-startup.svg
│ ├── 03-exploit-execution.svg
│ ├── 04-dbus-race-sequence.svg
│ ├── 05-attack-overview.svg
│ └── 06-auto-mode-full-run.svg
├── exploit/
│ ├── Dockerfile # يبني PackageKit 1.3.4 الضعيف من المصدر
│ ├── entrypoint.sh # يبدأ dbus + polkitd + packagekitd
│ ├── Makefile
│ └── src/
│ └── cve-2026-41651.c # استغلال TOCTOU (PoC عام)
├── vulnerable/
│ ├── Dockerfile
│ ├── entrypoint.sh
│ └── policy/
│ └── 10-pack2theroot-lab-misconfig.rules # تحدي CTF
├── patched/
│ ├── Dockerfile
│ ├── entrypoint.sh
│ ├── local/ # ضع حزمة RPM لإصدار 1.3.5 هنا (اختياري)
│ └── policy/
│ └── 10-pack2theroot-lab-hardened.rules # الإصلاح
└── scripts/
├── exploit-check.sh # يفحص الإصدار و polkit و D-Bus ومؤشرات IOC
├── check-version.sh # حكم VULNERABLE مقابل PATCHED
├── check-preconditions.sh # فحص سلامة pkcon / polkit / D-Bus
├── monitor-ioc.sh # يتتبع journal بحثًا عن IOC من الاستشارة
├── compare-env.sh # يقارن بين الحاويتين
└── apply-polkit-mitigation.sh # تخفيف مؤقت للمضيفات غير المُصحّحة
يحتوي دليل docs/diagrams/ على رسوم بيانية SVG
توضح مسار الاستغلال. افتحها في أي متصفح:
راجع docs/CHALLENGE.md. باختصار:
labuser (كلمة المرور labuser).rpm-build و rpmdevtools مثبتتان).pkcon install-local --allow-untrusted.%post بصلاحيات الجذر. اقرأ /root/flag.txt.عالق؟ docs/HINTS.md يحتوي تلميحات أكثر وضوحًا بشكل تدريجي.
افتح docs/SOLUTION.md فقط بعد أن تحل التحدي أو
تحتاج فعلًا إلى الشرح المكتوب.
داخل أي من الحاويتين، وبأي مستخدم:
/opt/lab/check-version.sh # حكم VULNERABLE أو PATCHED
/opt/lab/check-preconditions.sh # فحص ذاتي للتعرض
/opt/lab/exploit-check.sh # فحص الإصدار + polkit + D-Bus + IOC
/opt/lab/monitor-ioc.sh # يتتبع journal بحثًا عن IOC
من المضيف، جنبًا إلى جنب:
./scripts/compare-env.sh
طبّق تخفيف polkit المؤقت على حاوية ضعيفة:
docker exec pack2theroot-vuln /opt/lab/apply-polkit-mitigation.sh
# ثم أعد محاولة الاستغلال — يجب أن يفشل الآن.
تتعامل صورة patched مع حالة إصدار PackageKit بشفافية:
/etc/pack2theroot-banner) توضح
ما إذا كان الإصدار المثبت هو التصحيح الفعلي أم مجرد بديل من التوزيعة.لبناء صورة مُصحّحة كاملة الإصدار بمجرد نشر توزيعتك للنقل الخلفي،
ضع حزم RPM في patched/local/ وأعد البناء:
docker compose build --build-arg USE_LOCAL_RPM=1 patched
--privileged لتشغيل حزمة
dbus/polkitd/packagekitd الكاملة. شغّلها فقط في بيئات معزولة.labuser) ضعيفة عمدًا. لا تعِد استخدامها أبدًا.المصادر الأولية:
CVE-2026-41651:
https://nvd.nist.gov/vuln/detail/CVE-2026-4165176cfb675:
https://github.com/PackageKit/PackageKit/commit/76cfb675fb31acc3ad5595d4380bfff56d2a8697راجع docs/references.md للتغطية الثانوية
ومتتبعات التوزيعات.
MIT — راجع LICENSE.
| الحقل | القيمة |
|---|
| CVE | CVE-2026-41651 |
| الاسم | Pack2TheRoot |
| التصنيف | تصعيد صلاحيات محلي (TOCTOU / CWE-367) |
| المكوّن | خادم PackageKit (pk-transaction.c) |
| النطاق المتأثر | >= 1.0.2 و <= 1.3.4 (12 عامًا من الإصدارات) |
| تم الإصلاح في | PackageKit 1.3.5 (الالتزام 76cfb675، صدر في 2026-04-22) |
| CVSS 3.1 | 8.8 (HIGH) — AV:L/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| الشروط المسبقة | شل محلي غير مميز على مضيف يعمل بنظام PackageKit |
| المكتشف | Deutsche Telekom Security GmbH — الفريق الأحمر |
| الخطأ | الموقع | التأثير |
|---|
| الخطأ 1 | InstallFiles() (سطر ~4036) | يستبدل cached_transaction_flags و cached_full_paths دون قيد — لا يوجد حارس حالة |
| الخطأ 2 | pk_transaction_set_state() (الأسطر ~876–881) | يتجاهل بصمت انتقالات الحالة للخلف بدلاً من إرجاع خطأ — العلامات مسمومة بالفعل |
| الخطأ 3 | pk_transaction_run() (الأسطر ~2273–2277) | يقرأ cached_transaction_flags وقت التنفيذ، وليس وقت التفويض |
| الالتفاف | علامة SIMULATE (الأسطر ~2893–2900) | PK_TRANSACTION_FLAG_SIMULATE (0x4) يتجاوز polkit بالكامل |
| الرسم البياني | الوصف |
|---|
01-docker-build.svg | بناء Docker على مرحلتين — تجميع PackageKit الضعيف |
02-container-startup.svg | إطلاق الحاوية — بدء تشغيل dbus و polkitd و packagekitd |
03-exploit-execution.svg | مخرجات الاستغلال خطوة بخطوة مع مراحل مشروحة |
04-dbus-race-sequence.svg | مخطط تسلسل D-Bus — كيف تترابط الأخطاء 1/2/3 مع أولوية GLib |
05-attack-overview.svg | مسار الهجوم عالي المستوى: المهاجم مقابل النظام مع خط زمني |
06-auto-mode-full-run.svg | محطة طرفية كاملة لوضع --auto — من بدء الحاوية إلى شل الجذر |