The bouncer at the club door is asleep, and the door leads to every guest room in the hotel
Konnectivity is the tunnel Kubernetes uses when the API server needs to reach nodes that live on the other side of a network boundary — kubectl exec, kubectl logs, port-forward, admission webhook callbacks, metrics scraping. In hosted control planes (HyperShift, ROSA HCP, ARO HCP, Red Hat OpenShift managed offerings, and downstream vendors reusing the pattern), the proxy-server runs alongside kube-apiserver and exposes an agent-facing listener — the *cluster endpoint*, typically service konnectivity-server:8091 fronted by a Route/NodePort/LB so agents in the tenant data plane can dial home. The bug: that listener was started without --cluster-ca-cert and without a token-auth alternative, so any TCP peer that completes the TLS handshake is accepted as a legitimate agent and enrolled into the routing pool. Affected configurations are HyperShift-derived control planes shipping with the vulnerable manifest set; check whether the konnectivity-server container args include --cluster-ca-cert= or --agent-namespace/--agent-service-account token mode.
The vendor's CRITICAL / 9.4 is not inflation. AV:N/AC:L/PR:N/UI:N is accurate when the cluster endpoint is exposed via Route or LB (the default in most managed offerings). C:H/I:H is accurate because a rogue agent doesn't just eavesdrop — it becomes a load-balanced peer for real API-server→node traffic, which means it can *proxy, inspect, modify, or drop* exec streams, webhook responses, and log data across every tenant node whose traffic gets round-robined to it. The A:L is arguably light; a hostile agent that drops traffic can brown-out an entire hosted cluster. Baseline holds.
5 steps from start to impact.
Locate an exposed Konnectivity cluster endpoint
konnectivity-server (port 8091 internally). In managed HCP offerings this is *deliberately* internet-reachable so tenant agents can dial back through NAT. Tooling: nmap -sV -p 8090-8100, Shodan queries for konnectivity-server TLS SANs, or DNS scraping of *.hypershift.local-style hostnames on provider domains.- Cluster endpoint reachable from attacker network
- TLS handshake completes (server cert only)
- Some operators deploy Konnectivity cluster endpoint on a private LB or PrivateLink only
- Provider WAF/mTLS front-ends may terminate before Konnectivity
Speak agent gRPC without a client certificate
apiserver-network-proxy agent binary (or a minimal Go client built from the public proto definitions) and points it at the target endpoint. Because the server never invoked tls.Config{ClientAuth: RequireAndVerifyClientCert} — the effect of missing --cluster-ca-cert — the handshake succeeds with no client cert at all.- Attacker can build/run the upstream Konnectivity agent (public code)
- No token-based auth configured as fallback
- If the operator patched in the token-auth path instead of certs, this fails
- Some forks require a non-empty client-cert even when validation is off
agent connected with an empty/anonymous identity; most SIEM parsers don't alert on thisRegister into the agent routing pool
AgentIdentifiers claiming node identity/CIDR coverage of its choosing. The proxy-server adds it to the pool used to dispatch tunneled dials from kube-apiserver. In HA control planes the pool is per-server-instance; the attacker connects to *all* three to guarantee traffic capture regardless of which apiserver replica initiates the dial.- Server accepts the agent's advertised identifiers
- Attacker can maintain persistent HTTP/2 streams
- Some deployments pin agent identity to specific node CIDRs and reject conflicts
- Idle-timeout tuning may churn the malicious peer
konnectivity_network_proxy_server_ready_backend_connections will show inflated counts; there is no default alertIntercept and manipulate control-plane→node traffic
Dial calls to the pool. When the rogue peer wins a dial, it receives the target address (kubelet, webhook endpoint, exec target) and the full duplex byte stream. The attacker can silently forward to the real destination while logging (kubectl exec sessions leak service-account tokens, kubectl cp leaks arbitrary secrets), rewrite webhook admission responses to allow malicious resources, or blackhole to cause outage. This is a *live MITM inside the trust boundary of the hosted control plane*.- Real control-plane traffic is being generated (always true in prod)
- Attacker can reach the intended backends to forward, or accepts partial-blackhole strategy
- mTLS between kube-apiserver and kubelet limits payload tampering to the outer envelope — but exec/attach traffic remains capturable since the tunnel itself carries plaintext of
spdy/websocketstreams that terminate at kubelet
Escalate to tenant / fleet compromise
- Interception persists long enough to catch privileged operations
- Multi-tenant Konnectivity topology (typical for managed HCP)
- Per-tenant Konnectivity server isolation (some providers do this) contains blast radius
- Short-lived, bound SA tokens reduce token-replay value
The supporting signals.
| In-the-wild status | No public exploitation reported as of 2026-07-20; disclosure is today |
|---|---|
| KEV status | Not KEV-listed (freshly disclosed) |
| EPSS | No score yet (CVE published <24h); expect initial low percentile until PoC surfaces |
| PoC availability | No public exploit code, but weaponization is trivial — the upstream kubernetes-sigs/apiserver-network-proxy agent binary is the exploit |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L — network, no auth, no user interaction; 9.4 upheld |
| CWE | CWE-306 Missing Authentication for Critical Function |
| Affected components | HyperShift-based hosted control planes, OpenShift HCP (ROSA HCP, ARO HCP), and any downstream distro shipping the vulnerable konnectivity-server manifest without --cluster-ca-cert |
| Fixed configuration | Konnectivity proxy-server invoked with --cluster-ca-cert=<path> (mTLS agent auth) OR --agent-namespace/--agent-service-account for token-mode; vendor patched manifests are shipping via HyperShift operator update |
| Exposure telemetry | Shodan/Censys fingerprints for konnectivity-server ALPN reveal a small but non-zero public footprint concentrated on managed-service provider ranges |
| Reporter | Reported through Red Hat Product Security (see Red Hat CVE page for credited researcher) |
noisgate verdict.
The affected component IS the control-plane→node trust boundary for hosted Kubernetes; a successful chain yields live MITM of exec, webhook, and log traffic across every tenant whose agents dial the compromised endpoint. Role multiplier alone floors this at CRITICAL — this is the canonical hypervisor/orchestration category, not a member-server component.
Why this verdict
- Missing authentication, not weak authentication. CWE-306 means the door isn't locked — no brute force, no cred harvest, no chain. TLS handshake completes and you are in the routing pool.
- Role multiplier — orchestration control plane. The affected component is the tunnel through which
kube-apiserverreaches every worker. Chain outcome is fleet-scale traffic interception, not single-host compromise. This is canonically a high-value-role component (≥10% of installs occupy the high-value role by definition — 100% do, actually), so the CRITICAL floor holds. - Cluster endpoint is designed to be externally reachable in managed HCP so tenant agents can NAT-traverse. Unlike most 'internal control-plane' bugs, exposure is not accidental — it is architectural.
- Weaponization is one
go runaway — the legitimate agent binary fromkubernetes-sigs/apiserver-network-proxyis the exploit. No custom tooling required. - Cross-tenant impact in multi-tenant HCP — a single vulnerable proxy-server instance sits in front of multiple hosted control planes' agent flows in some provider topologies, making this a *provider-scale* incident, not a customer-scale one.
Why not higher?
CVSS caps at 10.0 and the vendor's 9.4 already reflects the maximal AV:N/AC:L/PR:N/UI:N with C:H/I:H. Availability is realistically H not L (a malicious peer can blackhole entire clusters) so 9.5–9.8 would be defensible, but bucket is CRITICAL either way — no operational benefit to arguing decimals.
Why not lower?
Any downgrade would require evidence that the affected component is NOT canonically deployed in a control-plane role, or that the cluster endpoint is architecturally isolated from attacker networks. Neither holds for HyperShift-family deployments. 'Requires network reachability' is not a friction argument here — reachability is the intended design.
What to do — in priority order.
- Restrict the Konnectivity cluster endpoint to known agent CIDRs immediately — Apply an NLB/Route ACL, security group, or NetworkPolicy limiting ingress to
konnectivity-server:8091(or the Route hostname) to the source CIDRs of your managed data-plane VPCs/subnets. This is the fastest way to buy time before the manifest patch lands. Deploy within 3 days per noisgate mitigation SLA. - Audit every hosted control plane for the missing
--cluster-ca-certarg — Runoc -n <hcp-ns> get pod -l app=kube-apiserver -o jsonpath='{.items[*].spec.containers[?(@.name=="konnectivity-server")].args}'across every control-plane namespace. Any instance without--cluster-ca-cert=AND without--agent-namespace/--agent-service-accountis vulnerable. Enumerate today; remediate manifests within 3 days. - Rotate ServiceAccount tokens and kubelet client certs on any potentially-exposed hosted cluster — Assume interception has occurred on any endpoint that was internet-reachable prior to remediation. Cycle SA tokens (
kubectl delete secretfor legacy SA tokens; force projected-token refresh), rotate kubelet client-cert PKI, and invalidate long-lived bootstrap tokens. Complete within the 3-day mitigation window. - Enable audit logging of Konnectivity backend connection events — Turn on verbose logging for
konnectivity_network_proxy_server_ready_backend_connectionsmetric changes and ship connection-accepted events (with peer identity — expected to be non-empty post-patch) to your SIEM. Alert on any anonymous/empty-identity agent connect. - Deploy vendor-patched HyperShift operator to enforce correct manifest generation — The operator regenerates control-plane pod specs. Track the fixed HyperShift/OCP HCP release and roll it out cluster-by-cluster. Complete full remediation within 90 days per noisgate remediation SLA.
- WAF in front of the Konnectivity endpoint — the protocol is gRPC over HTTP/2 with binary framing; WAFs cannot inspect or authenticate the peer.
- mTLS between apiserver and kubelet — that protects the *inner* payload envelope for API calls, but exec/attach/port-forward streams inside the Konnectivity tunnel are still capturable, and admission-webhook responses can still be manipulated on the tunnel layer.
- NetworkPolicy inside the hosted cluster — irrelevant; the vulnerable listener is in the *management cluster* control-plane namespace, not the tenant.
- Reading pod logs for 'agent connected' — the log line is there for legitimate connections too, and default log parsers don't flag empty-identity peers.
Crowdsourced verification payload.
Run this on a workstation with oc (or kubectl) auth to the management cluster hosting the HyperShift control planes. Requires read access to all hosted-control-plane namespaces (typically cluster-admin on the management cluster). Invoke: ./check-cve-2026-16242.sh — it will iterate every HCP namespace and print VULNERABLE, PATCHED, or UNKNOWN per control plane, and exit non-zero if any vulnerable instance is found.
#!/usr/bin/env bash
# check-cve-2026-16242.sh
# Detects Konnectivity proxy-server started without --cluster-ca-cert
# and without token-based agent auth in HyperShift/OCP HCP deployments.
# Exit codes: 0 = all PATCHED, 1 = at least one VULNERABLE, 2 = UNKNOWN state
set -u
CLI=${CLI:-oc}
command -v "$CLI" >/dev/null 2>&1 || CLI=kubectl
command -v "$CLI" >/dev/null 2>&1 || { echo "UNKNOWN: no oc/kubectl in PATH"; exit 2; }
vuln=0
unknown=0
checked=0
# Find every namespace that looks like a hosted control plane
namespaces=$($CLI get ns -o jsonpath='{range .items[*]}{.metadata.name}{"\n"}{end}' \
| grep -E '^(clusters-|ocm-|hcp-)' || true)
if [ -z "$namespaces" ]; then
# Fallback: any ns with a konnectivity-server container
namespaces=$($CLI get pods -A -o jsonpath='{range .items[?(@.spec.containers[*].name=="konnectivity-server")]}{.metadata.namespace}{"\n"}{end}' | sort -u)
fi
for ns in $namespaces; do
pods=$($CLI -n "$ns" get pods -l app=kube-apiserver -o name 2>/dev/null)
[ -z "$pods" ] && continue
for pod in $pods; do
checked=$((checked+1))
args=$($CLI -n "$ns" get "$pod" \
-o jsonpath='{.spec.containers[?(@.name=="konnectivity-server")].args}' 2>/dev/null)
if [ -z "$args" ]; then
echo "UNKNOWN: $ns/$pod (no konnectivity-server container found)"
unknown=$((unknown+1))
continue
fi
has_ca=$(echo "$args" | grep -c -- '--cluster-ca-cert=' || true)
has_token=$(echo "$args" | grep -cE -- '--agent-namespace=|--agent-service-account=' || true)
if [ "$has_ca" -ge 1 ] || [ "$has_token" -ge 1 ]; then
echo "PATCHED: $ns/$pod"
else
echo "VULNERABLE: $ns/$pod (no --cluster-ca-cert, no token auth)"
vuln=$((vuln+1))
fi
done
done
echo "---"
echo "Checked: $checked Vulnerable: $vuln Unknown: $unknown"
if [ "$vuln" -gt 0 ]; then exit 1; fi
if [ "$checked" -eq 0 ] || [ "$unknown" -gt 0 ]; then exit 2; fi
exit 0
If you remember one thing.
VULNERABLE result as an active-exposure incident. Per the noisgate mitigation SLA for CRITICAL, you have ≤ 3 days to restrict the Konnectivity cluster endpoint to known agent CIDRs (LB/security-group ACL) AND rotate SA tokens plus kubelet PKI on any hosted cluster whose endpoint was internet-reachable. Per the noisgate remediation SLA for CRITICAL, you have ≤ 90 days to roll the patched HyperShift operator across the fleet so regenerated control-plane manifests include --cluster-ca-cert. This is not KEV yet, but weaponization is go run agent.go — do not wait for the KEV listing before compressing the mitigation window to hours if any of your HCP endpoints answer from a public IP.Sources
- Red Hat Security — CVE tracker (parent path)
- HyperShift docs — Konnectivity architecture
- Kubernetes upstream — Set up Konnectivity service
- kubernetes-sigs/apiserver-network-proxy (upstream)
- OpenShift 4.18 Networking for Hosted Control Planes
- OpenShift 4.19 Hosted Control Planes (single-page)
- OpenShift 4.17 Hosted Control Planes release notes
- CWE-306: Missing Authentication for Critical Function
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.