← Back to Feed CACHED · 2026-07-20 12:19:18 · CACHE_KEY CVE-2026-16242
CVE-2026-16242 · CWE-306 · Disclosed 2026-07-20

A flaw was found in the Konnectivity proxy-server configuration for hosted control planes

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

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.

"Konnectivity agent listener with no cert validation = any TCP-reachable attacker becomes a routing peer for control-plane-to-node traffic. Verdict stands."
02 · The Attack Path

5 steps from start to impact.

STEP 01

Locate an exposed Konnectivity cluster endpoint

Attacker enumerates the managed-Kubernetes provider or HyperShift-derived offering and identifies the Route/NodePort/LB fronting 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.
Conditions required:
  • Cluster endpoint reachable from attacker network
  • TLS handshake completes (server cert only)
Where this breaks in practice:
  • Some operators deploy Konnectivity cluster endpoint on a private LB or PrivateLink only
  • Provider WAF/mTLS front-ends may terminate before Konnectivity
Detection/coverage: Shodan/Censys can fingerprint the Konnectivity ALPN and cert SAN pattern; provider-side flow logs will show the SYN
STEP 02

Speak agent gRPC without a client certificate

The Konnectivity wire protocol is gRPC over HTTP/2. Attacker uses the upstream 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.
Conditions required:
  • Attacker can build/run the upstream Konnectivity agent (public code)
  • No token-based auth configured as fallback
Where this breaks in practice:
  • 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
Detection/coverage: Konnectivity server logs will show agent connected with an empty/anonymous identity; most SIEM parsers don't alert on this
STEP 03

Register into the agent routing pool

Once accepted, the rogue agent sends 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.
Conditions required:
  • Server accepts the agent's advertised identifiers
  • Attacker can maintain persistent HTTP/2 streams
Where this breaks in practice:
  • Some deployments pin agent identity to specific node CIDRs and reject conflicts
  • Idle-timeout tuning may churn the malicious peer
Detection/coverage: konnectivity_network_proxy_server_ready_backend_connections will show inflated counts; there is no default alert
STEP 04

Intercept and manipulate control-plane→node traffic

The apiserver now round-robins 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*.
Conditions required:
  • Real control-plane traffic is being generated (always true in prod)
  • Attacker can reach the intended backends to forward, or accepts partial-blackhole strategy
Where this breaks in practice:
  • 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/websocket streams that terminate at kubelet
Detection/coverage: Anomalous webhook latency, unexpected exec session sources, unexplained pod evictions
STEP 05

Escalate to tenant / fleet compromise

With interception in place across the routing pool, the attacker harvests ServiceAccount tokens exposed via exec sessions and webhook payloads, pivots into tenant workloads, and — in multi-tenant HCP where several hosted control planes share the same underlying Konnectivity route topology — repeats across every hosted cluster the endpoint fronts. In managed-service deployments this is a cross-tenant impact.
Conditions required:
  • Interception persists long enough to catch privileged operations
  • Multi-tenant Konnectivity topology (typical for managed HCP)
Where this breaks in practice:
  • Per-tenant Konnectivity server isolation (some providers do this) contains blast radius
  • Short-lived, bound SA tokens reduce token-replay value
Detection/coverage: Post-hoc — audit-log correlation of exec sessions with unexpected downstream API calls
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo public exploitation reported as of 2026-07-20; disclosure is today
KEV statusNot KEV-listed (freshly disclosed)
EPSSNo score yet (CVE published <24h); expect initial low percentile until PoC surfaces
PoC availabilityNo public exploit code, but weaponization is trivial — the upstream kubernetes-sigs/apiserver-network-proxy agent binary is the exploit
CVSS vectorCVSS: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
CWECWE-306 Missing Authentication for Critical Function
Affected componentsHyperShift-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 configurationKonnectivity 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 telemetryShodan/Censys fingerprints for konnectivity-server ALPN reveal a small but non-zero public footprint concentrated on managed-service provider ranges
ReporterReported through Red Hat Product Security (see Red Hat CVE page for credited researcher)
04 · The Call

noisgate verdict.

Final Verdict
= UNCHANGED to CRITICAL (9.3/10)

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.

HIGH on technical exploitability given the missing-auth root cause
HIGH on blast-radius characterization for managed HCP topologies
MEDIUM on population of exposed cluster endpoints — depends on operator LB posture

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-apiserver reaches 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 run away — the legitimate agent binary from kubernetes-sigs/apiserver-network-proxy is 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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. Audit every hosted control plane for the missing --cluster-ca-cert arg — Run oc -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-account is vulnerable. Enumerate today; remediate manifests within 3 days.
  3. 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 secret for 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.
  4. Enable audit logging of Konnectivity backend connection events — Turn on verbose logging for konnectivity_network_proxy_server_ready_backend_connections metric 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.
  5. 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.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: run the verification script against every management cluster before coffee, then treat every 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

  1. Red Hat Security — CVE tracker (parent path)
  2. HyperShift docs — Konnectivity architecture
  3. Kubernetes upstream — Set up Konnectivity service
  4. kubernetes-sigs/apiserver-network-proxy (upstream)
  5. OpenShift 4.18 Networking for Hosted Control Planes
  6. OpenShift 4.19 Hosted Control Planes (single-page)
  7. OpenShift 4.17 Hosted Control Planes release notes
  8. CWE-306: Missing Authentication for Critical Function
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.