NIST deprecates RSA-2048 from 2030. Find every one of them before attackers do.
🐍
🐍 PyPI
Not in CISA KEV
MEDIUM severity

CVE-2026-44561 — open-webui

MEDIUM

CVE-2026-44561 is a medium-severity (CVSS 5.4) CWE-863 vulnerability in open-webui. A fix is available for open-webui — see the affected versions and patch details below.

Open WebUI: Deactivated Channel Members Retain Full Access to Group/DM Channels

Also known asGHSA-hmgr-67hw-j2cqPYSEC-2026-2732
Published
Updated
Affected
1 pkg
Patched
1 / 1
Exploits
None indexed
Exploitation data as of Nov 9, 2026 · OSV.dev, NVD, FIRST.org (EPSS)

Exploitation Status

Proof-of-concept exploit code exists

  • CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.

Exploitation and automatability from CISA’s SSVC triage for CVE-2026-44561.

EPSS Exploitation Probability

via FIRST.org ↗
0.2%probability of exploitation in next 30 days
Lower Risk0.00%
Lower risk than most CVEs7th percentile — riskier than 7% of all scored CVEsHighest risk
0.00%0.25%0.51%0.76%0.0%0.2%Jun 26Sep 26Nov 26

Probability of exploitation in the next 30 days, from FIRST.org EPSS.

How urgent is this, really

Where this sits among everything scored

Real-World Exposure

1 pkg affected
🐍open-webui

Real-time download stats are indexed for npm and PyPI packages. This vulnerability affects PyPI packages — download data is not available via public APIs for these ecosystems.

Description

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.

# 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

MetricValueRationale
Attack VectorNetwork (N)Exploited remotely via API calls
Attack ComplexityLow (L)No special conditions beyond knowing the channel ID (which the user had as a former member)
Privileges RequiredLow (L)Requires a valid user account and prior channel membership
User InteractionNone (N)No victim interaction required
ScopeUnchanged (U)Impact is within the same authorization boundary (the channel)
ConfidentialityLow (L)Can read messages in a channel the user should no longer access
IntegrityLow (L)Can post, edit, and delete messages in the channel
AvailabilityNone (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:

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.

Affected Packages

1 total 1 fixed
EcosystemPackageVulnerable rangeFix
🐍PyPIopen-webuiall versions0.9.0pip install --upgrade 'open-webui==0.9.0'

Affected Products

1 product · 1 configurations
Application
open webuiopenwebui
< 0.9.0
range

Detection & mitigation playbook

Open-source dependency
  1. Detect

    Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for open-webui, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.

  2. Fix

    Update open-webui to 0.9.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-44561 is resolved across your whole dependency graph.

  3. Workarounds

    Put an independent control in front of the weakness: restrict the affected endpoint or interface to trusted networks, require an additional authentication factor or proxy-level check, and invalidate existing sessions and credentials in case the flaw has already been used.

Frequently Asked Questions

# 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 chann
O3 Security · Impact-Aware SCA

Is CVE-2026-44561 in your dependencies?

Find it across PyPI, including transitive dependencies.

CVE-2026-44561: open-webui DoS — Fixed in 0.9.0