Skip to content

Releases: nodejs/undici

v8.12.2

Choose a tag to compare

@github-actions github-actions released this 15 Oct 15:04
bb6cc0a

Security fixes

High severity

Denial of service via TLS 1.2 certificate-changing renegotiation

CVE-2026-87018 · GHSA-qrxm-fqhp-jwvm

A malicious or compromised HTTPS server could crash the Node.js process by initiating TLS 1.2 renegotiation and presenting a different, CA-trusted certificate whose hostname did not match the requested host. The resulting socket error reached an assertion in undici's HTTP/1.1 and HTTP/2 connection handling. This release handles post-connect certificate errors without terminating the process.

TLS certificate validation bypass through dropped Agent options

CVE-2026-109383 · GHSA-2m5v-pch6-74hx

Agent used a JSON-based clone for constructor options, which silently removed function-valued TLS options such as checkServerIdentity. Applications relying on custom certificate or public-key verification could therefore accept a certificate that the callback was intended to reject. This release preserves TLS options when creating per-origin dispatchers.

Cache poisoning and cross-user disclosure through cross-origin redirects

CVE-2026-109829 · GHSA-4w7w-5xrc-9h26

When an originless Agent combined redirect and shared-cache interceptors as compose(redirect(), cache()), a response from a cross-origin redirect could be stored under the original URL. This could allow persistent cache poisoning or disclosure of user-specific responses to later callers. This release verifies the response origin before caching and preserves redirect-hop cache-control policy.

Denial of service through excessive Content-Encoding values

CVE-2026-109869 · GHSA-xjj6-f33q-929c

A malicious HTTP server could crash the Node.js process by returning more than five content codings and closing the connection before sending the body. Although fetch() rejected the response, an error from an orphaned internal stream could remain unhandled. This release validates the content-encoding chain before creating the body stream and aborts oversized chains safely.

Medium severity

Denial of service through the decompress interceptor

CVE-2026-87029 · GHSA-55wc-3pg8-jfw6

An exception thrown by a downstream response handler from an asynchronous decompression callback could escape as an uncaught exception. A server could trigger this when decompress was composed with a handler such as dump with a size limit. This release converts downstream handler exceptions into per-request errors.

Subresource Integrity bypass with non-lowercase algorithm tokens

CVE-2026-109841 · GHSA-f72v-6w45-q472

fetch() treated valid mixed-case or uppercase SRI algorithm tokens, such as SHA256, as unknown and could accept a response whose body did not match the configured digest. This release normalizes algorithm tokens before validation and digest selection.

Denial of service through unbounded EventSource parser state

CVE-2026-109924 · GHSA-4qv8-2p9j-2685

A malicious Server-Sent Events endpoint could exhaust process memory by sending many tiny data: fields without completing an event, or by splitting an unfinished line across many chunks. This release bounds retained EventSource parser state, including field counts, buffered chunks, unfinished-line length, and retained field data.

Denial of service through unbounded automatic WebSocket PONG buffering

CVE-2026-109932 · GHSA-9fm3-97px-rjf6

A malicious WebSocket server could exhaust process memory by flooding the client with PING frames while not reading the automatic PONG responses. undici previously ignored socket backpressure and allowed the outbound queue to grow without bound. This release pauses frame parsing when PONG writes encounter backpressure and resumes after the socket drains.

Full Changelog: v8.12.1...v8.12.2

v7.30.1

Choose a tag to compare

@github-actions github-actions released this 15 Oct 14:17
7507102

Security fixes

High severity

Denial of service via TLS 1.2 certificate-changing renegotiation

CVE-2026-87018 · GHSA-qrxm-fqhp-jwvm

A malicious or compromised HTTPS server could crash the Node.js process by initiating TLS 1.2 renegotiation and presenting a different, CA-trusted certificate whose hostname did not match the requested host. The resulting socket error reached an assertion in undici's HTTP/1.1 and HTTP/2 connection handling. This release handles post-connect certificate errors without terminating the process.

TLS certificate validation bypass through dropped Agent options

CVE-2026-109383 · GHSA-2m5v-pch6-74hx

