Konfirmity
All security advisories

//security advisory

Node.js October 2026 Security Releases

On 21 October 2026 Node.js fixed ten vulnerabilities across every supported release line, four of them rated high. The most serious is a memory corruption bug in Brotli decompression that Node.js says permits remote code execution. Upgrade to 22.23.4, 24.22.1 or 26.12.1. Node.js 20 and older receive no fix.

On this page
  1. Are you affected?
  2. What to do
  3. Fixed versions
  4. The vulnerabilities
  5. Dependency updates
  6. Not yet published
  7. Timeline
  8. Questions
  9. Recording it for compliance
  10. Sources

Are you affected?

If you run Node.js anywhere, yes. Find the row that describes you.

  • You run Node.js 22, 24 or 26

    Servers, CLIs, build tools, serverless functions

    Update needed

    Upgrade to 22.23.4, 24.22.1 or 26.12.1. All three lines carry at least one high-severity fix. Fixed versions

  • You run Node.js 20 or older

    Including 21, 23 and 25

    Act now

    No fix is coming. Node.js 20 reached end of life on 30 April 2026. Plan a move to Node.js 22 or 24 now. Details

  • You ship Node.js inside images or binaries

    Docker images, single executable applications, startup snapshots

    Update needed

    Upgrading the host is not enough. Rebuild every image and binary on the fixed version, because each one carries its own copy of the runtime.

  • You rely on the Permission Model

    Processes started with --permission

    Low risk

    Two low-severity bypasses are fixed. Node.js documents the Permission Model as a safeguard for trusted code, not a sandbox for untrusted code.

What to do

This is an upgrade, not a configuration change. Node.js has published no workarounds for any of the ten CVEs.

  1. Find every Node.js version you run

    Check servers, CI runners, developer machines, base images and serverless runtimes. The command below also prints the bundled OpenSSL, c-ares and Undici versions.
    Shell
    node -p "[process.version, 'openssl ' + process.versions.openssl,
      'c-ares ' + process.versions.ares, 'undici ' + process.versions.undici].join('\n')"
  2. Upgrade to the fixed release for your line

    22.23.4, 24.22.1 or 26.12.1, or anything later in the same line. See fixed versions.
  3. Rebuild container images

    The official node images were updated on 21 October. An image built before then keeps the old runtime until you rebuild it on a fresh pull of the base.
    Shell
    docker run --rm node:22 node --version   # expect v22.23.4 or later
    docker run --rm node:24 node --version   # expect v24.22.1 or later
    docker run --rm node:26 node --version   # expect v26.12.1 or later
  4. Rebuild single executables and startup snapshots

    A single executable application embeds its own copy of Node.js, so it stays vulnerable until it is rebuilt. If you build startup snapshots, rebuild them too. See CVE-2026-106074.
  5. Schedule the move off end-of-life lines

    Anything on Node.js 20 or older stays exposed to every issue on this page. Treat it as a known, unfixed vulnerability until it is migrated.

Fixed versions

Status as of 21 October 2026, from the Node.js release schedule. Any later release in the same line also contains the fixes.

Fixed Node.js version for each release line
Release lineStatusFixed in
Node.js 26Current, becomes LTS on 28 October 202626.12.1
Node.js 24 (Krypton)LTS, in maintenance since 20 October 202624.22.1
Node.js 22 (Jod)Maintenance LTS until 30 April 202722.23.4
Node.js 25, 23 and 21End of lifeNo fix
Node.js 20 (Iron) and olderEnd of life since 30 April 2026No fix

End-of-life lines

The Node.js security post states that end-of-life versions are always affected when a security release occurs. Node.js 20 reached end of life on 30 April 2026 and Node.js 25 on 1 June 2026. The Node.js project recommends that production applications use only Active LTS or Maintenance LTS releases.

The vulnerabilities

Ten CVEs, ordered by severity. Node.js has published only a title and rating for each, so the explanations below are drawn from the fix commits and their tests, and say so where they go beyond what Node.js has stated.

