<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://db.gcve.eu/rss/recent/all/10</id>
  <title>Most recent entries from all</title>
  <updated>2026-10-15T20:49:46.467556+00:00</updated>
  <author>
    <name>Vulnerability-Lookup</name>
    <email>info@gcve.eu</email>
  </author>
  <link href="https://db.gcve.eu" rel="alternate"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator>
  <subtitle>Contains only the most 10 recent entries.</subtitle>
  <entry>
    <id>https://db.gcve.eu/vuln/cve-2026-59215</id>
    <title>CVE-2026-59215 — Open WebUI: Private channel messages can be disclosed through cross-channel thread parent_id binding</title>
    <updated>2026-10-15T20:49:46.469486+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Affected:</strong> open-webui</p>
<p>Open WebUI is an extensible, feature-rich, and user-friendly self-hosted AI platform. Prior to 0.10.0, channel thread parent and reply handling did not bind parent_id to the channel in the URL, allowing an authenticated user to reference a message from another private or DM channel and disclose thread context across channels. This issue is fixed in version 0.10.0.</p></div>
    </content>
    <link href="https://db.gcve.eu/vuln/cve-2026-59215"/>
  </entry>
  <entry>
    <id>https://db.gcve.eu/vuln/pysec-2026-3591</id>
    <title>PYSEC-2026-3591 — Open WebUI: Private channel messages can be disclosed through cross-channel thread parent_id binding</title>
    <updated>2026-10-15T20:49:46.469552+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Affected:</strong> PyPI: open-webui</p>
<p>## Summary</p>
<p>A normal authenticated user can read the content of a message in a private channel they do not belong to. `GET /api/v1/channels/{id}/messages/{message_id}/thread` authorizes the caller against the URL channel, but the underlying thread lookup loads the thread *parent* by id and returns it without verifying the parent belongs to that channel. By requesting a thread in a channel they can access while supplying a victim channel's message id as the thread root, the attacker receives the victim message — content, channel id, and author.</p>
<p>## Affected component</p>
<p>- `backend/open_webui/models/messages.py` — `get_messages_by_parent_id()`
- `backend/open_webui/routers/channels.py` — `get_channel_thread_messages()` (read), `new_message_handler()` (parent/reply binding on write)</p>
<p>## Root cause</p>
<p>`get_messages_by_parent_id(channel_id, parent_id)` filters the thread *replies* by `channel_id`, but loads the thread *parent* by id alone and appends it without requiring `parent.channel_id == channel_id`:</p>
<p>```python
message = await db.get(Message, parent_id)     # loaded by id only — no channel binding
if not message:
    return []
# replies are filtered by channel_id ...
if len(all_messages) &lt; limit:
    all_messages.append(message)               # parent appended unconditionally
```</p>
<p>`get_channel_thread_messages()` authorizes only the URL channel, then calls `get_messages_by_parent_id(id, message_id)` with the caller-supplied `message_id`. The reply insert path (`new_message_handle…</p></div>
    </content>
    <link href="https://db.gcve.eu/vuln/pysec-2026-3591"/>
  </entry>
</feed>
