Open WebUI: Realtime endpoints accept Redis-revoked JWTs after signout/backchannel logout
High7.1CVE-2026-59219 · Published Jul 24, 2026 · updated Aug 4, 2026
Affected versions
| Package | Affected | Fixed in |
|---|---|---|
| open-webui PyPI | >= 0.9.0, < 0.10.0 | 0.10.0 |
Details and references
## Summary With Redis configured, Open WebUI supports JWT revocation: `POST /api/v1/auths/signout` (per-token `jti`) and OIDC back-channel logout (per-user `revoked_at`) record revocations in Redis, and HTTP auth (`get_current_user`) 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 `decode_token()` 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/open_webui/socket/main.py` , Socket.IO `connect`, `user-join`, `join-channels`, `join-note` - `backend/open_webui/routers/terminals.py` , terminal websocket first-message auth - `backend/open_webui/utils/auth.py` , the revocation check was applied to HTTP only ## Root cause HTTP auth enforces revocation: ```python # utils/auth.py , get_current_user if data.get('jti') and not await is_valid_token(request, data): raise HTTPException(status_code=401, detail='Invalid token') ``` Realtime auth calls `decode_token()` only, which verifies signature + expiry but never consults the Redis revocation keys (`{prefix}:auth:token:{jti}:revoked`, `{prefix}:auth:user:{id}:revoked_at`): ```python # socket/main.py , connect / user-join / join-channels / join-note data = decode_token(auth['token']) # routers/terminals.py , _resolve_authenticated_connection data = decode_token(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 `SESSION_POOL` 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 `is_token_revoked(redis, decoded)` (covering per-token `jti` and per-user `revoked_at`); the Socket.IO handlers and the terminal WS reject tokens that fail it, using the main app Redis where revocations are stored. HTTP `is_valid_token` 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 (`is_valid_token`, covering per-token `jti` and per-user `revoked_at`) 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 `is_valid_token` delegates to the same logic, so HTTP behaviour is unchanged.
- CVSS 3.1
- CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N
- Severity from
- GitHub (reviewed advisory)
- Weakness
- CWE-613
- Also known as
- CVE-2026-59219, PYSEC-2026-3595
More Open WebUI advisories
All Open WebUI| Date | Advisory | Severity | Fixed in |
|---|---|---|---|
| Jul 23 | Open WebUI's API key endpoint restrictions bypassed via `x-api-key` header , full message processing on restricted endpoints CVE-2026-45339Medium6.5fixed in 0.9.0 | Medium6.5 | 0.9.0 |
| Jul 24 | Open WebUI: Stored web worker XSS via Pyodide CVE-2026-59214High7.3fixed in 0.10.0 | High7.3 | 0.10.0 |
| Jul 24 | Open WebUI: Account enumeration via observable login timing discrepancy CVE-2026-59218Medium5.3fixed in 0.10.0 | Medium5.3 | 0.10.0 |
| Jul 24 | Open WebUI: Scheduled automations continue after pending-user deactivation and stored model ACL revocation CVE-2026-59226Low3.1fixed in 0.10.0 | Low3.1 | 0.10.0 |
| Jul 24 | Open WebUI: ReDoS in skill-mention regexes causes whole-instance DoS on default config CVE-2026-59220Medium6.5fixed in 0.10.0 | Medium6.5 | 0.10.0 |
| Jul 24 | Open WebUI: POST /api/v1/images/edit bypasses the global image-edit switch and the per-user image-generation permission CVE-2026-59227Medium4.3fixed in 0.10.0 | Medium4.3 | 0.10.0 |