Resumen
Un usuario autenticado sin privilegios de administrador que tenga acceso de lectura a un modelo envoltorio de arena puede alcanzar un modelo subyacente restringido a través de endpoints de tareas como /api/v1/tasks/moa/completions.
La ruta de chat normal resuelve los modelos de arena antes del despacho final y, por tanto, vuelve a verificar el modelo subyacente seleccionado. Las rutas de tareas invocan utils.chat.generate_chat_completion() directamente. En esa ruta directa, la resolución de fallback de arena ocurre después de la verificación de acceso al envoltorio y luego recursa con bypass_filter=True, omitiendo la verificación de acceso del submodelo seleccionado.
Detalles Técnicos
El comportamiento actual de control de acceso a modelos de Open WebUI ya deniega el acceso directo al modelo restringido. La ruta de chat normal también deniega el modelo restringido seleccionado tras el preprocesamiento de arena. La ruta del endpoint de tareas es inconsistente con ese comportamiento protegido porque alcanza el mismo modelo restringido únicamente a través del fallback directo de arena y la recursión con bypass_filter=True.
Este reporte no depende de configuración maliciosa del proveedor, herramientas o funciones creadas por el usuario, ni de ejecución directa de código. El límite cruzado es la autorización de lectura de modelos.
Aunque el envoltorio de arena debe ser legible por el usuario, esto no es simplemente una afirmación de configuración del tipo "el administrador expuso un modelo restringido". La misma arena configurada es denegada por el control del postpreprocesador de chat normal una vez que el modelo restringido seleccionado es el destino del despacho. El bypass es específico de los endpoints de tareas que omiten ese preprocesador y entran en el resolvedor de fallback de arena.
La documentación oficial también apunta a esta interpretación:
- Open WebUI documenta el control de acceso a modelos como una funcionalidad que restringe los modelos a usuarios o grupos específicos.
- La documentación de modelos de workspace trata el caso "envoltorio verificado, modelo subyacente restringido alcanzado" como control de acceso roto y recomienda entradas independientes para despliegues curados.
- La documentación de evaluación describe el modo arena como una funcionalidad de evaluación y comparación que selecciona modelos aleatoriamente para comparar, no como una funcionalidad que otorga acceso a modelos que de otro modo estarían restringidos.
- Este no es un reporte de acción de administrador insegura: la misma restricción de acceso a modelos prevista se aplica en la ruta directa del modelo y en el control del modelo seleccionado en el chat normal, y solo se elude a través del orden de llamada del endpoint de tareas.
Prueba de Concepto
La prueba de concepto local adjunta no inicia un servidor ni contacta ningún proveedor de modelos. Importa el endpoint de tareas actual de Open WebUI y reemplaza el despacho al proveedor y las verificaciones de acceso a modelos con stubs locales para que el grafo de llamadas pueda observarse de forma segura.
Resultado observado:
| Caso | Esperado | Real |
|---|---|---|
Solicitud de tarea directa con model=restricted-model | Denegado antes del despacho al proveedor | Denegado; sin llamada al proveedor registrada |
Control del postpreprocesador de chat normal con model=restricted-model y metadata.selected_model_id=restricted-model | Denegado antes del despacho al proveedor | Denegado; sin llamada al proveedor registrada |
Solicitud de tarea con model=public-arena que selecciona restricted-model | Denegado cuando el modelo seleccionado es restringido | Stub del proveedor local alcanzado con model=restricted-model y bypass_filter=true |
En el caso de la tarea de arena, el modelo restringido está ausente del registro de verificación de acceso.
Impacto
Un usuario regular puede utilizar un envoltorio de arena legible como oráculo para un modelo restringido a través de los endpoints de generación de tareas. Para /api/v1/tasks/moa/completions, el llamante controla el prompt de la tarea y recibe la respuesta generada.
El límite de seguridad cruzado es la autorización de lectura de modelos: un usuario sin privilegios de administrador al que se le deniega el acceso directo a un modelo puede igualmente provocar que Open WebUI despache una solicitud a ese modelo utilizando las credenciales del backend configuradas por el operador.
Esto puede permitir:
- uso de modelos de pago o internos con la clave del proveedor configurada por el administrador.
- elusión de las concesiones de acceso a modelos mostradas en el selector de modelos.
- impacto en costes y uso en proveedores con facturación por token.
- exposición del comportamiento del modelo o de las capacidades internas del despliegue que los administradores pretendían restringir.
CVSS v3.1 sugerido:
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:L/A:L
Puntuación: 7.6
CWE primario: CWE-862, Autorización Faltante.
Se requiere autenticación, por lo que se utiliza PR:L. No se requiere interacción del usuario. El impacto en confidencialidad es Alto porque el atacante puede consultar un modelo que el administrador pretendía restringir. La integridad y la disponibilidad son Bajas porque la solicitud puede consumir cuota del proveedor y producir salida del modelo bajo una decisión de autorización que el sistema de otro modo denegaría.
Esta vulnerabilidad no debe clasificarse como Crítica: la explotación requiere un usuario autenticado y un envoltorio de arena legible, no cruza hacia otra autoridad de seguridad y no proporciona ejecución de código arbitrario ni compromiso total de la instancia.
Corrección Sugerida
No utilizar bypass_filter=True para el despacho de fallback de arena a menos que el modelo subyacente seleccionado ya haya sido autorizado para el llamante.
Cambios recomendados:
- Tras seleccionar
selected_model_id, cargar el modelo seleccionado e invocarcheck_model_access(user, selected_model)antes del despacho recursivo. - Para
filter_mode=excludeomodel_idsvacío, construir el conjunto de candidatos a partir de los modelos que el usuario actual puede leer, no de todos los modelos no arena enrequest.app.state.MODELS. - Añadir pruebas de regresión para
/api/v1/tasks/moa/completions,/api/v1/tasks/title/completions,/api/v1/tasks/tags/completionsy el comportamiento de arena en/api/chat/completionsnormal.
Apéndice: Componentes Afectados
backend/open_webui/routers/tasks.py:/api/v1/tasks/moa/completionsconstruye un payload a partir demodel,promptyresponsescontrolados por el llamante, luego invocagenerate_chat_completion(request, form_data=payload, user=user).backend/open_webui/utils/chat.py: verifica el acceso para el modelo envoltorio de arena proporcionado por el usuario; la resolución de fallback de arena selecciona un modelo subyacente cuando el llamante no pasó porprocess_chat_payload(); el despacho recursivo utilizabypass_filter=True.backend/open_webui/utils/models.py: las verificaciones de acceso al envoltorio de arena solo comprueban losaccess_grantsdel envoltorio.
Referencias en la rama principal actual:
backend/open_webui/routers/tasks.py:662-707backend/open_webui/utils/chat.py:190-204backend/open_webui/utils/chat.py:215-240backend/open_webui/utils/chat.py:248-269backend/open_webui/utils/middleware.py:2323-2347backend/open_webui/utils/models.py:378-407
Apéndice: Análisis de Duplicados
Esta vulnerabilidad es distinta de GHSA-9vvh-qmjx-p4q8 / CVE-2026-44555, que cubre el encadenamiento de base_model_id y modelos de workspace creados por el usuario. La rama principal actual incluye la corrección de acceso a la cadena de modelos base a través de has_base_model_access.
Este reporte cubre los endpoints de tareas que invocan generate_chat_completion() sin el preprocesador principal de chat. La causa raíz es el fallback de arena más la recursión con bypass_filter=True, no base_model_id.
El barrido de duplicados previo a la presentación también revisó:
GHSA-v6qf-75pr-p96m: parámetro de consulta HTTP expuesto?bypass_filter=true. Este reporte no depende de parámetros de consulta controlados por el llamante; el endpoint de tareas alcanza la ruta del lado del servidor conbypass_filter=Truerecursivo tras la resolución de fallback de arena.GHSA-hp5m-24vp-vq2q: passthrough de/api/openai/responsessin autorización de modelo. Este reporte apunta a/api/v1/tasks/moa/completionsy al resolvedor de arena dentro deutils.chat.generate_chat_completion().GHSA-gfm2-xm6c-37qc: autorización de propiedad de chat en completions. Este reporte no requiere el ID de chat de otro usuario.
Si los mantenedores prefieren tratar esto como la misma clase amplia de "envoltorio verificado, modelo subyacente no verificado", debería seguir siendo un vector de explotación y componente afectado distintos: endpoints de tareas, no creación o importación de modelos ni despacho por base_model_id.
Apéndice: Precondiciones
- Usuario autenticado sin privilegios de administrador.
- El usuario puede leer un modelo envoltorio de arena, por ejemplo una arena personalizada con concesión de lectura pública.
- El modelo de arena incluye al menos un modelo subyacente restringido que el usuario no puede consultar directamente.
