Announcing Istio 1.30.6
Istio 1.30.6 patch release.
This release contains security fixes. This release note describes what’s different between Istio 1.30.5 and 1.30.6.
BEFORE YOU UPGRADE
Things to know and prepare before upgrading.
DOWNLOAD
Download and install this release.
DOCS
Visit the documentation for this release.
SOURCE CHANGES
Inspect the full set of source code changes.
Security update
For more information, see ISTIO-SECURITY-2026-007.
Envoy CVEs
- GHSA-8vc2-jrm4-835w: (CVSS score 7.5): Fixed an unauthenticated remote crash in the OAuth2 HTTP filter on a CONNECT request without a
:pathheader. - GHSA-47vj-9r25-wv5j: (CVSS score 6.5): Fixed a crash in the
api_key_authHTTP filter on a CONNECT request without a:pathheader.
Istio CVEs
- GHSA-w44g-8m76-8gc5 (CVSS score 7.4, High):
AuthorizationPolicymethod rules are bypassed over HTTP/2 by changing the case of the method. Credit: This vulnerability was discovered and reported by izzy0101010101. - GHSA-7p2q-4xvg-vxc6 (CVSS score 7.7, High): istiod crashes in ambient mode when a
ServiceEntryor other service claims the address of an IP-addressed waypoint. Credit: This vulnerability was discovered and reported by yshch.
Other Istio Security Fixes
Fixed
istioctlskipping verification of the istiod certificate when connecting to XDS with a service account token (istioctl proxy-status,istioctl x internal-debug, and--xds-addressin general). istioctl now verifies the server against the Istio root certificate from theistio-ca-root-certconfigmap and the expected server name:--authorityif set, the host of--xds-addressif it is a DNS name, oristiod.<istio-namespace>.svcwhen connecting to an IP address or localhost. Pass--insecure(or setISTIOCTL_INSECURE=true) to explicitly skip verification. Credit: This issue was reported by Leon Zlobecki. (Issue #41937)Fixed
istioctl manifest translatewriting unquoted values from IstioOperator input (such as namespace and release name) into generated install shell scripts. Crafted values could inject additional shell commands when those scripts were run. Arguments are now escaped withshellescape.Quote. Credit: This vulnerability was discovered and reported by OpenSec Intelligence.Fixed a panic in istiod when the OIDC/JWT authenticator received a token with a malformed
subclaim. The subject is now validated to have exactly thesystem:serviceaccount:<namespace>:<serviceaccount>form before use. Credit: This issue was reported by Kaizhe Huang.Fixed
CreateCertificatereturning raw Kubernetes API error text to callers on the experimental Kubernetes CSR RA path (EXTERNAL_CA=ISTIOD_RA_KUBERNETES_API), which leaked CSR names, signer names, and istiod’s identity. The full error is now logged server-side only. Reported by Juno Im.Fixed the Kubernetes CSR watch loop using an abandoned
time.Aftertimer that could leave a goroutine running past request completion on the experimental Kubernetes CSR RA path (EXTERNAL_CA=ISTIOD_RA_KUBERNETES_API). The loop is now bounded by a properly scopedcontext.WithTimeoutand is reliably torn down on timeout or cancellation. Reported by Juno Im.Fixed client-requested
ValidityDurationbeing accepted up toMAX_WORKLOAD_CERT_TTL(default90d) on the experimental Kubernetes CSR RA path (EXTERNAL_CA=ISTIOD_RA_KUBERNETES_API). A newMAX_RA_WORKLOAD_CERT_TTLenvironment variable (default48h) now caps the TTL, limiting the blast radius of a stolen istio-token. Deployments that legitimately requested certificates with TTL >48hvia this path should raiseMAX_RA_WORKLOAD_CERT_TTLafter upgrade. Reported by Juno Im.Fixed the Wasm OCI image fetcher deciding to retry a failed HTTPS fetch over plaintext HTTP based on the error returned by the registry. Since the registry is untrusted input, a MITM or malicious registry could trigger this fallback on demand to force plaintext transport and, without an optional module digest pinned, serve an arbitrary Wasm binary. The plaintext retry is now only attempted for registries the operator has explicitly allowlist via
WASM_INSECURE_REGISTRIES. Credit: This vulnerability was discovered and reported by Adam Korczynski.Fixed istiod debug endpoints (
/debug/config_dump,/debug/edsz, and the XDSistio.io/debug/config_dumptype) matchingproxyIDas a substring, which let a caller read the config of other proxies in its own namespace by passing a partial ID.proxyIDmust now be the exact<pod>.<namespace>(or full connection ID); short forms such asproxyID=istio-ingressgatewayno longer match. Credit: This issue was reported by 박현범.Improved Added
PILOT_ENABLE_STRICT_GATEWAY_MERGINGto prevent cross-namespace merging of Istio Gateways with managedGatewayAPIGateways. When enabled, Istio Gateway CRDs from different namespaces will not be merged with managedGatewayAPIGateway proxies. Unmanaged (manual deployment)GatewayAPIGateways are not affected. Disabled by default; setPILOT_ENABLE_STRICT_GATEWAY_MERGINGtotrueto enable. Enabled by default starting in 1.31.
Changes
Fixed an
HTTPRouterule with severalInferencePoolbackendRefsconfiguring only one endpoint picker. The picker of the lastbackendReflisted scored every request on the rule, so the other pools’ pickers were never invoked, and a pool with no ready endpoints failed the whole rule rather than its own weighted share. Each pool now gets its own picker, attached to its own weighted cluster. (Issue #61594)Fixed two
HTTPRoutes sharing arules[].nameon the same gateway overwriting each other’s endpoint picker. Rule names only have to be unique within oneHTTPRoute, but the pickers were keyed by name across all of them, so a route could be served by another route’s picker. Pickers are now resolved perbackendRef, so a shared name no longer moves one route’s picker onto another. (Issue #61594)Fixed a route rule losing its
InferencePoolendpoint picker when it also carried a CORS filter. Both are written into the same per-filter configuration, and the CORS path replaced the map rather than adding to it. (Issue #61594)Fixed sidecar proxy UID/GID resolution on OpenShift for workloads bound to a custom
SecurityContextConstraintwith a narrow or explicitly-configured UID range, which the namespace’s preallocated UID range annotation does not advertise. (Issue #61791)Fixed an issue where, with
PILOT_FILTER_GATEWAY_CLUSTER_CONFIGenabled, incremental CDS pushes removed gateway clusters for Services listed in theenvoyfilter.istio.io/referenced-servicesannotation of anEnvoyFilter. These clusters were only restored on the next full push. (Issue #62067)Added a validation warning for
ServiceEntryaddresses that are catch-all (0.0.0.0,::), have an unspecified network (0.0.0.0/N,::/N), or are a CIDR with a prefix shorter than/8. AServiceEntrylike this withresolution: NONEand the defaultexportTocan make every sidecar in the mesh pass through traffic on its ports, bypassingoutboundTrafficPolicyREGISTRY_ONLY. Use a narrower CIDR andexportTo: ["."]. For egress enforcement, use an egress gateway with a NetworkPolicy. (Issue #62124)Fixed an issue where the pre-marshaled workload used for change detection and versioning in ambient was not stable when a workload had more than one service, which made unchanged workloads look modified on every recompute and prevented unchanged workloads from being skipped when a client reconnected.
Fixed a bug where an internal listener was incorrectly created when the listener is of HTTPS or TLS but without a TLS section defined. A following version of the Gateway API will prevent this combination of inputs from ever reaching a controller. (Issue #60562)
Fixed removing a single event handler from a CRD-backed informer removing every handler on that informer. In ambient multi-cluster mode this fired on every remote cluster credential rotation, leaving istiod waiting forever for the new cluster’s collections to sync, so remote network gateways went missing and the workload index could stop updating until restart. (Issue #61827)
Fixed Istio components hanging indefinitely when a Kubernetes API request gets no response, for example when a load balancer or proxy silently drops the return path. Previously such a request could stay open forever, stalling the controller that issued it until the process restarted. Requests now time out on the client side, so a stuck request is canceled and the component recovers on its own. Each timeout is logged as a warning and counted by the
kube_client_deadline_fired_totalmetric. The timeouts can be tuned withISTIO_KUBE_HEADER_TIMEOUT(default90s) andISTIO_KUBE_REQUEST_TIMEOUT(default15m); set either to0to restore the previous unbounded behavior.Fixed an issue where EDS-irrelevant configuration updates coalesced with an endpoint update caused full EDS generation instead of updating only the affected endpoint assignments.
Fixed ztunnel crash-looping with exit code 133 (
SIGTRAP) on arm64 nodes whose CPUs provide theRNDRinstruction, such as GKE Axion, when the hardware random number generator reported a transient failure.aws-lc-rsis updated to 1.18.2, which retries the read instead of aborting. (Issue #2072)