Tool server and terminal server Redis cache:
- backend/open_webui/utils/tools.py (line 841, toolservers SET)
- backend/open_webui/utils/tools.py (line 850, toolservers GET)
- backend/open_webui/utils/tools.py (line 976, terminalservers SET)
- backend/open_webui/utils/tools.py (line 986, terminalservers GET)
Current main branch (commit 6fdd19bf1) and likely all versions since the tool server / terminal server Redis cache was introduced.
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'
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.
https://attacker-controlled.example.com/openapi.json. This triggers utils/tools.py:841 to write the new tool server list under the bare key tool_servers.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.The same cross-instance poisoning applies to terminal_servers.
REDIS_KEY_PREFIX was introduced to provide{
"github_reviewed": true,
"severity": "HIGH",
"github_reviewed_at": "2026-05-08T19:44:40Z",
"nvd_published_at": "2026-05-15T20:16:46Z",
"cwe_ids": [
"CWE-668"
]
}