Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:L
PR:L for required authentication; I:L added over NVD vector because unauthorized file writes to operator storage constitute an integrity impact absent from the original scoring.
Primary rating from Vendor (https://github.com/open-webui/open-webui).
CVSS VectorVendor: https://github.com/open-webui/open-webui
Lifecycle Timeline
2DescriptionCVE.org
Summary
An authenticated user whose features.image_generation permission has been revoked can still make the server generate images by sending the feature flag in a chat-completion request. The chat pipeline took the client-supplied features object at face value and never re-checked the permission that the direct image routes enforce, so the denial applied to the UI affordance but not to the server-side generation path.
Preconditions
Image generation must be enabled and a provider configured by the administrator (ENABLE_IMAGE_GENERATION is off by default). The per-user permission defaults to granted, so only deployments where an administrator explicitly revoked it for some users are affected. On 0.10.0 and later the caller must also set params.function_calling to legacy; on 0.9.x and earlier the legacy mode was the default, so no special parameter was needed. Deployments on native function calling are unaffected, since that path checks the permission before registering the image tools.
Impact
A user the administrator has explicitly denied image generation can consume the operator's configured provider through the chat API, spending the operator's API credits and provider quota and writing generated files to the operator's storage. Where an image is present in the conversation and image editing is enabled, the same handler reaches the image-edit provider as well. No provider credentials are exposed, and no other user's data is reachable.
Fix
Fixed in 897d69a (#26703). The legacy chat-features block now re-checks features.image_generation against the caller's permissions before invoking the image handler, matching the check the direct image routes and the native function-calling path already performed.
Root cause
The chat-completions endpoint stored the request's features object into request metadata, and process_chat_payload in the chat middleware dispatched to the image handler purely on the truthiness of that client-supplied flag. Permission enforcement lived on the two surfaces that were reached from the UI, the direct /images/generations and /images/edit routes and the native function-calling tool registration, and was simply absent on the legacy chat path. The flag was treated as a statement of user intent, which it is, rather than as an authorization decision, which the handler behind it made it.
Credits
@DavidCarliez, for identifying that the chat pipeline honours the client-supplied image-generation feature flag without re-checking the permission.
AnalysisAI
Open WebUI versions 0.7.0 through 0.10.x fails to re-validate the features.image_generation permission on the legacy chat-completions code path, allowing an authenticated user whose image generation rights were explicitly revoked to bypass the restriction by supplying the feature flag directly in a chat API request. This affects only deployments where an administrator has both enabled ENABLE_IMAGE_GENERATION and explicitly revoked per-user image generation rights - a non-default, deliberately restricted configuration. The result is unauthorized consumption of the operator's configured image provider API credits and quota, and unauthorized writes of generated files to the operator's storage; no public exploit has been identified at time of analysis.
Technical ContextAI
Open WebUI is a self-hosted LLM chat interface distributed as a Python pip package (pkg:pip/open-webui). The root cause is CWE-862 (Missing Authorization): the process_chat_payload function in backend/open_webui/utils/middleware.py dispatched to chat_image_generation_handler based solely on the truthiness of the client-supplied features.image_generation flag embedded in the request body, without invoking has_permission('features.image_generation') against the server-side user record. The direct /images/generations and /images/edit routes and the native function-calling tool registration path both enforced this check correctly; the gap existed exclusively on the legacy chat path, which is the default behavior on 0.9.x and earlier and can be explicitly selected on 0.10.0+ via params.function_calling=legacy. The fix in commit 897d69a wraps the legacy dispatch block in an admin-role check or has_permission call, matching the enforcement model already present on the other two surfaces.
RemediationAI
Upgrade to Open WebUI 0.11.0 or later; this release contains the fix from commit 897d69a (PR #26703), which adds a has_permission('features.image_generation') guard in process_chat_payload before the legacy image handler dispatch, matching the enforcement already present on the direct image routes and native function-calling path. The release is available at https://github.com/open-webui/open-webui/releases/tag/v0.11.0. If immediate upgrade is not possible, two compensating controls apply: (1) set the deployment's function-calling mode to native rather than legacy - the native path already enforces permissions and is unaffected, though this may alter tool-use behavior for existing chat sessions; (2) disable image generation entirely by setting ENABLE_IMAGE_GENERATION=false, which removes the affected handler from the pipeline entirely with no side effect beyond losing image generation for all users. Do not rely on UI-layer permission revocation alone as a security boundary on unpatched versions.
Same weakness CWE-862 – Missing Authorization
View allSame technique Authentication Bypass
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-52889
GHSA-g423-grf7-98rv