⚠️ Action Required
Immediate patching required to address critical security updates and enhance Istiod stability.


πŸ“ Summary

Istio 1.30.7 delivers essential security enhancements and crucial bug fixes for improved reliability. A critical update addresses the emSign ECC Root CA - G3 distrust by refreshing distroless base images, bolstering the trust chain for Istio components. This release also resolves a significant Istiod startup issue where expired self-signed CA certificates now automatically renew, preventing service interruptions after prolonged scale-to-zero periods. For authorization, :method header matching in policies is now case-insensitive, aligning with expected behavior. Ambient mesh users can opt-in to a new feature (PILOT_NODE_UNTAINT_CHECK_ZTUNNEL=true) that ensures ztunnel readiness before scheduling pods to untainted nodes, preventing workloads from landing on unready proxies. Furthermore, istioctl bug-report --duration now filters logs correctly, even without an --end-time specified, streamlining diagnostics. Multiple dependency updates round out this release, reinforcing the mesh’s security posture and overall operational stability. Upgrade promptly to benefit from these vital improvements.


πŸ”’ Addressing Distroless Image Certificate Distrust

A critical security update in Istio 1.30.7 bolsters the trust chain of Istio components by addressing the distrust of the emSign ECC Root CA - G3. This update ensures that your Istio deployments are no longer affected by the compromise of certain eMudhra intermediate CA keys, maintaining the integrity and security of certificate validation within your mesh.

The fix involves bumping the base distroless image to a newer cgr.dev/chainguard/static digest. This updated image includes the latest CA bundle, which explicitly removes the compromised emSign ECC Root CA - G3. This is a foundational update, automatically applied when you rebuild or deploy Istio images that use the distroless base.diff--- a/docker/Dockerfile.distroless+++ b/docker/Dockerfile.distroless@@ -1,5 +1,5 @@ # prepare a distroless source context to copy files from-FROM cgr.dev/chainguard/static@sha256:77d8b8925dc27970ec2f48243f44c7a260d52c49cd778288e4ee97566e0cb75b AS distroless_source+FROM cgr.dev/chainguard/static@sha256:17367e4d3ae2b46c3290858e483fac09be085c92b372360fe3bf6a6150848fde AS distroless_source

Source:

  • docker/Dockerfile.distroless (1-5)
  • releasenotes/notes/distroless-emudhra-distrust.yaml (1-6)

πŸ” Robust Self-Signed CA Certificate Renewal

Istio 1.30.7 significantly enhances the resilience of istiod by fixing a critical startup issue that could occur when its self-signed CA certificate in istio-ca-secret had expired. Previously, if istiod was scaled to zero for longer than its certificate TTL, it could fail to restart. This update eliminates that risk, ensuring continuous availability of your control plane even after extended downtimes.

The certificate authority (CA) logic has been refactored to detect expired certificates during startup. Instead of failing, istiod will now automatically renew the self-signed CA certificate using the existing private key, seamlessly rotating the certificate without requiring manual intervention. This ensures that istiod can always come up and issue new workload certificates.go// Inside NewSelfSignedIstioCAOptions function in ca.go// ... } else if isCertExpired(loadErr) { pkiCaLog.Infof("Expired CA cert in secret %s, will renew", caCertName) b := backoff.NewExponentialBackOff(backoff.DefaultOption()) if err := b.RetryWithContext(ctx, func() error { err := renewSelfSignedCaSecret(client, namespace, caCertName, rootCertFile, caCertTTL, org, dualUse, caRSAKeySize, caOpts) // another replica rotated certificate if apierror.IsConflict(err) { return loadSelfSignedCaSecret(client, namespace, caCertName, rootCertFile, caOpts) } return err }); err != nil { return nil, err }} // ...

Source:

  • security/pkg/pki/ca/ca.go (149-166, 503-535)
  • security/pkg/pki/ca/ca_test.go (476-508)
  • releasenotes/notes/renew-expired-self-signed-ca.yaml (1-8)

✨ Enhanced Authorization Policy Method Matching

