CVE-2026-44558 — open-webui
MEDIUMCVE-2026-44558 is a medium-severity (CVSS 5.4) CWE-862 vulnerability in open-webui. A fix is available for open-webui — see the affected versions and patch details below.
Open WebUI: Channel Access Grants Bypass filter_allowed_access_grants
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-44558.
EPSS Exploitation Probability
EPSS (Exploit Prediction Scoring System) is a daily probability model maintained by FIRST.org. It estimates the likelihood a CVE will be exploited in production environments within the next 30 days, derived from real-world threat intelligence signals.
How urgent is this, really
CVE-2026-44558 plotted by exploitation likelihood (EPSS) against impact (CVSS). The shaded corner — EPSS 50%+ and CVSS 7.0+ — is where this CVE doesn't sit, though severity or exploitability alone can still warrant action.
Where this sits among everything scored
Of 378,567 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Real counts from FIRST.org, not a sample — log-scaled since the landscape is heavily right-skewed.
Real-World Exposure
open-webuiReal-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
Channel Access Grants Bypass filter_allowed_access_grants
Affected Component
Channel creation and update endpoints:
backend/open_webui/routers/channels.py(lines 291-340,create_new_channel)backend/open_webui/routers/channels.py(lines 617-638,update_channel_by_id)backend/open_webui/models/channels.py(lines 825-826,set_access_grantscall without filtering)
Affected Versions
Current main branch (commit 6fdd19bf1) and likely all versions supporting user-created group channels with access grants.
Description
All resource routers in Open WebUI (knowledge, models, notes, prompts, tools, skills) call filter_allowed_access_grants() before persisting access grants. This function strips principal_id: "*" wildcard grants from users who lack the relevant sharing.public_* permission, and strips individual user grants from users who lack access_grants.allow_users permission.
The channel router does not call filter_allowed_access_grants on either create or update paths. A non-admin user who can create group channels (or who owns a channel) can submit arbitrary access grants — including public wildcard grants — and those grants are stored verbatim, bypassing the admin's permission framework.
# channels.py — access_grants from form data flow directly into persistence
# No call to filter_allowed_access_grants() anywhere in these paths.
# Compare with knowledge.py / models.py / notes.py / prompts.py / tools.py / skills.py,
# all of which do:
# form_data.access_grants = filter_allowed_access_grants(user, form_data.access_grants)
# before creating or updating.
Attack Scenario
- Admin configures permissions so that regular users do NOT have
sharing.public_channels— public sharing of channels is intended to be admin-only. - Attacker (a regular user) creates or owns a group channel.
- Attacker sends:
POST /api/v1/channels/ { "name": "public-channel", "type": "group", "access_control": { "access_grants": [ {"principal_type": "user", "principal_id": "*", "permission": "read"} ] } } set_access_grantsis called directly withoutfilter_allowed_access_grants— the wildcard grant is persisted.- The channel becomes publicly readable to every user on the instance, despite the admin's policy prohibiting public channels for regular users.
The same attack works via POST /api/v1/channels/{id}/update for any channel the attacker owns.
Impact
- Regular users can bypass the
sharing.public_channelspermission and make channels publicly accessible - Regular users can bypass
access_grants.allow_usersto grant individual-user access in environments where only group-based sharing is intended - Admin's permission framework for channels is silently ineffective
- Creates an inconsistency with every other resource type in the codebase, making the security posture harder to reason about
Preconditions
- Attacker must have an account with the ability to create group channels (default user capability), or ownership of an existing channel
- Admin must have configured restrictive sharing permissions for regular users (otherwise there's no policy to bypass)
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐍PyPI | open-webui | all versions | 0.9.0pip install --upgrade 'open-webui==0.9.0' |
Detection & mitigation playbook
Open-source dependencyDetect
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.
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-44558 is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 Security's impact-aware SCA analyses which vulnerable code paths your application actually calls, so a match like CVE-2026-44558 can be triaged on real exposure rather than presence alone.
Tailored to CVE-2026-44558. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is CVE-2026-44558 in your dependencies?
O3 Security finds CVE-2026-44558 across PyPI dependencies, including transitive ones, and its impact-aware SCA ranks findings by whether your code actually calls the vulnerable path.