Skip to main content

Skipper routesrv CVE-2026-54246

MEDIUM
Missing Authentication for Critical Function (CWE-306)
2026-07-17 https://github.com/zalando/skipper GHSA-5587-2x54-jj6h
5.7
CVSS 3.1 · GitHub Advisory
Share

Severity by source

GitHub Advisory PRIMARY
5.7 MEDIUM
AV:A/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
vuln.today AI
5.7 MEDIUM

In-cluster adjacency limits scope to AV:A; initial pod compromise required gives PR:L; pure confidentiality exposure with no write or disruption capability confirmed.

3.1 AV:A/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
4.0 AV:A/AC:L/AT:N/PR:L/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N
SUSE
MEDIUM
qualitative

Primary rating from GitHub Advisory.

CVSS VectorGitHub Advisory

Attack Vector
Adjacent
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
Confidentiality
High
Integrity
None
Availability
None

Lifecycle Timeline

2
Source Code Evidence Fetched
Jul 17, 2026 - 22:16 vuln.today
Analysis Generated
Jul 17, 2026 - 22:16 vuln.today

DescriptionGitHub Advisory

Description

The routesrv component exposes the full cluster route topology (Ingress/RouteGroup configurations, backend URLs, filter chains, OAuth/OIDC callback paths) and cache-cluster topology (Redis/Valkey shard addresses) over plain HTTP with zero authentication. Any pod in the Kubernetes cluster can reach routesrv via its predictable DNS name and retrieve sensitive cluster-wide routing and cache infrastructure data.

Vulnerable Code

routesrv/routesrv.go:87-99,114-137 - all handler registrations on the main mux:

go
mux.Handle("/routes", b)          // eskipBytes.ServeHTTP - all route data
mux.Handle("/routes/{zone}", b)   // zone-scoped route data
mux.Handle("/swarm/redis/shards", rh)   // Redis cluster addresses
mux.Handle("/swarm/valkey/shards", vh)  // Valkey cluster addresses

routesrv/eskipbytes.go:134-196 - eskipBytes.ServeHTTP:

go
func (e *eskipBytes) ServeHTTP(rw http.ResponseWriter, r *http.Request) {
    // ... only checks GET/HEAD method, NO auth check
    if r.Method != "GET" && r.Method != "HEAD" {
        w.WriteHeader(http.StatusMethodNotAllowed)
        return
    }
    // ... serves all route data immediately
}

routesrv/redishandler.go:28-41 - RedisHandler.ServeHTTP:

go
func (rh *RedisHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if r.Method != "GET" {
        w.WriteHeader(http.StatusMethodNotAllowed)
        return
    }
    // ... serves Redis cluster addresses immediately, NO auth check
}

routesrv/valkeyhandler.go:28-41 - ValkeyHandler.ServeHTTP:

go
func (vh *ValkeyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if r.Method != "GET" {
        w.WriteHeader(http.StatusMethodNotAllowed)
        return
    }
    // ... serves Valkey cluster addresses immediately, NO auth check
}

Attack Path

  1. Initial Compromise: Attacker compromises any pod in the Kubernetes cluster (via application CVE, supply-chain attack, malicious container image, etc.)
  2. Discovery: Attacker discovers routesrv via predictable Kubernetes DNS name: skipper-ingress-routesrv.kube-system.svc.cluster.local:9090 (documented at docs/tutorials/operations.md:108, docs/tutorials/ratelimit.md:137,197)
  3. Data Extraction without Auth:
  • GET http://<routesrv>:9090/routes → All Ingress/RouteGroup configurations across ALL namespaces
  • GET http://<routesrv>:9090/swarm/redis/shards → Redis cache cluster node addresses
  • GET http://<routesrv>:9090/swarm/valkey/shards → Valkey cache cluster node addresses
  1. Subsequent Attacks: With cache cluster topology, attacker can perform direct cache-level attacks (ratelimit data manipulation, session data exfiltration)

Permission Boundary Analysis

The routesrv uses a ServiceAccount with cluster-wide RBAC to list Ingress (networking.k8s.io), RouteGroup (zalando.org), Endpoints, and Services across all namespaces (see clusterclient.go:648-653 fetchClusterState). The kube-apiserver requires proper ServiceAccount token + RBAC authorization for the Kubernetes API itself, but routesrv exposes the aggregated data over HTTP with zero authentication.

