
Prueba de concepto que demuestra un bypass de autorización en el proveedor de Traefik para Kubernetes Gateway (CVE-2026-54761) mediante una vulnerabilidad de crossProviderNamespaces, exponiendo servicios internos como api@internal.
Este repositorio es una prueba de concepto (PoC) para reproducir localmente la vulnerabilidad de alta gravedad CVE-2026-54761 presente en el proveedor Kubernetes Gateway de Traefik.
Esta vulnerabilidad afecta la lista de permitidos de crossProviderNamespaces. En las reglas HTTPRoute que declaran múltiples referencias a backends con peso, Traefik valida la lista de permitidos contra el backendRef.namespace de la referencia en lugar del namespace de la propia ruta. Como resultado, incluso un HTTPRoute situado en un namespace no permitido puede exponer servicios internos de Traefik como api@internal, siempre que la referencia al backend apunte a un namespace permitido y exista el ReferenceGrant correspondiente de Gateway API.
Reportado por: saku0512 (https://github.com/Saku0512), vvvvvvvvvvel (https://github.com/vvvvvvvvvvel)
Este proyecto tiene únicamente fines educativos y para pruebas de seguridad autorizadas.
No ejecute esta PoC en sistemas que no posea o administre. Está diseñada para crear un clúster local kind desechable y demostrar el problema en un entorno aislado.
api@internal pueden quedar expuestos a través del plano de datos normalLa opción crossProviderNamespaces está diseñada para restringir los namespaces de las rutas de Gateway API que pueden declarar referencias a backends TraefikService que incluyan referencias al servicio @internal.
En la ruta de procesamiento vulnerable de backends con peso, Traefik verifica la lista de permitidos contra backendRef.namespace. Sin embargo, esta verificación es incorrecta, ya que el límite de seguridad debería ser el namespace del HTTPRoute que declara la referencia.
Comportamiento esperado:
providers:
kubernetesGateway:
crossProviderNamespaces:
- trusted
Solo las rutas cuyo propio namespace sea trusted deberían poder declarar referencias a backends TraefikService entre proveedores.
Comportamiento vulnerable:
backendRefs:
- group: traefik.io
kind: TraefikService
name: api@internal
namespace: trusted
Si la ruta tiene múltiples referencias a backends y backendRef.namespace está configurado en el namespace permitido trusted, un HTTPRoute en el namespace attacker podría ser aceptado.
Esta PoC crea un clúster local kind desechable con la siguiente configuración:
providers.kubernetesGateway.crossProviderNamespaces=trustedReferenceGrant normal de Gateway API desde trustedcd external-repro-kind
./run-kind-repro.sh
El script elimina automáticamente el clúster al finalizar.
Para conservar el clúster para investigación manual:
KEEP_CLUSTER=1 ./run-kind-repro.sh
La ruta de control utiliza una única referencia prohibida a api@internal desde el namespace attacker. En este caso, la API no debería quedar expuesta.
control status: 404
La ruta de exploit utiliza dos referencias a backends, lo que obliga a Traefik a construir un servicio con peso. En la versión vulnerable, una solicitud a /api/http/services devuelve el JSON de la API de Traefik.
exploit returned Traefik API JSON
api@internal status: enabled
weighted members:
api@internal 1000000
attacker-whoami-http-80 1
El punto clave es que ambas rutas se crean desde el mismo namespace no confiable attacker. La ruta de control con un solo backend es rechazada, pero la ruta mixta con backends con peso se resuelve correctamente y expone api@internal.
external-repro-kind/kind-config.yaml - Configuración del clúster local kind que expone Traefik en 127.0.0.1:18080external-repro-kind/traefik-v371.yaml - Despliegue de Traefik vulnerable y GatewayClassexternal-repro-kind/gateway-exploit.yaml - Namespace, Gateway, ReferenceGrant, ruta de control y ruta de bypassexternal-repro-kind/run-kind-repro.sh - Script de reproducción local de extremo a extremoActualice Traefik a la versión corregida.
Los operadores también deben revisar los recursos ReferenceGrant existentes de Gateway API. Asegúrese de que no permitan el acceso a referencias TraefikService entre proveedores desde namespaces no confiables, a menos que sea una delegación explícitamente intencionada.