Agent used a JSON-based clone for constructor options, which silently removed function-valued TLS options such as checkServerIdentity. Applications relying on custom certificate or public-key verification could therefore accept a certificate that the callback was intended to reject. This release preserves TLS options when creating per-origin dispatchers.

Cache poisoning and cross-user disclosure through cross-origin redirects

CVE-2026-109829 · GHSA-4w7w-5xrc-9h26

When an originless Agent combined redirect and shared-cache interceptors as compose(redirect(), cache()), a response from a cross-origin redirect could be stored under the original URL. This could allow persistent cache poisoning or disclosure of user-specific responses to later callers. This release verifies the response origin before caching and preserves redirect-hop cache-control policy.

Denial of service through excessive Content-Encoding values

CVE-2026-109869 · GHSA-xjj6-f33q-929c

A malicious HTTP server could crash the Node.js process by returning more than five content codings and closing the connection before sending the body. Although fetch() rejected the response, an error from an orphaned internal stream could remain unhandled. This release validates the content-encoding chain before creating the body stream and aborts oversized chains safely.

Medium severity

Denial of service through the decompress interceptor

CVE-2026-87029 · GHSA-55wc-3pg8-jfw6

An exception thrown by a downstream response handler from an asynchronous decompression callback could escape as an uncaught exception. A server could trigger this when decompress was composed with a handler such as dump with a size limit. This release converts downstream handler exceptions into per-request errors.

Subresource Integrity bypass with non-lowercase algorithm tokens

CVE-2026-109841 · GHSA-f72v-6w45-q472

fetch() treated valid mixed-case or uppercase SRI algorithm tokens, such as SHA256, as unknown and could accept a response whose body did not match the configured digest. This release normalizes algorithm tokens before validation and digest selection.

Denial of service through unbounded EventSource parser state

CVE-2026-109924 · GHSA-4qv8-2p9j-2685

A malicious Server-Sent Events endpoint could exhaust process memory by sending many tiny data: fields without completing an event, or by splitting an unfinished line across many chunks. This release bounds retained EventSource parser state, including field counts, buffered chunks, unfinished-line length, and retained field data.

Denial of service through unbounded automatic WebSocket PONG buffering

CVE-2026-109932 · GHSA-9fm3-97px-rjf6

A malicious WebSocket server could exhaust process memory by flooding the client with PING frames while not reading the automatic PONG responses. undici previously ignored socket backpressure and allowed the outbound queue to grow without bound. This release pauses frame parsing when PONG writes encounter backpressure and resumes after the socket drains.

What's Changed

New Contributors

Full Changelog: v7.30.0...v7.30.1

v6.29.1

Choose a tag to compare

@github-actions github-actions released this 15 Oct 14:17
8c57f6c

Security fixes

High severity

Denial of service via TLS 1.2 certificate-changing renegotiation

CVE-2026-87018 · GHSA-qrxm-fqhp-jwvm

A malicious or compromised HTTPS server could crash the Node.js process by initiating TLS 1.2 renegotiation and presenting a different, CA-trusted certificate whose hostname did not match the requested host. The resulting socket error reached an assertion in undici's HTTP/1.1 and HTTP/2 connection handling. This release handles post-connect certificate errors without terminating the process.

TLS certificate validation bypass through dropped Agent options

CVE-2026-109383 · GHSA-2m5v-pch6-74hx

Agent used a JSON-based clone for constructor options, which silently removed function-valued TLS options such as checkServerIdentity. Applications relying on custom certificate or public-key verification could therefore accept a certificate that the callback was intended to reject. This release preserves TLS options when creating per-origin dispatchers.

Denial of service through excessive Content-Encoding values

CVE-2026-109869 · GHSA-xjj6-f33q-929c

A malicious HTTP server could crash the Node.js process by returning more than five content codings and closing the connection before sending the body. Although fetch() rejected the response, an error from an orphaned internal stream could remain unhandled. This release validates the content-encoding chain before creating the body stream and aborts oversized chains safely.

Medium severity

Denial of service through unbounded EventSource parser state

CVE-2026-109924 · GHSA-4qv8-2p9j-2685

A malicious Server-Sent Events endpoint could exhaust process memory by sending many tiny data: fields without completing an event, or by splitting an unfinished line across many chunks. This release bounds retained EventSource parser state, including field counts, buffered chunks, unfinished-line length, and retained field data.

