Istio 1.32.0 Change Notes
Istio 1.32.0 release notes.
Traffic Management
Improved delta xDS memory usage: wildcard WDS subscriptions no longer accumulate resource names from subsequent requests, and the
initial_resource_versionsmap sent on reconnect is released before response generation for types that do not use it.Improved incremental EDS processing for
DestinationRulechanges to identify affected services through the sidecar scope, aligning it with CDS and avoiding per-clusterDestinationRulelookups.Improved performance when fetching
PeerAuthenticationresources for a given workload.Improved performance of sidecar RDS generation by checking the RDS cache before building the
VirtualHostWrapper/route protos, so a cache hit no longer pays the cost of route generation. To make this possible, the RDS cache key is now computed from a conservative superset of theDestinationRules that could influence the route (rather than only the exact set used by the final, filtered build). As a result, some unrelatedDestinationRulechanges — particularly those with wildcard hosts — may now trigger an RDS cache invalidation (and an extra push) that would previously have been avoided. This does not affect correctness, only the frequency of otherwise-unnecessary cache invalidations.Updated the OpenShift platform profile to default
global.nativeNftablestotruefor both sidecar and ambient mode installations. This can still be overridden by explicitly settingglobal.nativeNftables=false.Added an opt-in optimization for headless TCP service listener generation: instead of creating one listener per pod IP, Istio can generate a single wildcard
0.0.0.0:Portlistener with per-pod/32CIDR filter chains. This reduces xDS listener count and payload size for large headless services (e.g.StatefulSetresources). This is disabled by default; enable it by setting thePILOT_ENABLE_HEADLESS_FILTER_CHAIN_LISTENERenvironment variable totrueon istiod. (Issue #60552)Added the
outlierDetectionHttpErrorCodesfield toDestinationRule.OutlierDetection, allowing users to specify which HTTP status codes are treated as errors for outlier detection. If specified, only responses with one of these codes are counted as errors toward theconsecutive5xxErrorsandconsecutiveGatewayErrorsejection thresholds. If not specified, only 5xx responses are counted as errors. (Issue #60828)Added experimental support for the Gateway API
XBackendresource, used to describe the behavior clients must use when connecting to specific destinations. Support for theClientAndServerBackend TLS mode is currently disabled. (Issue #60747)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 aNetworkPolicy.Added a per-type watch summary (resource name count and wildcard flag) to the
/debug/adszendpoint, and a?briefparameter that omits the watched resource name lists, which can be very large in big meshes.Added support for Gateway API client certificate TLS configuration when using
agentgateway.Gatewayresources now honor frontend client certificate validation (spec.tls.frontend, includingAllowInsecureFallbackmode) and backend client certificates (spec.tls.backend.clientCertificateRef), and report the correspondingResolvedRefsandInsecureFrontendValidationModeconditions in status.Added a new
backendUtilizationload balancer policy toDestinationRule. It uses the utilization that backends report through ORCA load reports to dynamically weight endpoints, so that endpoints reporting higher utilization receive proportionally fewer requests. This is implemented with Envoy’sclient_side_weighted_round_robinload balancing policy. (Issue #60814)Added support for cluster-level connection buffer limits (
clusterPerConnectionBufferLimitBytes) viaconnectionSettingsinProxyConfig, includingEDGEprofile defaults for gateway proxies.Added a
defaultInboundHttpRetryPolicymesh config field to configure the default retry policy applied to inbound routes on sidecars. Previously this policy was hardcoded to 2 attempts onreset-before-requestand could not be tuned or turned off. Onlyattempts,retryOnandbackoffapply; settingdefaultInboundHttpRetryPolicy: {}disables inbound retries mesh-wide.Added a new
MERGE_AND_REPLACE_LISTpatch operation toEnvoyFilter. It behaves likeMERGE, except that repeated (list) fields present in the patch fully replace the corresponding list in the generated configuration instead of being appended to it. This applies to theCLUSTER,LISTENER,FILTER_CHAIN,ROUTE_CONFIGURATION,VIRTUAL_HOST,HTTP_ROUTE,NETWORK_FILTER,HTTP_FILTER, andLISTENER_FILTERpatch targets, including lists nested insideAny-typed configurations such as filtertyped_config.Added support for the
transportSocketfield in theEnvoyFilterfilter chain match, allowing patches to select filter chains by the transport socket they are configured with, such asenvoy.transport_sockets.tlsfor filter chains that terminate TLS. UnliketransportProtocol, which matches the traffic a filter chain accepts, this matches the extension that processes the connection bytes.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)Added the
failurePercentageThresholdfield toDestinationRule.OutlierDetection, allowing hosts to be ejected based on their failure rate over the analysisintervalinstead of requiring consecutive failures. Unlikeconsecutive5xxErrorsandconsecutiveGatewayErrors, a host’s errors do not need to occur back-to-back, so a host with a high failure rate is still ejected even if its failures are interspersed with successful requests.Added support for overriding the ALPN protocols advertised by TLS-terminating gateways with the
Gatewayresource’salpnProtocolsfield.Added support for
globalDownstreamConnectionLimitinProxyConfig.connectionSettings, providing a first-class API field for configuring the global downstream connection limit. This takes precedence over the existingISTIO_META_GLOBAL_DOWNSTREAM_MAX_CONNECTIONSmetadata and the deprecatedoverload.global_downstream_max_connectionsruntime flag. (Issue #57973)Added support for applying
ProxyConfigresources with workload selectors in the mesh root namespace to matching workloads across all namespaces. A matching workload-scopedProxyConfigin the workload’s own namespace takes precedence over the root namespace configuration.Added synthesis of
x-forwarded-client-certon sidecars for traffic arriving over HBONE.Fixed the ambient node-untaint controller removing the
cni.istio.io/not-readytaint when onlyistio-cniwas ready. It now also waits for ztunnel to be ready on the node, so pods are not scheduled onto a node whose ztunnel is still wedged. This can be disabled withPILOT_NODE_UNTAINT_CHECK_ZTUNNEL=false, and only applies when ambient is enabled. (Issue #52073)Fixed an issue where enabling ambient multi-network for ingress gateways broke ingress gateway routing to sidecar pods; the issue prevented sidecar and ambient co-existing in the same Istio multi-network deployment. (Issue #60609)
Fixed a bug where Gateway API listeners using the
OPTIONAL_MUTUALTLS termination mode failed to authorize the client CA secret for SDS, leaving the validation context stuck in a WARMING state. The CA certificate reference is now authorized forOPTIONAL_MUTUALthe same way it already was forMUTUAL. (Issue #60618)Fixed a bug where a
ServiceEntrywhose address is a CIDR generated an outbound listener on the 0.0.0.0 wildcard for a reserved proxy port (for example the outbound capture port 15001). The wildcard listener collided with thevirtualOutboundlistener, the whole listener update was rejected, and the sidecar failed to start. Such ports are now skipped, matching the behavior for services with a concrete address. (Issue #60666)Fixed an issue in ambient mode where the CNI node agent’s auto-detected
iptablesbackend (legacyvsnft) could flip between agent restarts, causing duplicate redirect rules to be written into already-enrolled pods. (Issue #61020)Fixed NDS name table generation for headless services to include endpoints from all service ports, not just the first port. Previously, when Kubernetes split
EndpointSliceresources by port subset (e.g., heterogeneoustargetPortnames across pod pools), only pods present in the first-port slice were included in the DNS name table, causingNXDOMAINfor other pods’ per-pod hostnames on remote clusters. (Issue #61038)Fixed an issue where istiod CPU usage increased as the number of
AuthorizationPolicyresources increased. (Issue #61254)Fixed
ALLOW_ANY_DYNAMIC_DNStraffic failing in IPv6-only clusters because Envoy used the IPv4 loopback address to reach the DNS proxy. (Issue #61330)Fixed a panic when
outlierDetectionis applied to a DNS-proxying (DFP) wildcard cluster.CommonLbConfigwas nil on the clusters built bybuildDFPCluster, so settingHealthyPanicThresholddereferenced a nil pointer. It is now initialized for both the DFP and allow-any DFP clusters, with a nil guard before the assignment. (Issue #61450)Fixed an issue where istiod repeatedly serialized the same workload when pushing workload metadata to Envoy proxies. (Issue #61502)
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 the Istio CNI agent panicking when a pod’s status contained an invalid IP address. Invalid addresses are now logged and skipped.
Fixed a
Gatewayresource with an HBONE listener being sent to sidecars as an mTLS gateway. (Issue #61618)Fixed an issue where Envoy proxies subscribed to Workload metadata discovery (MDS) did not receive incremental workload updates for Address-only changes when
AMBIENT_SCOPED_ADDRESS_PUSHESwas enabled (the default).Fixed a
panicin istiod when generating aSTRICT_DNS/LOGICAL_DNScluster for aServiceEntrywithresolution: DNSwhoseendpointsspan more than onelocality, combined with aDestinationRulethat setstrafficPolicy.loadBalancer.localityLbSetting.failoverPriority. Previously, istiod would crash and enter a crash loop as soon as an affected proxy connected, preventing any configuration from being pushed. (Issue #61857)Fixed several issues in the
istio-cniHelm chart. It did not respect theistioOwnedCNIConfigFileNamevalue, did not restartistio-cniwhen its config changed, did not remove the owned CNI config or theistio-cniplugin from the primary CNI config on uninstall, did not clean up the primary CNI config when the owned config was enabled, and did not remove the previous file when the owned config filename changed. (Issue #61890)Fixed concurrent push context initialization when EDS debouncing is disabled. (Issue #61924)
Fixed an issue where, with
PILOT_FILTER_GATEWAY_CLUSTER_CONFIGenabled, incremental CDS pushes removed gateway clusters forServiceresources listed in theenvoyfilter.istio.io/referenced-servicesannotation of anEnvoyFilter. These clusters were only restored on the next full push. (Issue #62067)Fixed a situation where fetching the JWKS could block xDS generation. (PR #62486)
Fixed an issue where an
agentgatewaywaypoint that a service referenced only as its canary, via theistio.io/use-waypoint-canarylabel, was not programmed with the routes and policies attached to that service. Connections shifted to the canary waypoint were rejected, because the waypoint had no configuration for the service it was fronting. (Issue #61036)Fixed nondeterministic route selection when multiple
TCPRoutes orTLSRoutes attach to the sameagentgatewayGatewaylistener. The oldest route (by creation timestamp, then namespace/name) is now consistently selected, following the Gateway API conflict-resolution rules. Previously the route bound to the listener was not deterministic, so traffic could reach the wrong backend.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 an issue where the CNI did not remove ipset entries for a pod that had failures during creation. All ipset entries associated with the pod are now removed.
Fixed an issue in ambient multi-network mode where the
kubernetes.defaultservice could be marked as globally scoped byserviceScopeConfigs, causing the API server service to be shared across clusters. Thekubernetes.defaultservice is now always treated as cluster-local.Fixed an issue where the network gateway selected for a workload was picked in a random order when a network had more than one gateway entry, which caused unnecessary workload (WDS) pushes on every recompute and could alternate the gateway address a workload uses.
Fixed a memory leak affecting istiod ambient multi-cluster mode where rotating a remote cluster’s credentials leaked that cluster’s entire cached state. (Issue #60033)
Fixed the
istio.io/use-waypoint-canarylabel bypassing theserviceEntryVisibilityNAMESPACE isolation: a NAMESPACE-visibilityServiceEntrycould route its canary share of traffic through a waypoint in another namespace. The canary waypoint is now subject to the same cross-namespace refusal as the primary.This issue was reported by Raphael Zanarelli.
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 istiod permanently retained a copy of every workload resource name for each Envoy MDS (WDS, used for telemetry metadata lookups) connection that sent
initial_resource_versions.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 headlessServiceresources with non-HTTP ports a push to every proxy, even though the endpoints were unchanged.Fixed an
EnvoyFilterLISTENER_FILTERMERGEpatch corrupting the listener filters shared by all proxies and being applied to listener filters that did not matchmatch.listener.listenerFilter.Fixed configuration dependency filtering for gateways to exclude unrelated configuration updates. Gateway scope construction also skips collecting mesh
VirtualServiceresources used only for waypoint routing.Fixed a Gateway API issue where a cross-namespace TLS
certificateReforcaCertificateRefwas resolved before theReferenceGrantauthorization check, so a listener’sResolvedRefsstatus could distinguish whether the referencedSecretorConfigMapexisted even when no grant permitted the reference. Authorization now runs first, returningRefNotPermittedfor any ungranted cross-namespace reference.This issue was reported by Darryl Jaskolski.
Fixed an HBONE stream leak in ambient mode where
connect_originatestreams could stay open forever after a peer fully closed the connection, via the Envoy update included in this release. (Issue #60074)This issue was reported by Torben Strüver.
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 a memory leak in ambient multi-cluster mode where collections were registered with the krt debugger but never unregistered when a remote cluster was removed or its configuration changed, causing debugger registrations to accumulate over time. (Issue #60033)
Fixed ambient multi-cluster dropping configuration from a remote cluster while its per-cluster collections were being swapped, for example when its credentials were rotated. The swap was seen as the removal of one cluster and the addition of an unrelated one, so services, waypoints and workloads from that cluster could briefly disappear from the config served to proxies, and events happening during the swap could be missed entirely. (Issue #61348)
Fixed Istio components hanging indefinitely when a Kubernetes API request got 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.Fixed listener conflict tracking treating a
Gatewayand aListenerSetwith the same namespace and name as the same object, which caused a conflict recorded for one to mark the other’s winning listener asConflictedand stop it from being programmed.Fixed
ListenerSetconflict resolution for hostname and protocol conflicts. Conflicting listeners are now correctly rejected andListenerSetstatus conditions report in compliance with Gateway API 1.5. (PR #60775)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 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
ServiceEntryresources with a present but empty workload selector incorrectly matching all workloads in their namespace.Fixed a pod in a remote cluster selected by a
ServiceEntrynot being recomputed when it became an endpoint of that service. The recompute was addressed to the cluster istiod runs in rather than the cluster the pod belongs to.Fixed a
WorkloadEntryselected by aServicenot having its corresponding proxy recomputed when it became an endpoint of that service.Fixed
observedGenerationgetting stuck on a stale value when a resource is modified again while an earlier status write is still queued.Fixed a crash in istiod when the address of an IP-addressed waypoint was also claimed by another service (for example, a
ServiceEntryin a different namespace). Colliding addresses are now skipped with a warning instead of panicking, which previously allowed a low-privileged tenant to crash the control plane. See GHSA-7p2q-4xvg-vxc6. Reported by @yshch.Fixed unhealthy endpoint propagation when
PILOT_AUTO_SEND_UNHEALTHY_ENDPOINTSorPILOT_SEND_UNHEALTHY_ENDPOINTSis enabled. Unready pods selected byServiceEntryresources and unhealthy health-checkedWorkloadEntryresources selected by KubernetesServiceresources orServiceEntryresources are now retained with their health status instead of being omitted.Fixed
VirtualServicevalidation skipping the remaining gateway names after an entry without a namespace ingatewaysand in HTTP/TLS/TCP matchgateways. Invalid gateway names listed after such an entry are now rejected.Fixed
VirtualServicevalidation accepting HTTP status600infault.abort.httpStatusanddirectResponse.status. Envoy only allows status codes in the range 200-599 for these fields, so such values are now rejected by validation.Fixed a regression that prevented WDS pushes from skipping debouncing. The new
PILOT_ENABLE_WDS_DEBOUNCEenvironment variable controls this and is enabled by default. Set it tofalseto allow WDS pushes to skip debouncing independently of EDS pushes. (Issue #62125)Optimized
EnvoyFiltermerge patch processing by caching decoded typed configurations, avoiding repeated unmarshalling during xDS configuration generation.Optimized configuration pushes to gateways. Istiod now tracks the
VirtualServiceresources bound to theGatewayresources that each ingress gateway or ambient east-west gateway serves, and only pushes aVirtualServicechange to the gateways it is bound to, instead of to every gateway in the mesh. This also optimizes CDS and RDS generation for gateways.Optimized proxyless gRPC route generation by skipping rebuilds for updates that do not affect routes, such as endpoint-only changes.
Security
Improved the evaluation of
ALLOWpolicies on routes targeted by anAuthorizationPolicy. A route-scopedALLOWpolicy is evaluated together with the gateway’s ownALLOWpolicies, so a request is permitted if it matches either. A route-scopedALLOWpolicy therefore widens access on that route rather than restricting it, consistent with howALLOWpolicies in the root and workload namespaces already combine. Route-scopedDENYpolicies are additive and cannot override aDENYpolicy defined for the gateway or in the root namespace. (Issue #60964)Updated the
distrolessimages to acgr.dev/chainguard/staticbase with the latest CA bundle, which removesemSign ECC Root CA - G3following the compromise of eMudhra intermediate CA keys.Added experimental support for targeting Gateway API
HTTPRouteresources from anAuthorizationPolicyviatargetRefs, allowingALLOWandDENYrules to be scoped to an individual route rather than the entire gateway. This is disabled by default and is enabled by settingENABLE_GATEWAY_API_HTTPROUTE_AUTH=trueonistiod. The policy must live in the same namespace as theHTTPRouteit targets, and only ingress gateways are supported; waypoints and sidecars ignore these policies.CUSTOMandAUDITactions cannot be targeted at anHTTPRoute, and anHTTPRoutetarget reference cannot be combined with target references of other kinds in the same policy. (Issue #60964)Added analyzer message
IST0178, which warns when anEnvoyFilterinserts an HTTP filter while anAuthorizationPolicytargeting anHTTPRouteis present.EnvoyFilterresources that clear the routing cache after a route-dependent filter has run can cause a request to be routed differently than it was when the filter was evaluated. (Issue #60964)Added a
WORKLOAD_IDENTITY_SOCKET_TIMEOUTenvironment variable topilot-agent, which configures how long to wait at startup for an external SDS provider, such as SPIRE, to create and start serving on the workload identity socket. Without configuring the timeout, the socket is checked only once at startup, so a provider that binds its socket afterpilot-agentstarts could cause the proxy to request the system root CA from the external SDS provider, failing upstream TLS validation. Defaults to0s, which preserves the existing single-check behavior. (Issue #61343)Added the
PILOT_DISABLE_SELF_SIGNED_CAenvironment variable to istiod. When set totrue, istiod fails to start its CA instead of generating or reusing a self-signed root CA (istio-ca-secret) when no plugged-incacertsbundle is present. This allows deployments that must only use a plugged-in CA to fail closed rather than falling back to an unintended self-signed root. The default isfalse.Added support for configuring ECDH curves for TLS-terminating gateways with the
Gatewayresource’secdhCurvesfield.Added a
presencefield toJWTRuleinRequestAuthentication. When set toREQUIRED, the JWT token for that rule must be present and valid; requests without it are rejected with401 Unauthorized. Previously, configuring multiplejwtRulesvalidated each token independently but allowed requests with only one valid token to pass. Settingpresence: REQUIREDon each rule enforces that all configured tokens must be present and cryptographically valid. This is useful when workloads must receive tokens from multiple issuers on distinct headers, for example an identity token inAuthorizationand a scope token in a custom header. The field defaults toOPTIONAL, preserving existing behavior for currentRequestAuthenticationresources. When multipleREQUIREDrules are configured, claims from all validated tokens are accessible inAuthorizationPolicyviarequest.auth.claims. Each provider’s payload is stored under its own metadata key, so authorization rules can reference claims from any of the required tokens. (Issue #60823)Fixed the ability to clear the Certificate Revocation List (CRL) by either specifying the empty string as the
ca-crl.pemor removing it. (Issue #61073)Fixed an incorrect status message for
DENYAuthorizationPolicyresources with only HTTP attributes in ambient mode. These policies are not enforced by ztunnel (empty matches are skipped), so the status now reports that they have no effect and recommends deploying a waypoint proxy with atargetRef. (Issue #61126)Fixed the JWKS resolver forcing all public-key fetches to HTTP/1.1. The custom
TLSClientConfigandDialContextused for TLS pinning and CIDR blocking caused Go’snet/httpto disable automatic HTTP/2, so ALPN never negotiated h2. HTTP/2 is now re-enabled (matchinghttp.DefaultTransport), fixing JWKS fetches that fail over HTTP/1.1 through some HTTP CONNECT proxies. (Issue #61250)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 a crash in istiod in ambient mode when an
AuthorizationPolicyhad an emptytoorfromentry. Such entries are now treated as an emptyoperationorsource, matching the sidecar behavior.Fixed an mTLS bypass in ambient mode where a port-level
STRICTPeerAuthenticationwas not enforced when the workload-level mode wasPERMISSIVEorDISABLEand the mesh-wide mode wasSTRICT. Plaintext traffic could reach that port.Fixed
AuthorizationPolicyconditions onrequest.headers[:authority]andrequest.headers[host]being bypassed by changing the case of the host. These conditions are now matched case-insensitively, the same ashosts.Fixed
AuthorizationPolicymethod rules being bypassed over HTTP/2 by changing the case of the method (e.g.postforPOST). Method matching is now case-insensitive. See GHSA-w44g-8m76-8gc5. Reported by @izzysec.Fixed a fail-open in
BackendTLSPolicywhere sidecar proxies sent upstream traffic in plaintext instead of failing closed when a policy’scaCertificateRefscould not be resolved.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": [...]}), but the background refresh did not, so aRequestAuthenticationjwksUripointed at an unintended internal endpoint could have its response cached and served back as if it were a JWKS. The background refresh path now applies the same check.This vulnerability was discovered and reported by Anthropic and Ada Logics.
Fixed an SSRF gap in istiod’s
RequestAuthenticationjwksUrifetching.istiodnow blocks link-local and known cloud metadata addresses (such as169.254.169.254) at the dial level by default and rejects fetched responses that are not a valid JWKS. Private and loopback ranges remain reachable and can be blocked withBLOCKED_CIDRS_IN_JWKS_URIS.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.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 stolenistio-token. Deployments that legitimately requested certificates with TTL >48hvia this path should raiseMAX_RA_WORKLOAD_CERT_TTLafter upgrade. Reported by Juno Im.Fixed istiod failing to start when the self-signed CA certificate in
istio-ca-secrethas expired, which can happen when the deployment is scaled to zero for longer than the certificate TTL. The expired certificate is now automatically renewed using the existing private key.Fixed a bug where the authorization check for gateway secret access did not include the service account’s Kubernetes groups. As a result,
RoleBindingandClusterRoleBindingrules granting secret access to groups such assystem:serviceaccounts:<namespace>were ignored, and gateways were denied access to credentials they had been granted. (Issue #58120)Fixed several
sidecar.istio.io/*annotations (proxyImage,bootstrapOverride,logLevel,componentLogLevel,agentLogLevel) being interpolated into the sidecar/gateway injection templates without output escaping, which could allow a crafted annotation value to inject additional fields into the generated pod or deployment spec. These annotations are now escaped consistently at every template sink.This vulnerability was discovered and reported by localhost-detect.
Fixed an issue where a new inbound connection reusing the 4-tuple of a torn-down connection could bypass the sidecar proxy by matching a stale
conntrackESTABLISHEDentry. A rule matching onlySYNpackets is now evaluated ahead of theESTABLISHEDdivert rule in bothiptablesandnftablesmodes.Fixed SSRF protection gaps in Wasm module fetching (
pkg/wasm). The HTTP fetcher previously had no restriction on destination IP at all, and the OCI image fetcher’s SSRF protection only inspected401bearer-realm responses, not3xxredirects on the actual manifest/blob fetch. Both fetchers now block connections to link-local addresses (which includes cloud instance metadata endpoints such as169.254.169.254) at the dial level, so the block applies to the original request and to every redirect hop, regardless of whether the redirect target is an IP literal or a hostname that resolves to one. A newBLOCKED_CIDRS_IN_WASM_FETCHenvironment variable lets operators additionally block private ranges or specific in-cluster addresses if desired.The image fetcher redirect bypass was reported by 박현범 and independently by Svpernova. The unrestricted HTTP fetcher was reported by Aser Ahmed.
Fixed waypoint proxies failing to receive remote JWKS clusters when a
RequestAuthenticationpolicy uses a servicetargetRef.Fixed istiod accepting a node metadata
CLUSTER_IDthat differs from the cluster the proxy’s token was validated against.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.This issue was reported by 박현범.
Fixed a crash in istiod where an
istio.io/debugxDS request with a malformed resource name caused a nil pointer dereference. The request is now rejected withInvalidArgument.Fixed a crash in ztunnel where an inbound HBONE request with a malformed
traceparentheader caused an index-out-of-bounds panic, dropping all streams on that connection. Invalidtraceparentheaders are now ignored and a new trace ID is generated.
Telemetry
Improved mesh configuration load failure reporting with source-specific error and fallback logging and a new
istiod_mesh_config_load_errors_totalcounter. (Issue #61563)Added native Prometheus protobuf passthrough through
pilot-agent’s metrics merger. When a Prometheus scraper sendsAccept: application/vnd.google.protobuf; proto=io.prometheus.client.MetricFamily; encoding=delimited, Envoy’s native (sparse) histograms now reach the scraper unchanged instead of being silently degraded by text-format re-encoding. The pre-existing text/OpenMetrics scrape path is byte-for-byte unchanged. (Issue #49950)Added a new
istio_agent_scrape_format_total{format,downgrade}counter topilot-agentthat reports the format negotiation outcome per scrape (text/openmetrics/protobuf, with a downgrade indicator when upstreams disagree). (Issue #49950)Added support for waypoints to record HTTP metrics for cross-cluster traffic using protocols such as TLS or PROXY when
AMBIENT_ENABLE_MULTI_NETWORKandAMBIENT_ENABLE_TLS_PROXY_HTTP_METRICSare enabled.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 the
sidecar.istio.io/statsFlushIntervalannotation producing an invalid Envoy bootstrap for values of one minute or more, and for sub-second values, which prevented the proxy from starting.Fixed the
sidecar.istio.io/statsEvictionIntervalannotation silently truncating sub-second precision.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)
Extensibility
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 allowlisted via
WASM_INSECURE_REGISTRIES.This vulnerability was discovered and reported by Adam Korczynski.
Installation
Updated Kiali addon to version v2.34.1.
Added a
terminationGracePeriodSecondsfield to the istiod (Pilot) Helm values, allowing the istiodDeployment’s pod termination grace period to be configured. Defaults to 30 seconds, matching the previous behavior.Added a
daemonSetAnnotationsvalue to theistio-cnichart, to set annotations on the CNIDaemonSetobject itself. The chart already supporteddaemonSetLabelsfor labels andpodAnnotationsfor the pods, but theDaemonSet’s own annotations could not be set.Added support for specifying a custom
nodePortfor each port in the network gateway configuration. (Issue #61569)Added
values.sidecarInjectorWebhook.revisionLabelPrecedenceto configure revision-label precedence for sidecar injection.The default value is
namespace, which preserves existing behavior. Setting this topodallows a podistio.io/revlabel to override a namespaceistio.io/revlabel. (Issue #48316), (Issue #48317)Fixed istiod preferring the CA cert from the separately-mounted, always-present
istio-ca-root-certConfigMap(/var/run/secrets/istiod/ca/root-cert.pem) over the CA cert co-located with the DNS serving cert (/var/run/secrets/istiod/tls/ca.crt) when both exist. This could cause theMutatingWebhookConfiguration/ValidatingWebhookConfigurationcaBundleto not match the CA after the DNS serving cert is provisioned externally (e.g. by cert-manager istio-csr or a manually createdSecret), even though istiod itself correctly served TLS with the new certificate. (Issue #60774)Fixed the gateway Helm chart’s
NetworkPolicyresource name including the revision, which caused theNetworkPolicyto be deleted and recreated when the gateway’s revision changed instead of being updated in place. (Issue #61016)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
istioctl installandistioctl manifest generaterejecting thecni.ambient.enablementSelectors,cni.ambient.shareHostNetworkNamespaceandcni.ambient.enableAmbientDetectionRetryvalues. Theistio-cnichart supports them, but they were missing from theIstioOperatorvalues schema, so they could only be set by installing the chart directly with Helm. (Issue #61180)Fixed the
defaultchart’sValidatingWebhookConfigurationstill hardcodingfailurePolicy: Ignore, which caused the same field manager conflict onhelm upgradewith server-side apply that was previously fixed for thebaseandistiodcharts. (Issue #61613)Fixed the sidecar injector not validating the
traffic.sidecar.istio.io/includeOutboundPortsannotation. A malformed value is now rejected at admission, consistent with the sibling traffic port annotations and the CNI redirect path.Fixed istiod only tolerating the default
cni.istio.io/not-readytaint. Whentaint.nameis set to a custom taint, the istiodDeploymentnow tolerates that taint, so istiod can be scheduled onto nodes that still carry it. (Issue #52073)Removed the
GOMAXPROCSenvironment variable from all Istio charts. Go 1.25 automatically setsGOMAXPROCSto match CPU limits. (Issue #60235)
istioctl
Improved
istioctl analyzeerror reporting when an explicitly specified--meshConfigFilecannot be read or parsed.Updated minimum supported Kubernetes version to 1.33.x.
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).istioctlnow verifies the server against the Istio root certificate from theistio-ca-root-certConfigMapand 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. (Issue #41937)This issue was reported by Leon Zlobecki.
Fixed
istioctl analyzebuilding Kubernetes clients directly fromistio-systemmulticluster secrets without sanitizing the kubeconfig, which could allow a crafted secret to run anexeccredential plugin (or read local files via other unsafe auth fields) on the machine runningistioctl. The kubeconfig is now sanitized the same way istiod already sanitizes these secrets.This vulnerability was discovered and reported by Adam Korczynski.
Fixed
istioctl install --set values.base.validationFailurePolicybeing rejected as an unknown field. The value was already supported by thebaseandistiodcharts, but was missing from the operator’svalues_types.protoschema.Fixed
istioctl bug-reportcrashing when an include or exclude filter has too many fields.Fixed
istioctl bug-report --durationnot filtering logs when used without--end-time.Fixed
istioctl install --setnot supporting several Helm chart values that were missing from the operator’svalues_types.protoschema. The following values can now be set:cni.terminationGracePeriodSeconds,cni.updateStrategy,cni.seLinuxOptions,cni.tolerations,pilot.initContainers,pilot.pdb,pilot.deploymentAnnotations,pilot.sidecarInjectorWebhookAnnotations,pilot.trustedZtunnelName,global.proxy_init.forceApplyIptablesandglobal.waypoint.tolerations.Fixed
istioctl manifest translatewriting unquoted values fromIstioOperatorinput (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.This vulnerability was discovered and reported by OpenSec Intelligence.
Fixed
istioctl analyzesoVirtualServicereferences to Kubernetes Gateway APIGatewayresources no longer produce falseReferencedResourceNotFounderrors. (Issue #60708)