Severity by source
AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:H/A:N
Primary rating from GitHub Advisory · only source for this CVE.
CVSS VectorGitHub Advisory
Lifecycle Timeline
3DescriptionGitHub Advisory
Redis Cache Keys tool_servers and terminal_servers Missing Instance Prefix Enable Cross-Instance Cache Poisoning
Affected Component
Tool server and terminal server Redis cache:
backend/open_webui/utils/tools.py(line 841, tool_servers SET)backend/open_webui/utils/tools.py(line 850, tool_servers GET)backend/open_webui/utils/tools.py(line 976, terminal_servers SET)backend/open_webui/utils/tools.py(line 986, terminal_servers GET)
Affected Versions
Current main branch (commit 6fdd19bf1) and likely all versions since the tool server / terminal server Redis cache was introduced.
Description
Open WebUI uses a REDIS_KEY_PREFIX (default open-webui) to namespace Redis keys, allowing multiple instances to safely share a single Redis backend. Every Redis key in the codebase uses this prefix - except the tool_servers and terminal_servers keys in utils/tools.py, which use bare key names.
When two or more Open WebUI instances share a Redis database (a supported and documented deployment pattern, e.g., for multi-region deployments, blue-green setups, or cluster topologies), the unprefixed keys collide. An admin on Instance A writing to tool_servers overwrites the value read by Instance B - causing Instance B's users to receive Instance A's tool server configuration.
# utils/tools.py - unprefixed keys (problem)
await request.app.state.redis.set('tool_servers', ...)
# line 841
json.loads(await request.app.state.redis.get('tool_servers'))
# line 850
await request.app.state.redis.set('terminal_servers', ...)
# line 976
json.loads(await request.app.state.redis.get('terminal_servers'))
# line 986
# Every other Redis key in the codebase - prefixed (correct pattern)
f'{REDIS_KEY_PREFIX}:auth:token:{jti}:revoked'
f'{REDIS_KEY_PREFIX}:ratelimit:{email}:{bucket}'
f'{REDIS_KEY_PREFIX}:tasks:commands'Attack Scenario
Two Open WebUI instances (A and B) share a Redis backend - a supported deployment for multi-region setups, blue-green deployments, or hot-standby. Both instances have their own admin accounts; the shared Redis was chosen for coordinated session handling, rate limiting, and task management.
- Attacker is an admin on Instance A (a legitimately provisioned admin, or one that escalated via any available path including the LDAP empty-password or stale-admin-role findings).
- Attacker on Instance A configures a tool server pointing to
https://attacker-controlled.example.com/openapi.json. This triggersutils/tools.py:841to write the new tool server list under the bare keytool_servers. - Instance B's users query tools. Instance B reads from
tool_servers(line 850) - gets Instance A's poisoned list, which now includes the attacker's server alongside or instead of Instance B's legitimate tool servers. - Instance B's users invoke tools through the model's context. The attacker's server receives tool call payloads containing: chat content, user identity, OAuth tokens scoped to the tool server (if the user has bound their external account), and in-flight conversation context.
- The attacker's server returns arbitrary tool responses, which are fed back into Instance B's LLM context as "trusted tool output" - enabling prompt injection, misinformation delivery, and further data exfiltration cascades.
The same cross-instance poisoning applies to terminal_servers.
Impact
- Cross-instance cache poisoning: an admin on one instance affects all users of another instance sharing the Redis backend
- Data exfiltration: tool call payloads contain chat content and user identity, delivered to the attacker's server
- Prompt injection delivery: attacker-returned tool responses enter the victim instance's LLM context as trusted data
- Undermines the multi-instance isolation guarantee that
REDIS_KEY_PREFIXwas introduced to provide - Silent failure mode: no error is raised; the victim instance sees a valid, signed cache entry and has no way to detect it came from a different instance
Preconditions
- Multiple Open WebUI instances share a single Redis backend (a supported and documented deployment)
- Attacker has admin access on one of the instances (or escalates to admin via any available path)
AnalysisAI
Cross-instance cache poisoning in Open WebUI allows administrators on one instance to inject malicious tool server configurations into shared Redis cache, affecting users on other instances. The vulnerability stems from missing Redis key prefixes on tool_servers and terminal_servers cache entries in backend/open_webui/utils/tools.py. When multiple Open WebUI instances share a Redis backend (a documented multi-region/blue-green deployment pattern), an admin on Instance A can configure a malicious tool server that overwrites Instance B's cache, causing Instance B users to send tool call payloads-containing chat content, user identity, and OAuth tokens-to attacker-controlled servers. Exploitation requires privileged access (CVSS PR:H) but crosses instance boundaries (Scope:Changed), enabling data exfiltration and prompt injection delivery. Vendor-released patch: version 0.9.0 addresses the missing prefix issue.
Technical ContextAI
Open WebUI is a Python-based LLM frontend application using Redis for distributed caching and session management. The application implements a REDIS_KEY_PREFIX (default 'open-webui') to namespace Redis keys, enabling multiple isolated instances to safely share a single Redis backend-a pattern explicitly supported for multi-region deployments, blue-green environments, and cluster topologies. The vulnerability (CWE-668: Exposure of Resource to Wrong Sphere) exists in backend/open_webui/utils/tools.py at lines 841, 850, 976, and 986, where tool_servers and terminal_servers cache keys are written and read using bare string literals ('tool_servers', 'terminal_servers') instead of the prefixed pattern (f'{REDIS_KEY_PREFIX}:tool_servers') used consistently elsewhere in the codebase for auth tokens, rate limits, and task queues. This inconsistency breaks Redis key namespace isolation, allowing cache entries from one instance to collide with and overwrite entries from another. The affected package is distributed via PyPI as pip/open-webui, with CPE string pkg:pip/open-webui identifying the vulnerable component.
RemediationAI
Upgrade to Open WebUI version 0.9.0 or later, which addresses the missing Redis key prefix issue per vendor advisory GHSA-3x8w-4f7p-xxc2 available at https://github.com/open-webui/open-webui/security/advisories/GHSA-3x8w-4f7p-xxc2. The fix applies the standard REDIS_KEY_PREFIX pattern to tool_servers and terminal_servers cache keys, restoring namespace isolation in multi-instance deployments. For organizations unable to upgrade immediately, deploy each Open WebUI instance with a dedicated Redis backend to eliminate cross-instance cache poisoning risk-this workaround trades operational complexity (multiple Redis instances requiring separate management, backup, and monitoring) for isolation but negates the shared-cache benefits for legitimate use cases like coordinated rate limiting and session management. Alternatively, configure unique REDIS_KEY_PREFIX values per instance if the application supports runtime override (verify in version-specific documentation), though this may not fully mitigate if the bare key names in vulnerable code bypass the prefix mechanism entirely. Audit admin account provisioning across all instances sharing Redis to limit exposure surface, and monitor Redis for unexpected tool_servers or terminal_servers key modifications as a detection control until patching is complete.
Wazuh SIEM platform versions 4.4.0 through 4.9.0 contain an unsafe deserialization vulnerability in the DistributedAPI t
BentoML version 1.4.2 and earlier contains an unauthenticated remote code execution vulnerability through insecure deser
pgAdmin 4 contains critical remote code execution vulnerabilities in the Query Tool download and Cloud Deployment endpoi
The renderLocalView function in render/views.py in graphite-web in Graphite 0.9.5 through 0.9.10 uses the pickle Python
BentoML is a Python library for building online serving systems optimized for AI apps and model inference. Rated critica
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
pyLoad download manager version prior to 0.5.0b3.dev77 exposes the Flask SECRET_KEY through an unauthenticated endpoint.
Langflow (a visual LLM pipeline builder) contains a critical unauthenticated code execution vulnerability (CVE-2026-3301
In Mercurial before 4.1.3, "hg serve --stdio" allows remote authenticated users to launch the Python debugger, and conse
Unauthenticated remote code execution affects Kestra OSS (the open-source event-driven orchestration platform) prior to
Unauthenticated remote code execution in Marimo ≤0.20.4 allows attackers to execute arbitrary system commands via the `/
pyLoad is the free and open-source Download Manager written in pure Python. Rated medium severity (CVSS 5.3), this vulne
Same weakness CWE-668 – Exposure of Resource to Wrong Sphere
View allSame technique Information Disclosure
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-30609
GHSA-3x8w-4f7p-xxc2