Denial of service through unbounded automatic WebSocket PONG buffering

CVE-2026-109932 · GHSA-9fm3-97px-rjf6

A malicious WebSocket server could exhaust process memory by flooding the client with PING frames while not reading the automatic PONG responses. undici previously ignored socket backpressure and allowed the outbound queue to grow without bound. This release pauses frame parsing when PONG writes encounter backpressure and resumes after the socket drains.

What's Changed

Full Changelog: v6.29.0...v6.29.1

v8.12.1

Choose a tag to compare

@github-actions github-actions released this 14 Oct 09:24
a65ec32

What's Changed

New Contributors

Full Changelog: v8.12.0...v8.12.1

v8.12.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 09:03
6f98fcc

What's Changed

  • fix(cookies): ignore a numeric expires outside the Date range by @xia-chao in #5832
  • fix(http2): pause bodyTimeout while applying backpressure by @jasnell in #5884
  • fix(cache): track cached response abort state by @mcollina in #5820
  • fix(deduplicate): make terminal callbacks exception-safe by @mcollina in #5838
  • fix(decompress): stop inflating compress and x-compress by @luantaraschi in #5665
  • fix(cache): evict least recently used entries in MemoryCacheStore by @jasnell in #5869
  • fix(eventsource): fix redirect targets in eventsource by @jasnell in #5878
  • fix(redirect): fix throwOnMaxRedirect edge by @jasnell in #5879
  • fix: normalize HTTP/2 headers for legacy dispatch handlers by @Knowzzz in #5867
  • fix(session cache): fix bug in tls session caching by @jasnell in #5882
  • docs: fix relative links broken by the README move by @v1teka in #5843
  • fix(redirect): add error code to max redirects error by @mcollina in #5895
  • fix(eventsource): fix retry wrap bug by @jasnell in #5875
  • fix(retry): keep request headers when resuming a download by @jasnell in #5870
  • fix(proxyagent): correct handling of the host header by @jasnell in #5868
  • fix(http1): fix handling of 204/304 responses by @jasnell in #5864
  • test: add unexpected disconnect guards to two more h2 tests by @zeexzeex in #5825
  • fix(cache): preserve 304 response event order with async stores by @marcopiraccini in #5797
  • fix(dns): handle a null pick, and stop failing over to an expired record by @datrixlab in #5791
  • fix: keep a header named proto across features by @luantaraschi in #5688
  • ci: exclude tests from CodeQL analysis by @mcollina in #5905
  • fix(pool): ensure that removed clients don't pick up requests by @jasnell in #5881
  • feat: Added @perseveranza-pets/milo as alternative experimental HTTP parser by @ShogunPanda in #5492
  • extractBody fixes 2 by @KhafraDev in #5926
  • reenable cachestorage wpts by @KhafraDev in #5907
  • fix(fetch): parse language tag in filename* parameters by @fallintoplace in #5908
  • fix(client): preserve tracked response header field boundaries by @ronag in #5940
  • fix(http1): fixup strictContentLength handling by @jasnell in #5897
  • feat(cache): compress big sqlite cache entries with zstd by @mcollina in #5744
  • fix(eventsource): enforce maxEventSize on unterminated lines by @mcollina in #5814
  • limit zstd window size to 8 MB by @KhafraDev in #5955
  • test: add unexpected disconnect guards to http2-body.js by @GhostCoder6969 in #5914
  • test: fix "specifiy" typo in cache interceptor test by @ump45nose in #5922
  • Wpt/wpt runner fixes by @KhafraDev in #5959
  • fix(h2): unref a session detached by GOAWAY with no open streams by @kjsik11 in #5960
  • feat: Throw an error when WebAssembly is not available. by @ShogunPanda in #5966
  • chore: Vendor milo 0.9.0. by @ShogunPanda in #5954
  • build(deps-dev): bump ws from 8.21.3 to 8.22.0 by @dependabot[bot] in #5968
  • build(deps-dev): bump undici from 6.28.0 to 6.29.0 by @dependabot[bot] in #5933
  • fix(typemap): .md -> .html by @avivkeller in #5602
  • build(deps): bump js-yaml from 4.1.1 to 4.3.2 by @dependabot[bot] in #5810
  • build(deps): bump brace-expansion by @dependabot[bot] in #5934
  • build(deps-dev): bump fast-check from 4.10.1 to 4.10.2 by @dependabot[bot] in #5921
  • test(fetch): settle h2 internal stream errors by @Yahiro025 in #5927
  • docs(errors): clarify timeout error codes and related options by @theamodhshetty in #4856
  • fix(interceptor): limit response error body size by @mcollina in #5942
  • build(deps): bump codecov/codecov-action from 7.0.0 to 7.1.1 by @dependabot[bot] in #5946
  • build(deps): bump hendrikmuhs/ccache-action from 1.2.23 to 1.2.24 by @dependabot[bot] in #5951
  • build(deps): bump github/codeql-action/analyze from 4.37.9 to 4.38.2 by @dependabot[bot] in #5952
  • build(deps): bump github/codeql-action/autobuild from 4.37.9 to 4.38.2 by @dependabot[bot] in #5950
  • build(deps): bump github/codeql-action/init from 4.37.9 to 4.38.2 by @dependabot[bot] in #5948
  • build(deps): bump github/codeql-action/upload-sarif from 4.37.9 to 4.38.2 by @dependabot[bot] in #5947
  • build(deps): bump actions/checkout from 7.0.0 to 7.0.1 by @dependabot[bot] in #5630
  • fix(http1): reset connections for no-body transfer encoding by @mcollina in #5941
  • fix: exclude experimental milo from node.js core bundle by @mcollina in #5935
  • test: re-enable HTTP/2 churn test on Node.js 26 by @mcollina in #5961
  • test: keep the h2c unix socket path within sun_path limits by @mcollina in #5978
  • fix(cache): preserve abort reasons after completion by @domenic in #5958
  • test: update milo paths in bundle-parser test by @mcollina in #5979
  • fix(cache): always treat zero-lifetime entries as stale by @mcollina in #5980
  • build(deps): bump step-security/harden-runner from 2.21.0 to 2.21.1 by @dependabot[bot] in #5949
  • fix(websocket,eventsource): keep receive limits behind dispatcher wrappers by @jasnell in #5896
  • fix(http2): enforce max concurrent streams by @jasnell in #5885
  • docs: sync WG collaborators with nodejs/undici team by @mcollina in #5991
  • build(deps-dev): bump @fastify/busboy from 3.2.2 to 3.2.3 by @dependabot[bot] in #6005
  • fix: ignore missing release ref during cleanup by @mcollina in #5891
  • fix: reject unsupported FormData request bodies by @mcollina in #5913
  • split wpt out of npm test by @mcollina in #5588

