
Prova di concetto che dimostra un bypass di autorizzazione nel provider Kubernetes Gateway di Traefik (CVE-2026-54761) tramite una vulnerabilità crossProviderNamespaces, esponendo servizi interni come api@internal.
Questo repository è un Proof of Concept (PoC) per riprodurre in ambiente locale la vulnerabilità ad alta gravità CVE-2026-54761 presente nel provider Kubernetes Gateway di Traefik.
Questa vulnerabilità interessa la lista di autorizzazione di crossProviderNamespaces. Nelle regole HTTPRoute che dichiarano riferimenti multipli a backend pesati, Traefik verifica la lista di autorizzazione rispetto a backendRef.namespace del riferimento di destinazione, non rispetto al namespace della route stessa. Di conseguenza, anche un HTTPRoute in un namespace non autorizzato può esporre servizi interni di Traefik come api@internal, se il riferimento al backend punta a un namespace autorizzato ed esiste il corrispondente ReferenceGrant dell'API Gateway.
Segnalato da: saku0512 (https://github.com/Saku0512), vvvvvvvvvvel (https://github.com/vvvvvvvvvvel)
Questo progetto ha esclusivamente scopi educativi e per test di sicurezza autorizzati.
Non eseguire questo PoC su sistemi che non possiedi o gestisci. Questo PoC è progettato per creare un cluster kind locale usa e getta e dimostrare il problema in un ambiente isolato.
api@internal potrebbero essere esposti tramite il dataplane normale.L'opzione crossProviderNamespaces serve a limitare i namespace delle route dell'API Gateway che possono dichiarare riferimenti a backend TraefikService contenenti riferimenti ai servizi @internal.
Nel percorso di elaborazione vulnerabile dei backend pesati, Traefik controlla la lista di autorizzazione per backendRef.namespace. Tuttavia, poiché il confine di sicurezza è il namespace dell'HTTPRoute che dichiara il riferimento, questo controllo è errato.
Comportamento previsto:
providers:
kubernetesGateway:
crossProviderNamespaces:
- trusted
Solo le route il cui namespace è trusted dovrebbero poter dichiarare riferimenti cross-provider a backend TraefikService.
Comportamento vulnerabile:
backendRefs:
- group: traefik.io
kind: TraefikService
name: api@internal
namespace: trusted
Se una route ha più riferimenti a backend e backendRef.namespace è impostato sul namespace trusted autorizzato, un HTTPRoute nel namespace attacker potrebbe essere accettato.
Questo PoC crea un cluster kind locale usa e getta con la seguente configurazione:
providers.kubernetesGateway.crossProviderNamespaces=trustedReferenceGrant dell'API Gateway dal namespace trustedcd external-repro-kind
./run-kind-repro.sh
Lo script elimina automaticamente il cluster al termine.
Per mantenere il cluster per indagini manuali:
KEEP_CLUSTER=1 ./run-kind-repro.sh
La route di controllo utilizza un singolo riferimento backend api@internal proibito dal namespace attacker. In questo caso, l'API non dovrebbe essere esposta.
control status: 404
La route di exploit utilizza due riferimenti backend e fa sì che Traefik costruisca un servizio pesato. Nelle versioni vulnerabili, una richiesta a /api/http/services restituisce il JSON dell'API di Traefik.
exploit returned Traefik API JSON
api@internal status: enabled
weighted members:
api@internal 1000000
attacker-whoami-http-80 1
È importante notare che entrambe le route sono create dallo stesso namespace attacker non fidato. La route di controllo con un singolo backend viene rifiutata, ma la route mista con backend pesati viene risolta con successo, esponendo api@internal.
external-repro-kind/kind-config.yaml - Configurazione del cluster kind locale che espone Traefik su 127.0.0.1:18080external-repro-kind/traefik-v371.yaml - Deployment vulnerabile di Traefik e GatewayClassexternal-repro-kind/gateway-exploit.yaml - Namespace, Gateway, ReferenceGrant, route di controllo e route di bypassexternal-repro-kind/run-kind-repro.sh - Script di riproduzione end-to-end localeAggiorna Traefik alla versione corretta.
Gli amministratori dovrebbero anche verificare le risorse ReferenceGrant esistenti dell'API Gateway. Non consentire l'accesso ai riferimenti cross-provider TraefikService da namespace non fidati, a meno che non si tratti di una delega esplicitamente intenzionale.