Node.js October 2026 CVEs by release line
CVESeverityAffected lines
CVE-2026-111497Brotli decoder out-of-bounds writeHigh22.x, 24.x, 26.x
CVE-2026-105482DNS resolve truncates names at a NUL characterHigh22.x, 24.x, 26.x
CVE-2026-106069TLS hostname bypass with non-canonical IP addressesHigh22.x, 24.x, 26.x
CVE-2026-105483TLS hostname bypass with fullwidth digitsHigh24.x, 26.x
CVE-2026-106072DNS names in certificates accepted for IP endpointsMedium22.x, 24.x, 26.x
CVE-2026-105481Keep-alive socket accepts a response sent too earlyMedium22.x, 24.x, 26.x
CVE-2026-106074Repeated random values in snapshots and SEAsMedium22.x, 24.x, 26.x
CVE-2026-106070ZipFile returns stray bytes after a failed header checkLow26.x
CVE-2026-106071Permission Model over-grants with wildcard pathsLow26.x
CVE-2026-106073Permission Model bypass through fs.realpathSyncLow22.x, 24.x, 26.x
High

CVE-2026-111497: Brotli decoder out-of-bounds write

Affects 22.x, 24.x and 26.x. Fix: Node.js commit, google/brotli commit

The bug is in the Brotli library that Node.js bundles, not in Node.js’s own code. A crafted compressed stream that declares a single block type and then switches blocks was not rejected, and Node.js says the result is an out-of-bounds write that permits remote code execution. Node.js applied the upstream fix, which makes the decoder stop with an error on such streams.

Who is exposed: anything that decompresses Brotli data it does not control. zlib.brotliDecompress, its sync form and zlib.createBrotliDecompress all reach the decoder; the fix’s regression test exercises both the one-shot and streaming paths. Typical cases are servers that accept Content-Encoding: br request bodies and clients or proxies that decompress responses from servers they do not trust. Node.js has not said whether the built-in fetch reaches the bug.

High

CVE-2026-105482: DNS resolve truncates names at a NUL character

Affects 22.x, 24.x and 26.x. Fix: Node.js commit

The DNS resolver hands names to c-ares as C strings, which end at the first NUL character. A name such as example.com\0.trusted.corp passes a JavaScript check like endsWith(".trusted.corp"), but the query actually goes out for example.com. The fix commit uses this example.

Who is exposed: applications that pass user-supplied names to dns.resolve, any resolve* method, dns.reverse or a Resolver instance after checking them as strings, for example to enforce an allowlist. After the fix these calls throw ERR_INVALID_ARG_VALUE for names containing a NUL. The change does not touch dns.lookup.

High

CVE-2026-106069: TLS hostname bypass with non-canonical IP addresses

Affects 22.x, 24.x and 26.x. Fix: Node.js commit

Before checking a server’s certificate, Node.js normalised the hostname. Strings such as 0127.0.0.1, 0x7f.0.0.1 or 127.1 could be checked against the certificate as one address while the operating system’s resolver connected to another. The fix’s test pairs 0127.0.0.1, which the resolver reads as octal and connects to 87.0.0.1, with a certificate check against 127.0.0.1.

Who is exposed: applications that open TLS connections to host strings an attacker can influence, such as webhook senders, URL previewers and proxies. Based on the fix’s tests, the attacker also needs a certificate the client trusts whose DNS name is the IP address written normally. Connections to fixed, ordinary hostnames are not affected. After the fix, tls.checkServerIdentity rejects these hosts with ERR_TLS_CERT_ALTNAME_INVALID.

High

CVE-2026-105483: TLS hostname bypass with fullwidth digits

Affects 24.x and 26.x. Fix: Node.js commit

A related regression in the same hostname check. A host written with fullwidth digits, such as 127.0.0.1, was normalised into an ordinary IP address and could then match a certificate issued for that address. The fix rejects any host that only becomes an IP address after normalisation. Node.js 22 does not have the regression.

Node.js rates this high, but the fix commit itself describes it as a low-severity bug that is not easy to exploit. We show the rating from the security release post.

Medium

CVE-2026-106072: DNS names in certificates accepted for IP endpoints

Affects 22.x, 24.x and 26.x. Fix: Same commit as CVE-2026-106069

