CVE-2026-44561: open-webui: auth bypass exposes private group channels

GHSA-hmgr-67hw-j2cq MEDIUM CISA: TRACK*
Published May 8, 2026
CISO Take

Open WebUI's channel authorization check fails to validate deactivation status, allowing removed members to silently continue reading and writing all channel messages via direct API calls using their retained credentials. All 15 message-level endpoints share the same flawed `is_user_channel_member` function, meaning the entire channel messaging surface stays open to any former member who knows the channel ID — a trivially met condition since they held it during active membership. There is no public exploit or active exploitation evidence, EPSS data is unavailable, and the Channels feature is disabled by default; however, organizations running Open WebUI with Channels enabled face meaningful insider-threat risk because the UI falsely signals that removal is effective while the API remains fully accessible. Upgrade to open-webui 0.9.0 immediately, or disable the Channels feature in settings until patching is complete.

Sources: NVD GitHub Advisory ATLAS

What is the risk?

Medium risk overall. CVSS 5.4 accurately reflects the limited blast radius: the Channels feature is disabled by default, preconditions require prior membership, and there is no evidence of active exploitation or public proof-of-concept code. The primary concern is insider threat — the false security created by the UI hiding the channel while the API remains open means organizations may not detect unauthorized access until after sensitive content is compromised. Environments using Open WebUI as a shared AI collaboration platform with access-controlled group channels carry the highest exposure, particularly those where channels contain LLM-assisted outputs, strategic discussions, or operational data.

How does the attack unfold?

Initial Access
Former channel member authenticates to Open WebUI using retained valid account credentials and a still-active JWT token.
AML.T0012
Exploitation
Attacker sends direct API requests to channel message endpoints using the previously known channel ID; `is_user_channel_member` returns True for their `is_active=False` membership record, bypassing authorization silently.
AML.T0049
Collection
Attacker reads all channel messages posted after their removal via `GET /api/v1/channels/{id}/messages`, harvesting LLM-assisted outputs, team discussions, and any sensitive AI-generated content from the repository.
AML.T0036
Impact
Attacker exfiltrates sensitive LLM conversation data and optionally posts, edits, or deletes messages to inject disinformation or disrupt AI-assisted team workflows, with no platform-level alert triggered.
AML.T0057

What systems are affected?

Package Ecosystem Vulnerable Range Patched
Open WebUI pip <= 0.8.12 0.9.0
142.4K Pushed 3d ago 77% patched ~5d to patch Full package profile →

Do you use Open WebUI? You're affected.

How severe is it?

CVSS 3.1
5.4 / 10
EPSS
0.2%
chance of exploitation in 30 days
Higher than 7% of all CVEs
Exploitation Status
Exploit Available
Exploitation: MEDIUM
Sophistication
Trivial
Exploitation Confidence
medium
CISA SSVC: Public PoC
Composite signal derived from CISA KEV, VulnCheck KEV, CISA SSVC, EPSS, Metasploit, Exploit-DB, trickest/cve, Nuclei templates, and inthewild.io exploitation reports.

What is the attack surface?

AV AC PR UI S C I A
AV Network
AC Low
PR Low
UI None
S Unchanged
C Low
I Low
A None

What should I do?

4 steps
  1. Patch: Upgrade to open-webui 0.9.0, which corrects is_user_channel_member to filter on is_active=True, aligning it with the already-correct get_channel_by_id_and_user_id method at line 778.

  2. Workaround: If immediate patching is not feasible, disable the Channels feature in Open WebUI settings (verify it remains disabled in your deployment — it is off by default).

  3. Detection: Audit API access logs for requests to /api/v1/channels/{id}/messages* originating from users whose channel membership was recently deactivated; correlate request timestamps against membership deactivation records.

  4. Post-incident: Review channel message history for evidence of unauthorized reads, injected messages, or deletions by former members during the exposure window and assess information disclosure scope.

What does CISA's SSVC say?

Decision Track*
Exploitation poc
Automatable No
Technical Impact partial

Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

