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 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.IOconnect,user-join,join-channels,join-notebackend/open_webui/routers/terminals.py— terminal websocket first-message authbackend/open_webui/utils/auth.py— the revocation check was applied to HTTP only
Root cause
HTTP auth enforces revocation:
# 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):
# 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-tokenjtiand per-userrevoked_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. HTTPis_valid_tokendelegates to the same logic, so HTTP behaviour is unchanged.
Betroffene Software
Klicken Sie auf eine Technologie, um alle zugehörigen Schwachstellen anzuzeigen.
| Plattform | Paket | Anfällige Versionen | Behoben in |
|---|---|---|---|
| Python (PyPI) | open-webui | >= 0.9.0, < 0.10.0 | 0.10.0 |
Verweise
- https://github.com/open-webui/open-webui/security/advisories/GHSA-855v-hq7w-jmjw
- https://nvd.nist.gov/vuln/detail/CVE-2026-59219
- https://github.com/open-webui/open-webui/commit/33b91bd8ae8a100a5a306c91441a7d0b422c4cde
- https://github.com/open-webui/open-webui
- https://github.com/open-webui/open-webui/releases/tag/v0.10.0
- https://pypi.org/project/open-webui
- https://github.com/advisories/GHSA-855v-hq7w-jmjw
- CVSS-Vektor
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:N- Schwäche (CWE)
CWE-613- Plattform
- Python (PyPI)
- Paket
open-webui- Veröffentlicht
- 24.07.2026
- Aktualisiert
- 11.10.2026 14:19
Quellen und Lizenzen
OSV / GitHub Advisory Database - PYSEC-2026-3595 - PyPA Advisory Database; CC BY 4.0
OSV / GitHub Advisory Database - GHSA-855v-hq7w-jmjw - CC BY 4.0
Schwachstellenhistorie: open-webui
Alle veröffentlichten Schwachstellen dieses Pakets (Python (PyPI)), neueste zuerst. Zeigt, ob es ein einmaliger Ausrutscher ist oder ein Paket, das man im Auge behalten muss.
- Einträge insgesamt
- 161
- Erste → letzte
- 08.2024 09.2026
- Ohne Fix
- 11
- In Angriffen ausgenutzt
- 0
Verteilung nach Schweregrad
- Kritisch 1
- Hoch 77
- Mittel 75
- Niedrig 8
Veröffentlichungen pro Jahr
- 2024: 3
- 2025: 21
- 2026: 137
-
Open WebUI: Realtime endpoints accept Redis-revoked JWTs after signout/backchannel logout dieser Eintrag
Erkennen Sie Schwachstellen in Ihrer Anwendung
Mit der DockRay-Integration und aktivierter Softwareinventarisierung prüft DockRay gemeldete Komponentenversionen auf bekannte Schwachstellen und benachrichtigt Sie über bestätigte Treffer. Die Abdeckung hängt von der unterstützten Technologie und den verfügbaren Meldungen ab.