A second report of the same underlying problem, fixed by the same change. A certificate whose DNS name reads 127.0.0.1 could authenticate a connection made to a non-canonical form of the address, such as 0177.0.0.1. Upgrading for CVE-2026-106069 fixes this too.

Medium

CVE-2026-105481: Keep-alive socket accepts a response sent too early

Affects 22.x, 24.x and 26.x. Fix: Node.js commit

When the HTTP client reuses a kept-alive connection, a server could write a response onto the idle socket before the next request was sent, and Node.js would treat it as the answer to that request. An earlier guard only caught this when the event loop had polled the socket. The fix asks the operating system whether unread data is waiting before reusing a socket, and opens a new connection if it is.

Who is exposed: clients using an http.Agent with keepAlive enabled that talk to a server which is malicious or compromised, or to a plain HTTP server through an attacker on the network path.

Medium

CVE-2026-106074: Repeated random values in snapshots and SEAs

Affects 22.x, 24.x and 26.x. Fix: Node.js commit

crypto.randomUUID() and crypto.randomInt() keep a small cache of random values. When an application built a startup snapshot, the unused part of that cache was saved into it, so every process started from the snapshot produced the same first values. The fix clears the caches when a snapshot is written and when it is loaded.

Who is exposed: only applications built as single executable applications with useSnapshot enabled, or that use user-land startup snapshots. Ordinary applications are not. Node.js has not published rotation guidance; our recommendation is to rebuild affected binaries on a fixed version and to treat any UUIDs or random numbers they used as secrets, such as tokens or nonces, as predictable and rotate them.

Low

CVE-2026-106070: ZipFile returns stray bytes after a failed header check

Affects 26.x. Fix: Node.js commit

zlib.ZipFile is an experimental API added in 26.8.0 for reading ZIP archives. When a ZIP entry failed header validation, a later read of that entry could return bytes from the wrong position in the file. Only 26.x has this API.

Low

CVE-2026-106071: Permission Model over-grants with wildcard paths

Affects 26.x. Fix: Node.js commit

With the Permission Model enabled, a wildcard path in --allow-fs-read or --allow-fs-write could grant access to more paths than it should. Node.js has not described which paths were over-granted.

Low

CVE-2026-106073: Permission Model bypass through fs.realpathSync

Affects 22.x, 24.x and 26.x. Fix: Node.js commit

fs.realpathSync() skipped the Permission Model check that its siblings, such as fs.promises.realpath() and fs.existsSync(), already performed, so it could be used on paths the process had not been granted.

On both Permission Model issues: the Node.js documentation describes the Permission Model as a seat belt that stops trusted code from accidentally touching files it was not granted, and states that it does not protect against malicious code. Do not rely on it to contain untrusted code, patched or not.

Dependency updates