New Contributors

Full Changelog: v8.11.2...v8.12.0

v7.30.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 07:12
6741f66

What's Changed

  • [Backport v7.x] fix: selectively re-enable SIMD for ppc64 by @github-actions[bot] in #5794
  • Backport upgrade diagnostics lifecycle fixes to v7.x by @BridgeAR in #5783
  • [Backport v7.x] fix: honor backpressure in decompression interceptor by @mcollina in #5837
  • fix: close rejected HTTP/2 WebSocket streams on v7.x by @mcollina in #5876
  • test(fetch): make pull-dont-push exceed any socket buffer by @mcollina in #5889

Full Changelog: v7.29.1...v7.30.0

v6.29.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 09:42
e1d0501

What's Changed

  • [v6.x] fix(retry): settle exposed body on terminal failure by @mcollina in #5778
  • Backport upgrade diagnostics lifecycle fixes to v6.x by @BridgeAR in #5833
  • test: synchronize the issue-3356 body timeout by @BridgeAR in #5834

Full Changelog: v6.28.1...v6.29.0

v8.11.2

Choose a tag to compare

@github-actions github-actions released this 24 Sep 08:34
7e016ad

What's Changed

New Contributors

Full Changelog: v8.11.1...v8.11.2

v8.11.1

Choose a tag to compare

@github-actions github-actions released this 24 Sep 08:30
5e0a2f8

What's Changed

Full Changelog: v8.11.0...v8.11.1