A compromised pod with limited RBAC (restricted to its own namespace) can bypass Kubernetes RBAC entirely by reading routesrv. This crosses the boundary from *"namespace-scoped Kubernetes workload with restricted RBAC"* to *"full cluster route topology across all namespaces"*.

No NetworkPolicy manifests exist in the deploy/ directory. The default Kubernetes flat network model allows any pod to reach any service, further widening the attack surface.

Exposed Data

EndpointData ExposedImpact
GET /routesAll ingress/routegroup backends: internal service URLs, filter chains (auth, rate limiting, OAuth, JWT, OPA policies), load balancer group membershipCluster-wide reconnaissance, targeted backend attacks
GET /routes/{zone}Zone-scoped subset of above route dataSame, scoped
GET /swarm/redis/shardsRedis cluster internal IP:port pairsDirect cache-level attacks, ratelimit data manipulation
GET /swarm/valkey/shardsValkey cluster internal IP:port pairsSame

Additionally, the data-plane client (eskipfile/remote.go:190-219) also performs plain HTTP GET with no credentials - only an ETag header is sent - confirming that no auth capability exists in the architecture at all.

Mitigation

  1. Add authentication to all routesrv HTTP endpoints (basic auth, bearer token, mTLS, or shared secret) via flag -route-server-filters=""
  2. Deploy Kubernetes NetworkPolicies restricting ingress to routesrv to only the data-plane skipper pod selectors
  3. Consider using mutual TLS authentication between data-plane and control-plane components

NetworkPolicy does not remove the missing-auth condition

Restrictive NetworkPolicies are a valid mitigation, but they are not an application-layer authentication mechanism. The security-relevant defect remains that routesrv serves control-plane-derived data to unauthenticated callers whenever network reachability exists.

Impact framing

This report does not rely on claiming direct integrity or availability impact. The verified issue is a confidentiality-focused control-plane exposure: route definitions, backend topology, filter-chain details, and Redis/Valkey shard addresses become readable to any reachable in-cluster client.

Resources

  • routesrv/routesrv.go:87-99 - handler registration (zero auth)
  • routesrv/eskipbytes.go:134-196 - route data handler (no auth)
  • routesrv/redishandler.go:28-41 - Redis shard handler (no auth)
  • routesrv/valkeyhandler.go:28-41 - Valkey shard handler (no auth)
  • dataclients/kubernetes/clusterclient.go:648-653 - fetchClusterState() - shows cluster-wide RBAC
  • eskipfile/remote.go:190-219 - data-plane client also has no auth capability
  • docs/tutorials/operations.md:108, docs/tutorials/ratelimit.md:137,197 - documented routesrv DNS name

AnalysisAI

Unauthenticated exposure of full Kubernetes cluster routing topology and cache-cluster shard addresses in Zalando Skipper's routesrv component (versions prior to 0.27.13) allows any in-cluster pod to retrieve Ingress/RouteGroup configurations, OAuth/OIDC filter chains, backend URLs, and Redis/Valkey shard addresses via plain HTTP GET requests to predictable endpoints. An attacker who has established any pod foothold within the cluster can bypass Kubernetes RBAC entirely - escalating from namespace-scoped access to cluster-wide routing intelligence - enabling targeted follow-on attacks against cache infrastructure and internal backends. No public exploit code is confirmed and this CVE does not appear in the CISA KEV catalog, but the GHSA advisory provides a complete, step-by-step attack path with specific endpoint enumeration that substantially lowers the practical exploitation bar.

Technical ContextAI

This vulnerability is classified as CWE-306 (Missing Authentication for Critical Function) and affects the routesrv control-plane component of Zalando Skipper, a Kubernetes-native HTTP router and reverse proxy (Go package github.com/zalando/skipper, CPE pkg:go/github.com_zalando_skipper). In high-availability Skipper deployments, data-plane skipper instances poll routesrv for routing configuration rather than each querying kube-apiserver directly. The component registers four HTTP handlers - /routes, /routes/{zone}, /swarm/redis/shards, and /swarm/valkey/shards - on a plain HTTP mux (routesrv/routesrv.go:87-99). Each handler validates only the HTTP method (GET/HEAD) and immediately serves aggregated control-plane data with no authentication check, as confirmed in routesrv/eskipbytes.go:134-196, routesrv/redishandler.go:28-41, and routesrv/valkeyhandler.go:28-41. The service operates with cluster-wide RBAC permissions (via a dedicated ServiceAccount) to list Ingress, RouteGroup, Endpoints, and Services across all namespaces. Its DNS name (skipper-ingress-routesrv.kube-system.svc.cluster.local:9090) is documented in official Skipper tutorials, making discovery trivial. The data-plane client (eskipfile/remote.go:190-219) also sends no credentials, confirming authentication was never part of the architecture.

