CVE-2026-70490 is a role-based access control bypass in Open WebUI's terminal endpoint. The WebSocket handler verifies the JWT token correctly but omits the role enforcement that HTTP terminal routes apply. This means users in 'pending' status—registered accounts awaiting approval, or active accounts demoted back to pending—can establish WebSocket terminal sessions despite being explicitly unauthorized for terminal access.
The vulnerability exists in version 0.8.8 through versions prior to 0.11.0, where the fix adds the missing role check to the WebSocket handler. The CVSS score reflects the limited exploitation surface: you need a pending account, at least one configured terminal server, and access grants covering that account. But the architectural problem runs deeper than exploitation difficulty.
What makes this worth your attention is the transport-layer parity failure. The HTTP and WebSocket paths share the same JWT verification code, but the role gate lives at a different abstraction layer—one handled by a decorator in HTTP, requiring manual invocation in WebSocket. When the WebSocket handler was implemented, the developer likely copied the authentication pattern without recognizing that get_verified_user bundles authentication with authorization. This is a recurring mutation in Python web frameworks: new transport implementations inherit authentication checks but miss authorization assumptions baked into the original handlers.
The pending role itself is the real architectural smell. It conflates two distinct security postures—an unapproved registrant with no system trust, and a deactivated account that retains identity persistence and possibly elevated trust in adjacent systems. Blocking pending accounts uniformly at the transport layer solves the bypass but consolidates this semantic overload. Future handlers that need to distinguish between these states will face the same incomplete fix.
Audit your codebase for handlers that verify JWT tokens but skip role gates. The testing gap here wasn't missing test cases for pending accounts on HTTP routes—it was the absence of a review item for transport-layer parity. Add a checklist item: verify authorization enforcement across all entry points for the same authenticated user.