CVE-2026-44561: open-webui: auth bypass exposes private group channels
GHSA-hmgr-67hw-j2cq MEDIUM CISA: TRACK*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.
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?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Open WebUI | pip | <= 0.8.12 | 0.9.0 |
Do you use Open WebUI? You're affected.
How severe is it?
What is the attack surface?
What should I do?
4 steps-
Patch: Upgrade to open-webui 0.9.0, which corrects
is_user_channel_memberto filter onis_active=True, aligning it with the already-correctget_channel_by_id_and_user_idmethod at line 778. -
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).
-
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. -
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?
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:
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
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
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 References
Timeline
Related Vulnerabilities
CVE-2026-44551 9.1 open-webui: LDAP auth bypass — full account takeover
Same package: open-webui CVE-2026-45672 8.8 open-webui: code exec gate bypass via API endpoint
Same package: open-webui CVE-2026-44552 8.7 open-webui: Redis cache poisoning enables cross-instance tool hijack
Same package: open-webui CVE-2025-64495 8.7 Open WebUI: XSS-to-RCE via malicious prompt injection
Same package: open-webui CVE-2026-45315 8.7 open-webui: stored XSS → JWT theft and admin takeover
Same package: open-webui