
Prova de conceito demonstrando um desvio de autorização no provedor Kubernetes Gateway do Traefik (CVE-2026-54761) por meio de uma vulnerabilidade crossProviderNamespaces, expondo serviços internos como api@internal.
Este repositório é uma Prova de Conceito (PoC) para reproduzir em ambiente local a vulnerabilidade de alta gravidade CVE-2026-54761 presente no provedor Kubernetes Gateway do Traefik.
Esta vulnerabilidade afeta a lista de permissões (allowlist) do crossProviderNamespaces. Em regras HTTPRoute que declaram múltiplas referências de backend com peso, o Traefik valida a lista de permissões contra o backendRef.namespace de destino, e não contra o namespace da própria rota. Como resultado, mesmo uma HTTPRoute em um namespace não autorizado pode expor serviços internos do Traefik, como api@internal, desde que a referência do backend aponte para um namespace permitido e exista um ReferenceGrant correspondente da Gateway API.
Relator(es): saku0512 (https://github.com/Saku0512), vvvvvvvvvvel (https://github.com/vvvvvvvvvvel)
Este projeto destina-se exclusivamente a fins educacionais e a testes de segurança autorizados.
Não execute esta PoC em sistemas que você não possui ou não administra. Esta PoC foi projetada para criar um cluster kind local descartável e demonstrar o problema em um ambiente isolado.
api@internal, podem ser expostos através do plano de dados normal.A opção crossProviderNamespaces tem como objetivo restringir os namespaces de rotas da Gateway API que podem declarar referências de backend do tipo TraefikService, incluindo aquelas que referenciam serviços @internal.
No caminho de processamento vulnerável para backends ponderados, o Traefik verifica a lista de permissões contra o backendRef.namespace. No entanto, como o limite de segurança é o namespace da HTTPRoute que declara a referência, essa verificação está incorreta.
Comportamento esperado:
providers:
kubernetesGateway:
crossProviderNamespaces:
- trusted
Apenas rotas cujo próprio namespace seja trusted devem poder declarar referências de backend do tipo TraefikService cross-provider.
Comportamento vulnerável:
backendRefs:
- group: traefik.io
kind: TraefikService
name: api@internal
namespace: trusted
Se a rota tiver múltiplas referências de backend e backendRef.namespace estiver definido como o namespace permitido trusted, uma HTTPRoute no namespace attacker pode ser aceita.
Esta PoC cria um cluster kind local descartável com a seguinte configuração:
providers.kubernetesGateway.crossProviderNamespaces=trustedReferenceGrant normal da Gateway API a partir de trustedcd external-repro-kind
./run-kind-repro.sh
O script remove automaticamente o cluster ao final.
Para manter o cluster para investigação manual:
KEEP_CLUSTER=1 ./run-kind-repro.sh
A rota de controle usa uma única referência de backend proibida (api@internal) a partir do namespace attacker. Neste caso, a API não deve ser exposta.
control status: 404
A rota de exploração usa duas referências de backend, fazendo o Traefik construir um serviço ponderado. Em versões vulneráveis, uma requisição a /api/http/services retorna o JSON da API do Traefik.
exploit returned Traefik API JSON
api@internal status: enabled
weighted members:
api@internal 1000000
attacker-whoami-http-80 1
O ponto crucial é que ambas as rotas são criadas a partir do mesmo namespace não confiável (attacker). A rota de controle com backend único é rejeitada, mas a rota com backends ponderados mistos é resolvida com sucesso e expõe api@internal.
external-repro-kind/kind-config.yaml — Configuração do cluster kind local expondo o Traefik em 127.0.0.1:18080external-repro-kind/traefik-v371.yaml — Deployment vulnerável do Traefik e GatewayClassexternal-repro-kind/gateway-exploit.yaml — Namespace, Gateway, ReferenceGrant, rota de controle e rota de bypassexternal-repro-kind/run-kind-repro.sh — Script de reprodução ponta a ponta localAtualize o Traefik para as versões corrigidas:
Os administradores também devem revisar os recursos existentes de ReferenceGrant da Gateway API. Não conceda acesso a referências cross-provider de TraefikService para namespaces não confiáveis, a menos que a delegação seja explicitamente intencionada.