The get_all_models handlers in routers/openai.py and routers/ollama.py intended to cache their permission-filtered model lists per user, but the @cached decorator was misconfigured: it passed a key= lambda instead of key_builder=. In aiocache 0.12.3 (the pinned version), key= is a static cache key — a callable passed there is used as a constant object, not invoked per call. As a result the per-user key was never computed, and all callers collided onto a single shared cache entry within the TTL window. During that window, one user's permission-filtered model list could be served to a different authenticated user, crossing the per-user authorization boundary.
MODELS_CACHE_TTL (default 1 second), and the attacker cannot select the victim or force a target's list into the cache.backend/open_webui/routers/openai.py — get_all_models (~line 488)backend/open_webui/routers/ollama.py — get_all_models (~line 302)Both decorated with @cached(ttl=MODELS_CACHE_TTL, key=lambda ...). No other @cached(... key=lambda ...) misuse was found elsewhere in the backend.
aiocache 0.12's @cached treats key= as a static key; the per-call hook is key_builder= with signature key_builder(func, *args, **kwargs). Passing a...
0.10.0Exploitability
AV:NAC:HPR:LUI:NScope
S:CImpact
C:LI:NA:N3.5/CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:N/A:N