Envoy 1.40.0 Makes HTTP/3 and QUIC Stable, Adds X25519MLKEM768 to Default TLS Curves and Moves the Build to Bzlmod
Envoy 1.40.0, published October 13, lists HTTP/3 and QUIC as stable, adds a hybrid post-quantum key exchange to default TLS curves and moves its build to bzlmod.
Overview
The Envoy proxy project published version 1.40.0 on October 13, according to the v1.40.0 release page. The release notes list HTTP/3 and QUIC as stable, add the X25519MLKEM768 hybrid key exchange to the default TLS curves, and move the project’s build system from WORKSPACE to bzlmod. The release page also lists several breaking changes for people who build or embed Envoy.
What Changed
HTTP/3, QUIC and post-quantum TLS
The release notes state that HTTP/3 and QUIC are now stable, including upstream HTTP/3 and all QUIC extensions. QUIC listeners gain client-certificate (mTLS) support, upstream QUIC gains client certificates, and P-384 and P-521 ECDSA curves are supported.
On cryptography, the same page says the X25519MLKEM768 hybrid key exchange is added to the default ECDH curves for upstream and downstream TLS, including FIPS builds. The behavior can be reverted through the envoy.reloadable_features.pqc_default_ecdh_curves runtime flag, per the release page.
Routing and load balancing
According to the release notes, a new route_specifiers extension point post-processes the matched route at the route-config, virtual-host and route level, and can refine, drop or synthesize it. A priority-group cluster specifier and a dynamic-module route specifier build on it.
The notes also list two new load-balancing policies. The per_worker_subset policy decouples per-worker pool size from cluster size, and load_aware_locality picks localities using headroom derived from ORCA. Coalesced load-balancer rebuilds on EDS batch updates are now on by default, per the release page.
Container-aware CPU detection and draining
The release notes say container-aware CPU detection is now on by default whenever --concurrency is unset, whereas the behavior introduced in 1.37 was only active with --cpuset-threads. Draining is now event-driven: drain-close decisions are pushed to connections when the drain starts rather than polled per response. For UDP, established proxy sessions are kept by the parent process during hot restart while datagrams for unknown sessions are forwarded to the child.
AI and MCP filters
The release notes say the AI Protocol Manager filter, which remains in alpha, gains response-side LLM token-usage extraction for the OpenAI, Anthropic and Gemini dialects, published as typed dynamic metadata. The MCP filter gains per-route configuration, protocol-version enforcement and required client capabilities, among other changes.
Observability
The release page lists new access-log formatters for downstream handshake time points, connection round-trip time, listener name and route-resolution time. For OpenTelemetry it lists resource detectors, custom exporters and instrumentation scope, and says ext_authz and ext_proc now emit client spans. It also lists a fix for Prometheus native-histogram bucket indices being off by one, according to the v1.40.0 notes.
Breaking Changes
The release page groups the following under breaking changes:
- Build system: Envoy switched from
WORKSPACEto bzlmod, and theWORKSPACEfile is removed. Envoy, the API and the docs are published as Bazel modules namedenvoy,envoy_apiandenvoy-docs. Downstream projects must migrate toMODULE.bazeland add Envoy’s custom registry alongside the Bazel Central Registry (BCR). - Toolchain: The hermetic LLVM/Clang toolchain moves from version 18 to 22. The
--config=clangandclang-localoptions are removed, and GCC remains available through--config=gcc. - Wasm: The Wasm runtime is now selected with
--@proxy-wasm-cpp-host//bazel:engine=<engine>, and the old--define wasm=and--define engine=flags fail the build. - TLS: AWS-LC is removed as a selectable SSL library, including
--config=aws-lc-fips. The notes say ppc64le builds should use--config=openssl. - MCP router: Downstream request headers, notably
authorization, are no longer forwarded to backends by default. A new per-backendheader_forwardingsetting withforward_all: truerestores the old behavior. - Rust dynamic modules:
HttpFilterhooks now take&selfrather than&mut self, which the notes say closes a use-after-free on synchronous filter-chain teardown.
Security Fixes and Backports
The v1.40.0 notes say the release carries forward the 1.39.x security fixes, which they list by CVE identifier. Those include URL normalization of path parameters (CVE-2026-73511 and CVE-2026-73551) and an HTTP/3 use-after-free (CVE-2026-73512), according to the release page.
The notes also describe a family of races in which route-level configuration, covering AWS signing, composite, filter chain, local rate limit, dynamic modules and SDS secrets, could be destroyed on a worker thread after an RDS update. The day before the 1.40.0 release, on October 12, maintainers published patch releases for older lines. The v1.39.4 release lists fixes for those races along with a fix for a bug introduced in 1.38.0 that exported Prometheus native histogram bucket indices one bucket too low, causing consumers to underreport quantiles. The v1.38.7 release carries the same histogram fix and also bumps wasmtime to 24.0.10 to resolve CVE-2026-54786.
What We Don’t Know
The release pages are the only sources used here, and they do not include adoption figures, performance measurements for the new load-balancing policies, or migration timelines for downstream projects affected by the bzlmod switch.
Analysis
Taken together, the release combines runtime changes (stable HTTP/3, new defaults for TLS key exchange and CPU detection) with build-time changes that require action from anyone compiling Envoy or embedding it as a Bazel dependency. Operators running prebuilt binaries or container images mainly need to review the default-behavior changes listed above, such as the new TLS curve default, the MCP router header-forwarding change and the CPU detection change. Teams that build Envoy from source face the larger migration, since the WORKSPACE removal, the Clang 22 toolchain and the changed Wasm flags are all listed as breaking.