This release refines how authorization policies match the :method header, making them more intuitive and resilient to variations in client requests. Previously, matching HTTP methods like GET or POST in authorization rules could be unexpectedly case-sensitive. Now, your policies will correctly evaluate method headers regardless of their casing, simplifying policy definitions and preventing unintended access issues.

The change updates the internal logic for header matching in authorization policies. Specifically, when evaluating the :method header, Istio now performs a case-insensitive comparison using strings.EqualFold, ensuring that GET, get, or Get are all treated identically.go// Inside pilot/pkg/security/authz/model/generator.go// ... headerMatcher := matcher.HeaderMatcher if strings.EqualFold(header, methodHeader) { headerMatcher = matcher.MethodMatcher } // ...

Source:

  • pilot/pkg/security/authz/model/generator.go (362-365)
  • pilot/pkg/security/authz/model/generator_test.go (427-449)

ambient Node Untaint Controller Improvement

For users adopting Istio’s ambient mesh, this update introduces a significant safeguard to ensure application stability. The node-untaint controller, responsible for marking nodes ready for scheduling after CNI installation, now offers an opt-in mechanism to wait for ztunnel to be fully ready on a node before removing the cni.istio.io/not-ready taint. This prevents pods from being scheduled onto nodes where the ztunnel proxy might still be initializing or wedged, enhancing the reliability of workload deployments in ambient mode.

A new feature flag, PILOT_NODE_UNTAINT_CHECK_ZTUNNEL, when set to true, activates this enhanced readiness check. The controller will now not only verify the istio-cni pod’s readiness but also confirm the presence and readiness of ztunnel pods in the configured namespaces (derived from CA_TRUSTED_NODE_ACCOUNTS) on that node. This flag is false by default in this release branch, requiring explicit activation for its behavior.go// In pilot/pkg/features/pilot.goNodeUntaintCheckZtunnel = registerAmbient( "PILOT_NODE_UNTAINT_CHECK_ZTUNNEL", false, // opt-in on release branches: set true to require ztunnel ready before untainting false, // without ambient: no ztunnel exists, keep istio-cni-only behavior "If enabled, the node-untaint controller also requires ztunnel to be ready on a node before "+ "removing the readiness taint. Only applies when ambient is enabled.")// In pilot/pkg/controllers/untaint/nodeuntainter.go// ... if n.checkZtunnel { // Fetch registers a dependency, so this recomputes when ztunnel readiness changes. if len(krt.Fetch(ctx, readyZtunnelPods, krt.FilterIndex(ztunnelByNode, node.Name))) == 0) { log.Debugf("node %s has a ready cni pod but no ready ztunnel, keeping it tainted", node.Name) return nil } } // ...

Source:


πŸ› οΈ Improved istioctl bug-report Filtering

Diagnosing issues with istioctl bug-report just got easier. Previously, if you only specified a --duration without also providing an --end-time, the command might not have correctly filtered logs by time, potentially collecting too much irrelevant data. This release corrects that behavior, ensuring that your bug reports are more precise and focused, even when using simple duration-based filtering.

The logic for determining if a time filter is applied (config.TimeFilterApplied) has been updated to explicitly consider the --duration flag. Now, if --duration is set, the time filter is automatically enabled, resulting in more accurate log collection.go// In tools/bug-report/pkg/bugreport/flags.go// ...func parseTimes(config *config2.BugReportConfig, startTime, endTime string, duration time.Duration) error { config.TimeFilterApplied = startTime != "" || endTime != "" || duration != 0 // ...

Source:

  • tools/bug-report/pkg/bugreport/flags.go (165-172)
  • tools/bug-report/pkg/bugreport/flags_test.go (116-150)

Minor Updates & Housekeeping

This release includes various routine updates that ensure Istio’s continued stability and compatibility. Dependency bumps include github.com/klauspost/compress to v1.20.3 and internal updates to istio.io/api, istio.io/client-go, proxy, and common-files. Build tooling and BASE_VERSION strings have also been updated, alongside a minor refactor in the Gateway API controller that renames the getter interface to Getter for consistency.