The releases also update libraries that Node.js bundles. You get these by upgrading Node.js; there is nothing to install separately.

  • c-ares (DNS resolver)

    22.23.4
    1.34.9
    24.22.1
    1.34.9
    26.12.1
    1.34.9
    Eleven upstream advisories, mostly use-after-free bugs when lookups are cancelled or servers change during a callback, and one where a reply from a different server than the one queried could be accepted. c-ares 1.34.9
  • OpenSSL

    22.23.4
    3.5.9
    24.22.1
    3.5.9
    26.12.1
    3.5.9 (unchanged)
    CVE-2026-84782 (high), a DTLS bug that can leak heap memory or crash, plus a set of low-severity fixes. OpenSSL vulnerabilities
  • Undici (HTTP client behind fetch)

    22.23.4
    6.29.1
    24.22.1
    7.30.1
    26.12.1
    8.12.2
    Includes CVE-2026-109383 (high), where TLS options such as a custom checkServerIdentity could be silently dropped, and several denial-of-service fixes. 7.x and 8.x also fix a cache poisoning bug, CVE-2026-109829. Undici releases
  • SQLite

    22.23.4
    3.53.4
    24.22.1
    Unchanged
    26.12.1
    Unchanged
    Brings 22.x up to the SQLite version already in 24.x. Node.js lists it as a dependency update and names no CVE.
  • Root certificates

    22.23.4
    NSS 3.131.1
    24.22.1
    NSS 3.131.1
    26.12.1
    NSS 3.131.1
    Rejects chains containing the eight compromised eMudhra intermediates (#66871) and removes three emSign roots (#66877). See our eMudhra advisory.

Undici is also published on npm. If your application depends on the undici package directly rather than using the built-in fetch, upgrade that package as well; upgrading Node.js does not change it.

What is not yet published

This advisory reflects what was public on 21 October 2026. We will update it as these gaps close.

  • CVSS scores and CWE classifications. Node.js has given only a high, medium or low rating, and the CVE records are reserved but empty.
  • Technical write-ups. The fixes were developed privately, so the public record is the fix commits and their tests.
  • Whether the built-in fetch reaches the Brotli bug in CVE-2026-111497.
  • Workarounds. Node.js has published none, so upgrading is the only documented remedy.

Timeline

Dates are UTC. Upstream dependency releases are included because the Node.js fixes depend on them.

  1. 2026-09-29

    OpenSSL releases 3.5.9.

    OpenSSL vulnerabilities

  2. 2026-10-15

    Undici releases 6.29.1, 7.30.1 and 8.12.2.

    Undici releases

  3. 2026-10-19

    c-ares publishes security release 1.34.9.

    c-ares releases

  4. 2026-10-20

    Node.js merges the eMudhra intermediate blocklist and the NSS 3.131.1 root store update.

    nodejs/node #66871

  5. 2026-10-21

    Node.js releases 22.23.4, 24.22.1 and 26.12.1 and publishes the security release post.

    Node.js security release post

  6. 2026-10-21 · 14:39 to 14:43 UTC

    Official node images for all three versions are pushed to Docker Hub.

    nodejs/docker-node

Questions

Which Node.js version should I upgrade to?

Upgrade to Node.js 22.23.4, 24.22.1 or 26.12.1, or any later release in the same line. These are the first releases that contain the October 2026 fixes.

Is Node.js 20 affected by the October 2026 vulnerabilities?

Node.js 20 reached end of life on 30 April 2026 and receives no fix. The Node.js project states that end-of-life versions are always affected when a security release occurs. Move to Node.js 22 or 24.

What is the most serious vulnerability in this Node.js release?

CVE-2026-111497, an out-of-bounds write in the Brotli decoder bundled with Node.js, which Node.js rates high and says permits remote code execution. Applications that decompress Brotli data from untrusted sources with the zlib module are exposed.

Do I need to change my code after upgrading?

Usually not. The release notes list no breaking changes. Connections to hosts written as non-canonical IP addresses, such as 0127.0.0.1, now fail certificate checks, and DNS resolve calls with a NUL character in the name now throw. Single executable applications and startup snapshots must be rebuilt with the fixed version.

Are the official Node.js Docker images updated?

Yes. The node images on Docker Hub were published for 22.23.4, 24.22.1 and 26.12.1 on 21 October 2026. Rebuild your images so they pick up the new base.

Does this release include the eMudhra certificate fix?

Yes. All three releases reject certificate chains that contain the eight compromised eMudhra intermediates and remove three emSign roots from the bundled root store.

Are CVSS scores available for these CVEs?

Not yet. As of 21 October 2026 Node.js has published only a high, medium or low rating for each CVE, and the CVE records are reserved but not yet filled in.

Recording it for compliance

A runtime security release is routine vulnerability management, not an incident. Auditors will still expect to see that you knew about it and patched within your own timelines.

Controls to record this event against
FrameworkControlWhat to record
ISO 27001:2022A.8.8Management of technical vulnerabilities. Record which systems ran an affected version and when each was upgraded.
ISO 27001:2022A.8.32Change management. Link the upgrade to your normal change record.
ISO 27001:2022A.8.9Configuration management, if any system still runs an end-of-life Node.js line.
SOC 2CC7.1Identifying newly discovered vulnerabilities.
SOC 2CC8.1Authorising, testing and deploying the upgrade.

Evidence to keep: the date you assessed it, the inventory of Node.js versions you found, the version each system and image moved to, and any end-of-life systems with their migration plan.

Sources