Os manipuladores `get_all_models` em `routers/openai.py` e `routers/ollama.py` pretendiam esconder as suas listas de modelos **permissão- filtrada** por usuário, mas o decorador `@ cached` foi mal configurado: passou por um lambda `key=` em vez de `key_builder=`. Em aiocache 0.12.3 (a versão pinned), `key=` é uma chave cache **stática** — uma chamada é usada como um objeto constante, não invocado por chamada. Como resultado, a chave por usuário nunca foi calculada, e todos os chamadores colidiram com uma única entrada de cache compartilhada dentro da janela TTL. Durante essa janela, a lista de modelos filtrados por permissão de um usuário pode ser servida a um usuário autenticado diferente, cruzando o limite de autorização por usuário. - **Limite cruzado:** Confidencialidade (inter- usuário). Um chamador pode receber a lista de modelos com um principal de segurança *diferente* do que eles próprios. - Um usuário (ou administrador, ou — dependendo da atingência do endpoint — um chamador anônimo) que povoa o cache faz com que o próximo chamador dentro do TTL receba *que* lista em vez de seu próprio filtro de permissão. - O que está revelado é o conjunto de modelos que outro principal pode acessar, incluindo potencialmente a existência e nomeação de modelos restritos do usuário receptor. - Exposição é ** incidente e dependente do tempo**, não controlado pelo atacante: a entrada vazada é qualquer que seja o chamador mais recente povoado dentro de `MODELS_CACHE_TTL` (default 1 segundo), e o atacante não pode selecionar a vítima ou forçar a lista de um alvo para o cache. ## Componente afetado. - `backend/open_webui/routers/openai.py` — `get_all_models` (~line 488 ) - `backend/open_webui/routers/ollama.py` — `get_all_models` (~line 302 ).
Ambos decorados com `@ cached(ttl=MODELS_CACHE_TTL, key=lambda...)`. Nenhum outro uso indevido `@ cached(... key=lambda...)` foi encontrado em outro lugar na infraestrutura. aiocache 0.12 's `@ cached` trata `key=' como uma chave estática; o gancho por chamada é `key_builder=' com a assinatura `key_builder(func, *args, **kwargs)'. Passar um chamado para `key=` usa o próprio objeto chamado como uma chave constante, então cada invocação resolvida para a mesma entrada e o nomespacing por 'user.id' pretendido nunca ocorreu.
Reprodução (configuração predefinida). 1. Em uma implantação padrão, configure pelo menos dois usuários com permissões de acesso a modelos *diferentes* (por exemplo, um modelo restrito ao usuário A). 2. Como usuário A, solicite a lista de modelos (popula a entrada de cache compartilhada). 3. Dentro de ` MODELS_CACHE_TTL` (por omissão 1 s), como usuário B, solicite a lista de modelos. 4. O usuário B recebe a lista filtrada por permissão do usuário A, incluindo os modelos B não é permitido ver. Substituir `key=` com `key_builder=` em ambos os locais de chamada e ajustar o lambda para tomar a função como seu primeiro argumento:.
```python @cached( ttl=MODELS_CACHE_TTL, key_builder=lambda _func, request, user=Nenhum: ( f'openai_all_models_{user.id}' se o usuário mais 'openai_all_models' ), ) ``` Registro de aconselhamento: GHSA- 3 wp 3 - xxj 9 - 5 jqq. Identificadores relacionados: CVE- 2026 - 59213.
Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 24 T 17: 03: 21.000 Z e lista a sua última modificação como 2026 - 07 - 24 T 17: 03: 21.000 Z. Severidade: LOW. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:H/PR:L/UI:N/S:C/C:L/I:N/A:N.
Informações sobre software e versão afetadas: Pacote PyPI open-webui — ECOSISTEM: introduzido 0.6.27, corrigido 0.10.0. Classificação e evidência: identificadores de fraqueza CWE- 524. O registro contém 6 suporte de referências nestes tipos: WEB, AVISO, EMBALAGAMENTO.