//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
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 neededUpgrade 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 nowNo 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 neededUpgrading 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 riskTwo 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.
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.Shellnode -p "[process.version, 'openssl ' + process.versions.openssl, 'c-ares ' + process.versions.ares, 'undici ' + process.versions.undici].join('\n')"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.Rebuild container images
The officialnodeimages 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.Shelldocker 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 laterRebuild 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.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.
| Release line | Status | Fixed in |
|---|---|---|
| Node.js 26 | Current, becomes LTS on 28 October 2026 | 26.12.1 |
| Node.js 24 (Krypton) | LTS, in maintenance since 20 October 2026 | 24.22.1 |
| Node.js 22 (Jod) | Maintenance LTS until 30 April 2027 | 22.23.4 |
| Node.js 25, 23 and 21 | End of life | No fix |
| Node.js 20 (Iron) and older | End of life since 30 April 2026 | No 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.
| CVE | Severity | Affected lines |
|---|---|---|
| CVE-2026-111497Brotli decoder out-of-bounds write | High | 22.x, 24.x, 26.x |
| CVE-2026-105482DNS resolve truncates names at a NUL character | High | 22.x, 24.x, 26.x |
| CVE-2026-106069TLS hostname bypass with non-canonical IP addresses | High | 22.x, 24.x, 26.x |
| CVE-2026-105483TLS hostname bypass with fullwidth digits | High | 24.x, 26.x |
| CVE-2026-106072DNS names in certificates accepted for IP endpoints | Medium | 22.x, 24.x, 26.x |
| CVE-2026-105481Keep-alive socket accepts a response sent too early | Medium | 22.x, 24.x, 26.x |
| CVE-2026-106074Repeated random values in snapshots and SEAs | Medium | 22.x, 24.x, 26.x |
| CVE-2026-106070ZipFile returns stray bytes after a failed header check | Low | 26.x |
| CVE-2026-106071Permission Model over-grants with wildcard paths | Low | 26.x |
| CVE-2026-106073Permission Model bypass through fs.realpathSync | Low | 22.x, 24.x, 26.x |
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.9OpenSSL
- 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 vulnerabilitiesUndici (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 customcheckServerIdentitycould be silently dropped, and several denial-of-service fixes. 7.x and 8.x also fix a cache poisoning bug, CVE-2026-109829. Undici releasesSQLite
- 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
fetchreaches 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.
- 2026-09-29
- 2026-10-15
- 2026-10-19
- 2026-10-20
2026-10-20
Node.js merges the eMudhra intermediate blocklist and the NSS 3.131.1 root store update.
- 2026-10-21
2026-10-21
Node.js releases 22.23.4, 24.22.1 and 26.12.1 and publishes the security release post.
2026-10-21 · 14:39 to 14:43 UTC
Official node images for all three versions are pushed to Docker Hub.
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.
| Framework | Control | What to record |
|---|---|---|
| ISO 27001:2022 | A.8.8 | Management of technical vulnerabilities. Record which systems ran an affected version and when each was upgraded. |
| ISO 27001:2022 | A.8.32 | Change management. Link the upgrade to your normal change record. |
| ISO 27001:2022 | A.8.9 | Configuration management, if any system still runs an end-of-life Node.js line. |
| SOC 2 | CC7.1 | Identifying newly discovered vulnerabilities. |
| SOC 2 | CC8.1 | Authorising, 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
- Node.js security release post, 21 October 2026The CVE list, severities, affected lines and credits.
- Node.js 26.12.1 release notesCommits for each fix on the 26.x line.
- Node.js 24.22.1 release notesCommits for each fix on the 24.x line.
- Node.js 22.23.4 release notesCommits for each fix on the 22.x line.
- Node.js previous releasesRelease line status and end-of-life dates.
- Node.js Permission Model documentationWhat the Permission Model does and does not protect against.
- Official node images on Docker HubImage tags for the fixed versions.