Announcing Istio 1.31.4
Istio 1.31.4 patch release.
This release contains security fixes. This release note describes what’s different between Istio 1.31.3 and 1.31.4.
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-009.
Istio CVEs
- GHSA-rr2c-p22p-6r9r (CVSS score 8.2, High): In ambient mode, an operator-precedence error let a port-level
STRICTPeerAuthenticationbe skipped when the workload mode wasPERMISSIVEorDISABLEunder a mesh-wideSTRICTpolicy, allowing plaintext traffic to reach a port that required mTLS. Credit: This vulnerability was discovered and reported by Ravikanth Reddy. - GHSA-7m6f-j3gp-2r53 (CVSS score 7.4, High): An
AuthorizationPolicywhencondition onrequest.headers[:authority]orrequest.headers[host]was matched case-sensitively, so a request with a differently-cased host could bypass it. These conditions are now matched case-insensitively, the same ashosts. Credit: This vulnerability was discovered and reported by @akoul. - GHSA-cxwg-46mx-q8hf (CVSS score 7.4, High): A new inbound connection reusing the 4-tuple of a torn-down connection could bypass the sidecar proxy by matching a stale conntrack
ESTABLISHEDentry. A SYN-only rule is now evaluated ahead of theESTABLISHEDdivert rule in both iptables and nftables modes. Credit: This vulnerability was discovered and reported by @ramaraochavali, @akshayreddyb, @Pawan-Bishnoi, and @deveshkandpal1224. - GHSA-635j-qv98-9275 (CVSS score 7.7, High): Any workload with a mesh identity could crash istiod by sending an
istio.io/debugxDS request whose resource name fails URL parsing, leaving the control plane in a crash loop for the whole mesh. The request is now rejected withInvalidArgument. Credit: This vulnerability was discovered and reported by Alon Lerner of Checkmarx Research. - GHSA-8jw7-82jp-wr2c (CVSS score 6.3, Moderate): In ambient mode, an
AuthorizationPolicywith an emptytoorfromentry that was not rejected by the validating webhook caused istiod to crash and crash-loop until the policy was removed, stopping config distribution for the whole mesh. Such entries are now treated as an emptyoperationorsource, matching the sidecar behavior. Credit: This vulnerability was discovered and reported by @r0binak. - GHSA-gf6w-6mxv-5fj4 (CVSS score 6.3, Moderate): In multicluster installations, a proxy could claim another cluster’s
CLUSTER_IDand receive that cluster’skubernetes://secrets over SDS. istiod no longer accepts a node metadataCLUSTER_IDthat differs from the cluster the proxy’s token was validated against. Credit: This vulnerability was discovered and reported by Yonghwa Lee (Xint by Theori). - GHSA-77vw-rg85-wx5x (CVSS score 6.5, Moderate): ztunnel panicked when parsing a 55-byte
traceparentheader that did not contain four dash-separated fields, terminating the inbound HBONE connection task and dropping every stream multiplexed on that connection. Headers with the correct length but an invalid field layout were also accepted instead of rejected. Invalidtraceparentheaders are now ignored and a new trace ID is generated. Credit: This vulnerability was discovered and reported by @RaphaelFakhri.
Other Istio Security Fixes
- Fixed the JWKS resolver’s periodic background refresh caching a fetched response without validating that it looks like a JWKS. The synchronous fetch path already rejected a response that isn’t shaped like a JWKS (
{"keys": [...]}), preventing aRequestAuthenticationjwksUripointed at an unintended internal endpoint from having its response cached and served back as if it were a JWKS. The background refresh path now applies the same check. Credit: This issue was reported by Anthropic and Ada Logics.
Changes
Added support for
AUTO_PASSTHROUGHlisteners on ambient east-west gateways (istio-east-westGatewayClass). A TLS passthrough listener on port 15443 (or any port using thegateway.istio.io/listener-protocol: auto-passthroughoption) now serves sidecar multi-network traffic alongside the HBONE listener, so a mixed ambient and sidecar mesh no longer needs two east-west gateways per cluster. This requiresAMBIENT_ENABLE_MULTI_NETWORKto be enabled. (Issue #60887)Fixed an istiod panic when
outlierDetectionwas applied to a dynamic forward proxy (DFP) wildcard cluster. (Issue #61450)Fixed an issue where the
istio-cniHelm chart did not respect the value set foristioOwnedCNIConfigFileName.Fixed an issue where updates to the
istio-cniconfig via the Helm chart did not restartistio-cnito pick up the new values.Fixed an issue where, when uninstalling the
istio-cniHelm chart, the ownedistio-cniconfig was not removed or the primary CNI config did not have theistio-cniplugin removed.Fixed an issue where, when enabling the owned
istio-cniconfig, the primary CNI config was not cleaned up.Fixed an issue where, when changing the owned
istio-cniconfig filename, the previous filename was not removed. (Issue #61890)Fixed the
source_appanddestination_appmetric labels to use theapppod label when a pod also hasapp.kubernetes.io/name. Since 1.29.1 they had usedapp.kubernetes.io/name, which is a regression from the intended behavior. (Issue #62280)Fixed a situation where fetching the JWKS could block xDS generation. (Pull Request #62486)
Fixed
AuthorizationPolicyipBlocksandnotIpBlocksmatching on waypoint and sidecar HBONE internal listeners to use the downstream client’s direct remote IP address instead of the internal Envoy address. (Issue #62522)Fixed an issue where
istio-cniskipped cleanup for an ambient pod deleted together with its namespace, leaving its ztunnel proxy and host probe ipset entry behind.Fixed an issue introduced in Istio 1.31 where a change to a
ConfigMapcontaining CA certificates, such as thekube-root-ca.crtConfigMapthat Kubernetes creates in every namespace, triggered CDS, LDS, RDS, and NDS pushes to every proxy. Clusters were rebuilt in full instead of incrementally. LikeSecretupdates, these changes now only trigger SDS pushes. EDS is now skipped for these updates as well. (Issue #62523)Fixed an issue where a metadata-only update to an
EndpointSlice, such as a GitOps tool writing an annotation, triggered an EDS push, and for headlessServiceswith non-HTTP ports a push to every proxy, even though the endpoints were unchanged.Fixed
istiodonly tolerating the defaultcni.istio.io/not-readytaint. Whentaint.nameis set to a custom taint, theistioddeployment now tolerates that taint, soistiodcan be scheduled onto nodes that still carry it. (Issue #52073)Fixed an issue where a metadata-only update to an Istio config resource, such as a GitOps tool writing an annotation, triggered a push whenever the resource carried any
istio.iolabel or annotation, for exampleistio.io/rev. A push is now triggered only when the spec or the value of anistio.iolabel or annotation changes.Fixed a regression where a
Telemetryresource in a waypoint’s own namespace, selected bytargetRefsorselector, was not applied when the waypoint served aServicein a different namespace. Access logging, metrics, and tracing configured this way were silently dropped for every cross-namespaceServicethe waypoint handled. (Issue #61538)