v8.11.0

Choose a tag to compare

@github-actions github-actions released this 22 Sep 06:51
6e48f48

What's Changed

  • fix: complete upgrade diagnostics lifecycle by @BridgeAR in #5761
  • build(deps): bump step-security/harden-runner from 2.19.4 to 2.21.0 by @dependabot[bot] in #5753
  • fix(decompress): join a repeated content-encoding header by @luantaraschi in #5664
  • fix(cookies): keep a cookie named proto in getCookies by @luantaraschi in #5663
  • build(deps-dev): bump jest from 30.5.0 to 30.5.1 by @dependabot[bot] in #5784
  • build(deps): bump got from 15.1.0 to 16.0.0 in /benchmarks by @dependabot[bot] in #5785
  • fix: selectively re-enable SIMD for ppc64 by @richardlau in #5776
  • use private fields for brand checks by @KhafraDev in #5792
  • fix(h2): do not unref a session with open streams by @kjsik11 in #5782
  • fix(h2): avoid pool fan-out during ALPN negotiation by @mcollina in #5799
  • fix issue #5715 by @KhafraDev in #5805
  • ci: extend macOS Node.js workflow timeout by @mcollina in #5775
  • fix(env-http-proxy-agent): NO_PROXY wildcard semantics by @mcollina in #5777
  • fix(h2): do not replay a request whose response already started after GOAWAY by @kjsik11 in #5788
  • test: skip HTTP/2 churn test on Node.js 25 on all platforms by @kjsik11 in #5790
  • fix(proxy-agent): preserve repeated iterable headers by @GiHoon1123 in #5779
  • docs(errors): document ProxyConnectionError (UND_ERR_PRX_CONN) by @kilisamemarisaaa in #5781
  • dataurl parsing improvements + update WPT by @KhafraDev in #5812
  • fix(decompress): treat inherited Object.prototype names as unsupported encodings by @NgoQuocViet2001 in #5807
  • test(h2): stabilize http2-connection by @ViniciusDev26 in #5801
  • fix: preserve HTTP/2 for non-upgrade legacy requests by @mcollina in #5811
  • fix: skip drain dispatch for clientTtl-evicted clients in PoolBase by @vwong in #5677
  • chore: update tests blocking release by @vwong in #5828
  • build(deps): bump uWebSockets.js from v20.68.0 to v20.70.0 in /benchmarks by @dependabot[bot] in #5824
  • fix(deduplicate): settle requests when composed with retry by @mcollina in #5817
  • fix(cache): do not report aborted on successful cache hits by @Yahiro025 in #5819
  • fix(cookies): keep an Expires of 0 when serializing a cookie by @NgoQuocViet2001 in #5808
  • fix: honor backpressure in decompression interceptor by @mcollina in #5829
  • fix(h2): validate h2Options.maxConcurrentStreams itself by @kjsik11 in #5830
  • test(fetch): make pull-dont-push exceed any socket buffer by @kjsik11 in #5840
  • test(decompress): wait for highWaterMark via readable instead of setImmediate loop by @kjsik11 in #5841
  • fix(h2): keep the session ref'd while requests are queued by @kjsik11 in #5839
  • fix cache.addAll and cache.add hanging by @KhafraDev in #5844
  • fix(retry): settle responses after connection close by @mcollina in #5815
  • fix(h2): validate response content-length by @mcollina in #5816
  • fix(redirect): ignore informational responses in history by @mcollina in #5813
  • fix(websocket): reset the compressed flag when a message completes by @askalf in #5827
  • fix(h2): keep queued requests alive when the last stream closes by @kjsik11 in #5847
  • build(deps-dev): bump jest from 30.5.1 to 30.5.2 by @dependabot[bot] in #5854
  • build(deps-dev): bump fast-check from 4.9.0 to 4.10.1 by @dependabot[bot] in #5852
  • build(deps): bump uWebSockets.js from v20.70.0 to v20.71.0 in /benchmarks by @dependabot[bot] in #5856
  • build(deps-dev): bump @metcoder95/https-pem from 1.0.0 to 1.0.1 by @dependabot[bot] in #5853

New Contributors

Full Changelog: v8.10.2...v8.11.0