EU AI Act
Article 15 - Accuracy, robustness and cybersecurity Article 9 - Risk management system
ISO 42001
A.6.2 - Access control for AI systems
NIST AI RMF
GOVERN 1.1 - Policies and processes for AI risk management MANAGE 2.2 - Risk response and treatment
OWASP LLM Top 10
LLM06:2025 - Sensitive Information Disclosure

Frequently Asked Questions

What is CVE-2026-44561?

Open WebUI's channel authorization check fails to validate deactivation status, allowing removed members to silently continue reading and writing all channel messages via direct API calls using their retained credentials. All 15 message-level endpoints share the same flawed `is_user_channel_member` function, meaning the entire channel messaging surface stays open to any former member who knows the channel ID — a trivially met condition since they held it during active membership. There is no public exploit or active exploitation evidence, EPSS data is unavailable, and the Channels feature is disabled by default; however, organizations running Open WebUI with Channels enabled face meaningful insider-threat risk because the UI falsely signals that removal is effective while the API remains fully accessible. Upgrade to open-webui 0.9.0 immediately, or disable the Channels feature in settings until patching is complete.

Is CVE-2026-44561 actively exploited?

No confirmed active exploitation of CVE-2026-44561 has been reported, but organizations should still patch proactively.

How to fix CVE-2026-44561?

1. Patch: Upgrade to open-webui 0.9.0, which corrects `is_user_channel_member` to filter on `is_active=True`, aligning it with the already-correct `get_channel_by_id_and_user_id` method at line 778. 2. Workaround: If immediate patching is not feasible, disable the Channels feature in Open WebUI settings (verify it remains disabled in your deployment — it is off by default). 3. Detection: Audit API access logs for requests to `/api/v1/channels/{id}/messages*` originating from users whose channel membership was recently deactivated; correlate request timestamps against membership deactivation records. 4. Post-incident: Review channel message history for evidence of unauthorized reads, injected messages, or deletions by former members during the exposure window and assess information disclosure scope.

What systems are affected by CVE-2026-44561?

This vulnerability affects the following AI/ML architecture patterns: LLM chat interfaces, Multi-user AI deployment platforms, AI-assisted team collaboration tools.

What is the CVSS score for CVE-2026-44561?

CVE-2026-44561 has a CVSS v3.1 base score of 5.4 (MEDIUM). The EPSS exploitation probability is 0.18%.

What is the AI security impact?

Affected AI Architectures

LLM chat interfacesMulti-user AI deployment platformsAI-assisted team collaboration tools

MITRE ATLAS Techniques

AML.T0012 Valid Accounts
AML.T0036 Data from Information Repositories
AML.T0049 Exploit Public-Facing Application
AML.T0057 LLM Data Leakage

Compliance Controls Affected

EU AI Act: Article 15, Article 9
ISO 42001: A.6.2
NIST AI RMF: GOVERN 1.1, MANAGE 2.2
OWASP LLM Top 10: LLM06:2025

What are the technical details?

Original Advisory