RemediationAI

Vendor-released patch: v0.27.13, available at https://github.com/zalando/skipper/releases/tag/v0.27.13. This release introduces support for arbitrary filter chains on the routesrv call path via the -route-server-filters flag, enabling operators to configure authentication mechanisms such as basic auth, bearer token validation, or mTLS between data-plane and control-plane components. Upgrade to v0.27.13 or later as the primary remediation. As a compensating control prior to patching, deploy Kubernetes NetworkPolicies that restrict ingress to the routesrv service on port 9090 exclusively to labeled data-plane skipper pod selectors; note that this reduces blast radius but does not eliminate the missing-authentication defect - if any pod matching the allowed selector is compromised, the unauthenticated endpoints remain reachable. Additionally, consider enabling mutual TLS between skipper data-plane instances and routesrv as a defense-in-depth measure once v0.27.13 filter chain support is configured. Do not rely on obscurity of the service DNS name; it is documented in official tutorials and discoverable by any in-cluster process.

More in Redis

View all
CVE-2026-48172 CRITICAL POC
10.0 May 21

Privilege escalation to root in the LiteSpeed User-End cPanel Plugin (versions 2.3 through before 2.4.5) lets attackers

CVE-2025-49844 CRITICAL POC
9.9 Oct 03

UAF in Redis 8.2.1 via crafted Lua scripts by authenticated users. EPSS 12.4%. Patch available.

CVE-2022-0543 CRITICAL POC
10.0 Feb 18

It was discovered, that redis, a persistent key-value database, due to a packaging issue, is prone to a (Debian-specific

CVE-2018-11218 CRITICAL POC
9.8 Jun 17

Memory Corruption was discovered in the cmsgpack library in the Lua subsystem in Redis before 3.2.12, 4.x before 4.0.10,

CVE-2025-46817 HIGH POC
7.0 Oct 03

Redis is an open source, in-memory database that persists on disk. Versions 8.2.1 and below allow an authenticated user

CVE-2015-4335 CRITICAL POC
10.0 Jun 09

Redis before 2.8.21 and 3.x before 3.0.2 allows remote attackers to execute arbitrary Lua bytecode via the eval command.

CVE-2016-8339 CRITICAL POC
9.8 Oct 28

A buffer overflow in Redis 3.2.x prior to 3.2.4 causes arbitrary code execution when a crafted command is sent. Rated cr

CVE-2026-27574 CRITICAL POC
9.9 Feb 21

Code injection in OneUptime monitoring via custom JS monitor using vm module. PoC and patch available.

CVE-2021-31649 CRITICAL POC
9.8 Jun 24

In applications using jfinal 4.9.08 and below, there is a deserialization vulnerability when using redis,may be vulnerab

CVE-2020-11981 CRITICAL POC
9.8 Jul 17

An issue was found in Apache Airflow versions 1.10.10 and below. Rated critical severity (CVSS 9.8), this vulnerability

CVE-2018-11219 CRITICAL POC
9.8 Jun 17

An Integer Overflow issue was discovered in the struct library in the Lua subsystem in Redis before 3.2.12, 4.x before 4

CVE-2024-23998 CRITICAL POC
9.6 Jul 05

goanother Another Redis Desktop Manager =<1.6.1 is vulnerable to Cross Site Scripting (XSS) via src/components/Setting.v

Vendor StatusVendor

SUSE

Severity: Moderate
Product Status
SUSE Linux Enterprise Server 16.1 Affected
SUSE Linux Enterprise Server for SAP applications 16.1 Affected
SUSE Linux Enterprise Module for Package Hub 15 SP5 Affected
SUSE Linux Enterprise Module for Package Hub 15 SP6 Affected
openSUSE Leap 15.5 Affected

Share

CVE-2026-54246 vulnerability details – vuln.today

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy