CVE-2026-59219: Open WebUI: Realtime endpoints accept Redis-revoked JWTs after signout/backchannel logout
Summary
With Redis configured, Open WebUI supports JWT revocation: POST /api/v1/auths/signout (per-token jti) and OIDC back-channel logout (per-user revokedat) record revocations in Redis, and HTTP auth (getcurrentuser) rejects revoked tokens with 401. The realtime authentication surfaces do not perform this check: Socket.IO connect / user-join / join-channels / join-note and the terminal websocket first-message auth validate tokens with decodetoken() only (signature + expiry). A JWT revoked by sign-out or back-channel logout therefore continues to authenticate new realtime connections, even though the same token is rejected on HTTP.
Affected component
- backend/openwebui/socket/main.py — Socket.IO connect, user-join, join-channels, join-note - backend/openwebui/routers/terminals.py — terminal websocket first-message auth - backend/openwebui/utils/auth.py — the revocation check was applied to HTTP only
Root cause
HTTP auth enforces revocation:
python utils/auth.py — getcurrentuser if data.get('jti') and not await isvalidtoken(request, data): raise HTTPException(statuscode=401, detail='Invalid token')
Realtime auth calls decodetoken() only, which verifies signature + expiry but never consults the Redis revocation keys ({prefix}:auth:token:{jti}:revoked, {prefix}:auth:user:{id}:revokedat):
python socket/main.py — connect / user-join / join-channels / join-note data = decodetoken(auth['token']) routers/terminals.py — resolveauthenticatedconnection data = decodetoken(token)
Impact
A JWT revoked by user sign-out or OIDC back-channel logout still authenticates new realtime connections. A stolen token therefore retains realtime access after the victim signs out or the IdP performs back-channel logout — the very remediation for a compromised token. The token can populate SESSIONPOOL as the victim, join their user/channel/note rooms (receiving realtime channel messages, collaborative-note updates and presence), drive socket-level collaboration as the victim, and pass terminal websocket authentication when terminal servers are configured. HTTP remains correctly protected (401), so REST data and state-changing REST endpoints are not reachable with the revoked token.
Proof of Concept
Reporter PoC on a Redis-backed deployment (v0.9.6 and main): after POST /api/v1/auths/signout, HTTP returns 401 for the token while a Socket.IO user-join with the same token still authenticates, and the terminal WS reaches terminal-server lookup rather than rejecting it as Invalid token.
Fix
Apply the revocation check on the realtime paths. The logic is factored into istokenrevoked(redis, decoded) (covering per-token jti and per-user revokedat); the Socket.IO handlers and the terminal WS reject tokens that fail it, using the main app Redis where revocations are stored. HTTP isvalidtoken delegates to the same helper, so HTTP behaviour is unchanged.
Affected / Patched
- Affected: >= 0.9.0, < 0.10.0, and only when Redis is configured (without Redis, per-token revocation is not supported and sign-out does not invalidate JWTs by design). - Patched: v0.10.0. The revocation check (isvalidtoken, covering per-token jti and per-user revokedat) is applied on Socket.IO connect / user-join / join-channels / join-note and the terminal websocket first-message auth, using the main app Redis where revocations are stored. HTTP isvalidtoken delegates to the same logic, so HTTP behaviour is unchanged.
Other sources
Open WebUI is an extensible, feature-rich, and user-friendly self-hosted AI platform. From 0.9.0 before 0.10.0 with Redis configured, Socket.IO connect, user-join, join-channels, join-note, and the terminal websocket first-message authentication used decodetoken without the Redis-backed isvalidtoken revocation check, allowing revoked JWTs to continue authenticating realtime connections. This issue is fixed in version 0.10.0.
— MITRE
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
pip/open-webuito a version that resolves this vulnerability.Fixed in 0.10.0 - Upgrade
Upgrade to a fixed release to a version that resolves this vulnerability.
Fixed in 0.10.0 - Configuration
Apply the Redis-backed JWT revocation check on all realtime paths: in backend/open_webui/socket/main.py for Socket.IO connect, user-join, join-channels, and join-note, and in backend/open_webui/routers/terminals.py for the terminal websocket first-message auth. Ensure these handlers validate tokens using the Redis-backed revocation logic (per-token jti and per-user revoked_at via is_valid_token / is_token_revoked), rather than using decode_token() alone.
Open WebUI (realtime auth paths: Socket.IO connect/user-join/join-channels/join-note and terminal websocket first-message auth) JWT revocation check = use Redis-backed is_valid_token / is_token_revoked instead of decode_token-only
Event History
Frequently Asked Questions
What is the severity of CVE-2026-59219?
CVE-2026-59219 has a severity rating of 7.1, classified as high.
How do I fix CVE-2026-59219?
To remediate CVE-2026-59219, apply the patch available in version 0.10.0 of Open WebUI.
What does CVE-2026-59219 affect?
CVE-2026-59219 affects Open WebUI versions from 0.9.0 to before 0.10.0 when configured with Redis.
What are the potential risks of CVE-2026-59219?
The risks of CVE-2026-59219 include unauthorized access since it allows the acceptance of Redis-revoked JWTs after user signout.
When was CVE-2026-59219 published?
CVE-2026-59219 was published on July 9, 2026.