# Deactivated Channel Members Retain Full Access to Group/DM Channels ## Affected Component Channel membership authorization check: - `backend/open_webui/models/channels.py` (lines 663-673, `is_user_channel_member`) - Used at 15 locations in `backend/open_webui/routers/channels.py` ## Affected Versions Current main branch (commit `6fdd19bf1`) and likely all versions with the group/DM channel feature. ## Description The `is_user_channel_member` function checks whether a `ChannelMember` row exists but does not check the `is_active` field. When a user is deactivated from a group or DM channel (removed by the channel owner, or leaves voluntarily), their membership row persists with `is_active=False` and `status='left'`. Because the authorization check ignores this field, the deactivated user retains full read and write access to the channel via direct API calls. The channel correctly disappears from the deactivated user's channel list (the listing query at `get_channels_by_user_id` properly filters on `is_active`), but all 15 message-level endpoints in the router rely on `is_user_channel_member` for authorization, which does not filter on `is_active`. ```python # models/channels.py:663 — missing is_active check def is_user_channel_member(self, channel_id, user_id, db=None): membership = db.query(ChannelMember).filter( ChannelMember.channel_id == channel_id, ChannelMember.user_id == user_id, ).first() return membership is not None # True even when is_active=False ``` Compare with `get_channel_by_id_and_user_id` (line 778) which correctly checks `ChannelMember.is_active.is_(True)`. ## CVSS 3.1 Breakdown | Metric | Value | Rationale | |--------|-------|-----------| | Attack Vector | Network (N) | Exploited remotely via API calls | | Attack Complexity | Low (L) | No special conditions beyond knowing the channel ID (which the user had as a former member) | | Privileges Required | Low (L) | Requires a valid user account and prior channel membership | | User Interaction | None (N) | No victim interaction required | | Scope | Unchanged (U) | Impact is within the same authorization boundary (the channel) | | Confidentiality | Low (L) | Can read messages in a channel the user should no longer access | | Integrity | Low (L) | Can post, edit, and delete messages in the channel | | Availability | None (N) | No denial of service | ## Attack Scenario 1. User A and User B are members of a private group channel. 2. The channel owner removes User B (or User B leaves). User B's membership is set to `is_active=False, status='left'`. 3. The channel disappears from User B's UI — but User B noted the channel ID while they were a member. 4. User B calls the API directly: - `GET /api/v1/channels/{channel_id}/messages` — reads all messages, including those posted after deactivation - `POST /api/v1/channels/{channel_id}/messages/post` — posts new messages - `POST /api/v1/channels/{channel_id}/messages/{id}/update` — edits messages - `DELETE /api/v1/channels/{channel_id}/messages/{id}/delete` — deletes messages 5. All requests succeed because `is_user_channel_member` returns `True`. ## Impact - Deactivated users can continue reading all new messages posted after their removal (confidentiality breach) - Deactivated users can post, edit, and delete messages (integrity breach) - The deactivation mechanism provides a false sense of security — channel owners believe removed users have lost access ## Preconditions - Channels feature must be enabled (disabled by default) - Attacker must have a valid user account - Attacker must have been a member of the channel at some point (and thus knows the channel ID) ## Recommended Fix Add `is_active` filtering to `is_user_channel_member`: ```python def is_user_channel_member(self, channel_id, user_id, db=None): membership = db.query(ChannelMember).filter( ChannelMember.channel_id == channel_id, ChannelMember.user_id == user_id, ChannelMember.is_active.is_(True), ).first() return membership is not None ``` This aligns it with the existing `get_channel_by_id_and_user_id` method which already applies this filter correctly.

Exploitation Scenario

A recently removed employee — aware of an internal AI strategy channel in Open WebUI — retains their platform account and JWT token. Despite seeing the channel disappear from their UI, they use the channel ID recorded during active membership to query the REST API directly: `GET /api/v1/channels/abc123/messages`. The request succeeds because `is_user_channel_member` returns True for their `is_active=False` membership record. They silently read weeks of subsequent LLM-assisted brainstorming sessions and competitive intelligence discussions posted after their removal. To maximize damage, they post a fabricated decision attributed to the team, then delete it before anyone notices — all without triggering any platform-level alerts, since the authorization check never fails.

Weaknesses (CWE)

CWE-284 — Improper Access Control: The product does not restrict or incorrectly restricts access to a resource from an unauthorized actor.

  • [Architecture and Design, Operation] Very carefully manage the setting, management, and handling of privileges. Explicitly manage trust zones in the software.
  • [Architecture and Design] Compartmentalize the system to have "safe" areas where trust boundaries can be unambiguously drawn. Do not allow sensitive data to go outside of the trust boundary and always be careful when interfacing with a compartment outside of the safe area. Ensure that appropriate compartmentalization is built into the system design, and the compartmentalization allows for and reinforces privilege separation functionality. Architects and designers should rely on the principle of least privilege to decide the appropriate time to use privileges and the time to drop privileges.

Source: MITRE CWE corpus.

CVSS Vector

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:L/A:N

Timeline

Published
May 8, 2026
Last Modified
May 8, 2026
First Seen
May 9, 2026

Related Vulnerabilities