GHSA-x2ff-v5v8-m75m: Open WebUI: Cross-channel message overwrite via chat completion API (single-model and multimodel message_ids)
Summary
Any authenticated user can overwrite the content of a message in a channel they do not belong to (including private and DM channels) by sending a chat completion request with a channel:-prefixed chat_id and a target message_id. The channel: path routes pipeline output through _make_channel_emitter, which writes to the Messages table using the caller-supplied message_id without binding it to the channel.
This advisory consolidates two filings of the same flaw: the original single-model form, and a multimodel message_ids variant that survives the partial fix shipped in v0.9.6 (see "Fix status" below).
Details (as introduced in v0.9.5)
When a user submits a chat completion request with a chat_id starting with channel:, three authorization gaps combined in v0.9.5:
1. Ownership check skipped (main.py): the channel: prefix caused the entire ownership/membership verification block to be skipped, with no channel membership/write check replacing it.
if not chat_id.startswith('local:') and not chat_id.startswith('channel:'): # temporary/channel chats are not stored
if is_new_chat:
...
else:
if not await Chats.is_chat_owner(chat_id, user.id) and user.role != 'admin':
raise HTTPException(...)
2. Message ID from user input: id (and each value of the multimodel message_ids map) comes directly from the request body and is passed as message_id to the channel emitter.
3. Unchecked database write (socket/main.py _make_channel_emitter):
async def _make_channel_emitter(request_info):
channel_id = request_info['chat_id'].removeprefix('channel:')
message_id = request_info['message_id'] # user-supplied
...
await Messages.update_message_by_id(message_id, update_form) # no channel/user authz
Messages.update_message_by_id performs a direct primary-key update with no channel_id/user_id validation.
Fix (shipped in v0.10.0)
v0.9.6 added a channel gate to the channel: branch (PR #24725) that closed the single-model path, but it validated only the first entry of the multimodel
Details
Original advisory: https://github.com/advisories/GHSA-x2ff-v5v8-m75m
Referenced CVEs
| CVE | CSIRTS overview | External |
|---|---|---|
| CVE-2026-59714 | coverage & exploitation status | NVD · CVE.org |
More from GitHub Security Advisories
- mediumGHSA-jr6p-8pjj-mfx6: Capsule has an incomplete fix of CVE-2026-22872: TenantResource RawItems and Generators s…2026-07-31
- mediumGHSA-68cj-mvg9-rgm2: Capsule: CapsuleConfiguration NodeMetadata regex fields lack webhook validation, allowing…2026-07-31
- mediumGHSA-ff84-5f28-78qj: re2: Out-of-bounds heap read in `exec`/`test`/`match` via attacker-influenced `lastIndex`…2026-07-31
- mediumGHSA-6hxr-mr5r-9836: re2: Global `String.prototype.match` with an empty-matchable pattern never advances → inf…2026-07-31
- mediumGHSA-x83g-979r-f5fh: Sylius Mollie Plugin has unauthenticated IDOR that leaks order token and customer PII2026-07-31