CVE-2026-88005: Open WebUI: OAuth token exchange bypasses domain allowlist
GHSA-4qg5-cxx4-g927 MEDIUMOpen WebUI's OAuth token-exchange endpoint issues sessions for a provider access token without re-checking the email domain allowlist that the normal login callback enforces, so a user whose domain was removed from `OAUTH_ALLOWED_DOMAINS` can keep a working session instead of being locked out. This only bites deployments that have deliberately enabled `ENABLE_OAUTH_TOKEN_EXCHANGE` and restricted domains beyond the default wildcard, so exposure is narrow — but for the CISOs who did lock this down (often after an M&A, contractor offboarding, or tenant split), the control silently fails exactly when it matters. There's no CISA KEV listing, no EPSS score, and no public exploit or Nuclei template, and the flaw only preserves existing access at an existing role rather than granting new privileges or new accounts. Upgrade to Open WebUI 0.9.0, which adds the same allowlist check to the token-exchange path (commit fb5ef978b); until then, disable `ENABLE_OAUTH_TOKEN_EXCHANGE` or audit active sessions for users whose email domain no longer matches the allowlist after any offboarding event.
What is the risk?
Medium severity (CVSS 6.5, AV:N/AC:L/PR:N/UI:N/C:L/I:L/A:N) reflects a confidentiality/integrity-limited access-control gap rather than remote code execution or data destruction. Exploitability is low in practice: the endpoint requires a non-default configuration (`ENABLE_OAUTH_TOKEN_EXCHANGE=True` plus a restrictive `OAUTH_ALLOWED_DOMAINS`), a still-valid access token on the OAuth provider, and a pre-existing linked account — it cannot create accounts or escalate roles. No EPSS score, no CISA KEV entry, no public PoC, and no Nuclei template exist, indicating no known active exploitation. The realistic risk is process failure: an admin narrows the allowlist expecting immediate access revocation, but a revoked user's session-issuing path silently continues to work, undermining an intentional access-control decision without any alert.
How does the attack unfold?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Open WebUI | pip | >= 0.8.0, < 0.9.0 | 0.9.0 |
Do you use Open WebUI? You're affected.
How severe is it?
What is the attack surface?
What should I do?
1 step-
Upgrade to Open WebUI 0.9.0 or later, which applies the domain allowlist check to the token-exchange endpoint (fix commit fb5ef978b, PR #23639) and returns 403 for disallowed domains. If upgrading immediately isn't possible, set
ENABLE_OAUTH_TOKEN_EXCHANGE=False(the default) to close the second entry point entirely. For deployments that changedOAUTH_ALLOWED_DOMAINSrecently, review and revoke active sessions/API tokens for accounts whose email domain no longer matches the allowlist rather than assuming the login callback already blocked them. Going forward, treat any endpoint that issues sessions as needing the same policy checks as the primary login path, and verify this via a config/session audit after any allowlist change.
How is it classified?
Which compliance frameworks are affected?
This CVE is relevant to:
Frequently Asked Questions
What is CVE-2026-88005?
Open WebUI's OAuth token-exchange endpoint issues sessions for a provider access token without re-checking the email domain allowlist that the normal login callback enforces, so a user whose domain was removed from `OAUTH_ALLOWED_DOMAINS` can keep a working session instead of being locked out. This only bites deployments that have deliberately enabled `ENABLE_OAUTH_TOKEN_EXCHANGE` and restricted domains beyond the default wildcard, so exposure is narrow — but for the CISOs who did lock this down (often after an M&A, contractor offboarding, or tenant split), the control silently fails exactly when it matters. There's no CISA KEV listing, no EPSS score, and no public exploit or Nuclei template, and the flaw only preserves existing access at an existing role rather than granting new privileges or new accounts. Upgrade to Open WebUI 0.9.0, which adds the same allowlist check to the token-exchange path (commit fb5ef978b); until then, disable `ENABLE_OAUTH_TOKEN_EXCHANGE` or audit active sessions for users whose email domain no longer matches the allowlist after any offboarding event.
Is CVE-2026-88005 actively exploited?
No confirmed active exploitation of CVE-2026-88005 has been reported, but organizations should still patch proactively.
How to fix CVE-2026-88005?
Upgrade to Open WebUI 0.9.0 or later, which applies the domain allowlist check to the token-exchange endpoint (fix commit fb5ef978b, PR #23639) and returns 403 for disallowed domains. If upgrading immediately isn't possible, set `ENABLE_OAUTH_TOKEN_EXCHANGE=False` (the default) to close the second entry point entirely. For deployments that changed `OAUTH_ALLOWED_DOMAINS` recently, review and revoke active sessions/API tokens for accounts whose email domain no longer matches the allowlist rather than assuming the login callback already blocked them. Going forward, treat any endpoint that issues sessions as needing the same policy checks as the primary login path, and verify this via a config/session audit after any allowlist change.
What systems are affected by CVE-2026-88005?
This vulnerability affects the following AI/ML architecture patterns: LLM chat UI deployments, Enterprise SSO-integrated AI platforms, Self-hosted model-serving front-ends.
What is the CVSS score for CVE-2026-88005?
CVE-2026-88005 has a CVSS v3.1 base score of 6.5 (MEDIUM). The EPSS exploitation probability is 0.22%.
What is the AI security impact?
Affected AI Architectures
MITRE ATLAS Techniques
AML.T0012 Valid Accounts AML.T0047 AI-Enabled Product or Service Compliance Controls Affected
What are the technical details?
Original Advisory
## Summary Open WebUI's OAuth token exchange endpoint issues a session for a provider access token without applying the email domain allowlist that the normal OAuth login callback enforces. An account whose email domain the login callback would refuse could still obtain a working session through this endpoint. ## Preconditions - `ENABLE_OAUTH_TOKEN_EXCHANGE=True`. It is disabled by default, so a default deployment is not affected. - `OAUTH_ALLOWED_DOMAINS` set to something other than `*`. Deployments without a domain allowlist are not affected. - A valid, unexpired access token on the configured provider. - An Open WebUI account already linked to that provider subject, or an account with a matching email when `OAUTH_MERGE_ACCOUNTS_BY_EMAIL` is enabled. This endpoint never creates accounts, so a token for a subject with no existing account is rejected. ## Impact An admin who narrows the domain allowlist expects users outside it to lose access at their next sign-in. The login callback does deny them. Token exchange kept issuing sessions, so a user whose domain was removed retained working access as their existing account at its existing role. The endpoint cannot create an account and cannot raise anyone's role, so this grants continued access rather than new or elevated access. ## Fix fb5ef978b, released in 0.9.0, adds the same domain allowlist check to the token exchange endpoint that the login callback runs, and denies the exchange with 403 when the email domain is not allowed. Upgrading restores the check with no further action. ## Root cause The affected component is the OAuth token exchange endpoint in `backend/open_webui/routers/auths.py`, present in builds from 0.8.0 onward. The endpoint was added as a second entry point into the same session-issuing path the OAuth login callback uses, but it re-implemented only the identity lookup and not the policy checks surrounding it. The domain allowlist check lived inside the callback's own body rather than in shared code, so the second caller inherited none of it. ## Credits @Classic298
Exploitation Scenario
A vendor organization enables `ENABLE_OAUTH_TOKEN_EXCHANGE` to support a mobile or CLI client that authenticates via provider tokens, and restricts `OAUTH_ALLOWED_DOMAINS` to its own corporate domain. A contractor with an external email domain had a linked Open WebUI account from an earlier partnership. When the partnership ends, the admin removes the contractor's domain from the allowlist, expecting their next login to be denied — and it is, via the standard callback. However, the contractor (or malware holding their still-valid provider access token) calls the token-exchange endpoint directly instead of the login UI; because that endpoint never re-checks the allowlist, it issues a session anyway, letting the contractor continue querying the organization's internal LLM chat environment, connected knowledge bases, or agent tools at their prior role — undetected because no login-callback denial was ever logged.
Weaknesses (CWE)
CWE-863 — Incorrect Authorization: The product performs an authorization check when an actor attempts to access a resource or perform an action, but it does not correctly perform the check.
- [Architecture and Design] Divide the product into anonymous, normal, privileged, and administrative areas. Reduce the attack surface by carefully mapping roles with data and functionality. Use role-based access control (RBAC) [REF-229] to enforce the roles at the appropriate boundaries. Note that this approach may not protect against horizontal authorization, i.e., it will not protect a user from attacking others with the same role.
- [Architecture and Design] Ensure that access control checks are performed related to the business logic. These checks may be different than the access control checks that are applied to more generic resources such as files, connections, processes, memory, and database records. For example, a database may restrict access for medical records to a specific database user, but each record might only be intended to be accessible to the patient and the patient's doctor [REF-7].
Source: MITRE CWE corpus.
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:N/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