On 15 October 2026 Istio published ISTIO-SECURITY-2026-007 and released 1.31.2, 1.30.6 and 1.29.9. The bulletin fixes two Istio bugs and two Envoy crashes. The one most meshes should look at first is an AuthorizationPolicy bypass: a DENY rule on POST did not match a request whose method was post, as long as the request arrived over HTTP/2.
The bulletin's overall score is CVSS 7.7. The same day, Istio 1.29 reached end of life, so 1.29.9 is the last release on that line.
What's affected
Affected releases are 1.31.0 to 1.31.1, 1.30.0 to 1.30.5 and 1.29.0 to 1.29.8. The fixed releases are 1.31.2, 1.30.6 and 1.29.9.
The bulletin covers four issues with advisory IDs:
| ID | CVSS | What it is |
|---|---|---|
| GHSA-w44g-8m76-8gc5 | 7.4 | AuthorizationPolicy method rules bypassed over HTTP/2 by changing the method's case |
| GHSA-7p2q-4xvg-vxc6 | 7.7 | istiod crash loop in ambient mode when a ServiceEntry claims the address of an IP-addressed waypoint |
| GHSA-8vc2-jrm4-835w | 7.5 | Envoy: unauthenticated crash in the OAuth2 HTTP filter on a CONNECT request with no :path header |
| GHSA-47vj-9r25-wv5j | 6.5 | Envoy: crash in the api_key_auth filter when hiding credentials on a CONNECT request with no :path header |
The method bypass. A DENY rule with methods, or an ALLOW rule with notMethods, was compiled into a case-sensitive match on the :method pseudo-header. HTTP/1.1 is safe because its codec rejects lowercase methods before authorization runs. HTTP/2 doesn't, so a client sending post instead of POST slipped past the rule and reached the workload. Policies that only use ALLOW with an explicit methods list fail closed and are not affected. The reporter is izzy0101010101.
The istiod crash. In ambient mode, istiod looked up the service owning an IP-addressed waypoint by network and IP alone. If a second service, such as a ServiceEntry in any namespace, claimed the same address, istiod panicked and kept crash-looping. Istio's bulletin is blunt about the effect: a user who can create ServiceEntry resources in their own namespace could stop configuration distribution and certificate rotation for the whole mesh. Hostname-addressed waypoints, the default, are not affected. The reporter is yshch.
The release also carries security fixes without CVEs, including a change so the Wasm OCI image fetcher no longer falls back to plaintext HTTP for registries not listed in WASM_INSECURE_REGISTRIES, and a new PILOT_ENABLE_STRICT_GATEWAY_MERGING flag on 1.29 and 1.30 (on by default from 1.31).
How to check if you're exposed
Check the control plane and data plane versions:
istioctl version
Find policies that rely on method matching in the vulnerable shape, DENY with methods or ALLOW with notMethods:
kubectl get authorizationpolicies.security.istio.io -A -o json | jq -r '
.items[]
| (.spec.action // "ALLOW") as $a
| select(
($a == "DENY" and ([.spec.rules[]?.to[]?.operation.methods // empty] | length > 0)) or
($a == "ALLOW" and ([.spec.rules[]?.to[]?.operation.notMethods // empty] | length > 0)))
| "\(.metadata.namespace)/\(.metadata.name) action=\($a)"'
If that prints anything and clients can reach those workloads over HTTP/2, you're exposed until you upgrade.
For the istiod crash, look for IP-addressed waypoints and check who can create ServiceEntries:
kubectl get gateways.gateway.networking.k8s.io -A -o json | jq -r '
.items[]
| select(.metadata.annotations["networking.istio.io/address-type"] == "IPAddress")
| "\(.metadata.namespace)/\(.metadata.name)"'
kubectl auth can-i create serviceentries.networking.istio.io \
-n team-a --as=system:serviceaccount:team-a:deployer
For the Envoy crashes, check whether you enable the OAuth2 or API key filters through EnvoyFilter resources:
kubectl get envoyfilters -A -o yaml | grep -nE "envoy.filters.http.(oauth2|api_key_auth)"
What to do now
- Upgrade the control plane and gateways to 1.31.2, 1.30.6 or 1.29.9, then restart sidecar workloads so the proxies pick up the new version. Confirm with
istioctl proxy-statusthat no proxy reports an old version. - Move off 1.29. It is end of life as of 15 October. Plan the hop to 1.30 or 1.31.
- Until you upgrade, rewrite risky method rules. Istio's interim advice is to replace DENY-with-
methodsand ALLOW-with-notMethodsrules with ALLOW policies that list permitted methods explicitly. An allowlist fails closed when the case doesn't match. - Lock down ServiceEntry creation if you run ambient with IP-addressed waypoints. Restrict create and update on
serviceentries.networking.istio.ioto mesh administrators, or switch waypoints back to hostname addressing. - After upgrading, test the bypass is gone from a pod inside the mesh, against a path your DENY rule covers:
curl -s -o /dev/null -w "%{http_code}\n" --http2-prior-knowledge \
-X post http://orders.shop.svc.cluster.local:8080/admin
A 403 means the rule now matches.
Why it matters
Deny lists in authorization policy depend on the attacker using the same spelling you used. HTTP methods are case-sensitive by specification, so a matcher that compares bytes is technically correct and practically wrong, because the protocol layer in front of it normalizes for one HTTP version and not the other. An allowlist of permitted methods doesn't have this failure mode, which is why it's the safer default for any rule that has to hold.
The istiod bug shows a different lesson. In a shared mesh, a namespace-scoped permission like creating a ServiceEntry can reach a cluster-wide component. When you review RBAC for tenants, count what each resource type can do to the control plane, not just to the tenant's own namespace.
Try it yourself
Run the jq query above against one cluster and list every policy it returns. For each one, write the equivalent ALLOW policy with an explicit methods list and apply it in a staging namespace. Then send the lowercase HTTP/2 request on an unpatched staging mesh and confirm the allowlist blocks it.
Quick check
Is a mesh that only uses ALLOW rules with an explicit methods list affected by the method bypass?
No. The bulletin says policies that only use ALLOW rules with an explicit methods list are not affected. A lowercase method simply fails to match the allowlist and is denied.
Why isn't HTTP/1.1 traffic affected?
Envoy's HTTP/1.1 codec rejects methods that aren't uppercase before authorization runs. Over HTTP/2 the method arrives as a pseudo-header and reached the case-sensitive matcher unchanged.
Which Istio 1.29 release fixes these issues, and what comes after it?
1.29.9 fixes them and is the final 1.29 release, since 1.29 reached end of life on 15 October 2026. The next step is 1.30 or later.