1. Red
  2. Learn
  3. Other incidents

Node.js security update: 10 CVEs, Brotli RCE, fixed versions

Node.js security update 2026: Brotli RCE CVE-2026-111497 plus nine more CVEs, fixed in 22.23.4, 24.22.1 and 26.12.1. Who is affected and how to upgrade.

By Alexander Gusev, run.cloudPublished 24 October 20266 min readHow we check facts
On this page
  1. Which Node.js versions are affected?
  2. What is in the other nine CVEs?
  3. Why does updating npm packages not fix it?
  4. How do I fix it?
  5. Am I affected? A three-state self-test
  6. Was this exploited?
  7. What is the Brotli bug, without the exploit?

Node.js shipped security releases on 21 October 2026 that fix 10 CVEs, including a Brotli decoder bug that allows remote code execution (CVE-2026-111497). The fixed versions are 22.23.4, 24.22.1 and 26.12.1. Upgrade the Node.js runtime itself, rebuild any image that bundles it, and redeploy. The Node.js notice does not call for credential rotation.

FactDetailSource
Released21 October 2026Node.js notice
Fixed versions22.23.4 (22.x) · 24.22.1 (24.x) · 26.12.1 (26.x)Node.js notice
Count10 CVEs: 4 High, 3 Medium, 3 LowNode.js notice
Headline bugCVE-2026-111497: Brotli decoder out-of-bounds write that permits remote code execution. High. Affects 22.x, 24.x, 26.xNode.js notice
TLS bugsCVE-2026-105483 (24.x, 26.x), CVE-2026-106069 (22.x, 24.x, 26.x), both High; CVE-2026-106072 Medium (22.x, 24.x, 26.x)Node.js notice
Older linesThe notice says end-of-life versions are always affected when a security release occursNode.js notice
ExploitationThe notice makes no statement either wayNode.js notice
Checked24 October 2026this page

Which Node.js versions are affected?

Every supported line is. The Brotli bug affects 22.x, 24.x and 26.x. The notice does not publish an exact first-affected patch number, so the rule is simple: if your node --version is below the fixed version for your line, you are in scope.

The release schedule at our check on 24 October 2026 showed v22 and v24 as LTS and v26 as Current. It listed v18, v20 and v25 as end of life. For those lines the Node.js project says end-of-life versions are always affected and publishes no fix, so the only route is a supported line.

Your lineFixed inRelease notes
26.x (Current)26.12.1v26.12.1
24.x (LTS)24.22.1v24.22.1
22.x (LTS)22.23.4v22.23.4
25.x, 20.x, 18.xNo fix published; listed as EOLRelease schedule

Only sites and services that run a Node process are in scope: a Next.js or Express server, an API, a worker, a managed Node runtime. A PHP site or a static site can still have a Node API or worker behind it, so check what else runs for the same domain. A PHP runtime has a different bug to deal with, covered in our write-up of the PHP runtime flaw. Build tools and CI runners use Node too, so check them separately. If the Node process is a Next.js app, the Next.js remote-code-execution fixes and the Server Actions denial-of-service check are separate upgrades on top of this one.

What is in the other nine CVEs?

The Node.js project lists each one on its security notice. Titles below are the project's own.

CVESeverityTitleLines
CVE-2026-111497HighBrotli decoder out-of-bounds write permits remote code execution22, 24, 26
CVE-2026-105482Highdns.resolve truncates names containing a NUL character22, 24, 26
CVE-2026-105483HighTLS certificate hostname bypass when the IP is written in fullwidth digits24, 26
CVE-2026-106069HighTLS certificate hostname bypass when the host loosely resolves to an IP address22, 24, 26
CVE-2026-105481MediumKeep-alive socket processes a response written before the request was sent22, 24, 26
CVE-2026-106072MediumImproper certificate validation for non-canonical IPv4 hostnames22, 24, 26
CVE-2026-106074Mediumcrypto.randomUUID() and randomInt() caches saved into startup snapshots and single executable apps22, 24, 26
CVE-2026-106070LowZipFile returns attacker-controlled prefix bytes after failed header validation26
CVE-2026-106071LowPermission Model filesystem over-grant via wildcard lookup26
CVE-2026-106073LowPermission Model bypass with fs.realpathSync22, 24, 26

So the release covers more than one RCE and one TLS bypass. Four issues are rated High, and three of them concern how hostnames and addresses are checked.

The same notice says the releases also update bundled dependencies: c-ares, ca-cert (listed as "eMudhra Intermediate CA Compromise"), OpenSSL, SQLite and Undici. The certificate part is explained in our eMudhra page. Another certificate change that can break server-to-server calls is the clientAuth removal that hits mTLS.

Why does updating npm packages not fix it?

The Brotli fix is a change to a library vendored inside the runtime. The 24.22.1 release notes list it as "deps: brotli", next to the CVE id. Running npm update changes your application's packages and leaves the runtime as it was. Whether a poisoned package ever ran on your build machine is a different question, covered in build machines versus the live site for the npm worms.

Three places keep an old runtime alive after you think you upgraded:

  1. Container images. A fixed base image does nothing until your application image is rebuilt from it and deployed.
  2. Pinned runtimes. A version manager, a CI setup step, an .nvmrc or engines setting, or a platform setting can pin the old line.
  3. The version string. A version read from outside, or on your laptop, says nothing about the runtime the service uses. Run node --version in the running context.

How do I fix it?

What do I do if a host or platform runs Node for me?

Send support this question and keep the reply:

For [your app or domain], which Node.js version does the running service use, and is it 22.23.4, 24.22.1, 26.12.1 or a build that names CVE-2026-111497? Please confirm the service was restarted or redeployed after the runtime changed, and tell me whether I must change a setting or redeploy myself.

  • Find the runtime setting in your platform (often an engines field, a version dropdown or a build setting) and move it to a fixed version.
  • Redeploy, because a changed setting does not restart a running service.
  • Keep the written reply from support.

What do I do if I manage the server or pipeline myself?

  • Run node --version in the real context: the running container, the CI job, the build step. Not only your laptop.
  • Upgrade to the fixed version for your line, from the Node.js project or your distribution.
  • Rebuild every image that bundles Node and redeploy it.
  • Restart long-running processes, since an upgrade on disk does not change a process already running.
  • Move anything on 18, 20 or 25 to a supported line and test it.
  • Check embedded runtimes, such as Node bundled into a desktop app or a single executable.

Am I affected? A three-state self-test

Am I affected? Where you stand right now

A passive check from outside can sometimes see a Node framework. It cannot see the runtime version, the container build or whether processes restarted.

  1. Detected A check shows a Node.js service and a version below the fixed release for its line. Treat the service as in scope. Upgrade, rebuild and redeploy, or ask the host the question above.
  2. Unknown The site uses Node or a Node framework but the runtime version is hidden, or could be a distribution backport. This is the common case. Get the version from the running process or from your host.
  3. Confirmed by owner evidence You have the fixed package or build identifier (22.23.4, 24.22.1, 26.12.1, or a distribution build whose changelog names CVE-2026-111497), plus a restart or redeploy after it. A runtime version that does not name the fix, restarted unchanged, does not count. That is the evidence this page can accept. It says nothing about whether anyone used the bug earlier.

No scan, ours included, moves you from "unknown" to "confirmed".

Was this exploited?

The Node.js notice describes the conditions for each bug and reports no attacks. That is silence, and silence is not proof that nothing happened. Some entries carry conditions of their own. For CVE-2026-106072 the notice says exploitation needs a numeric DNS SAN in a certificate from a CA the client trusts, and a platform resolver that accepts the odd IPv4 spellings, such as glibc.

The notice does not call for credential rotation.

What is the Brotli bug, without the exploit?

According to the Node.js notice, an invalid block switch in the Brotli stream was reported as a temporary need for more input instead of a permanent format error. The streaming decoder then kept writing input bytes into an eight-byte internal buffer. The project lists the impact as a crash, disclosure of process memory, or remote code execution. The notice credits OpenAI Codex Security researchers Khai Tran and Sylvie Mayer as reporters, with fixes by the contributors mcollina and aduh95. We do not reproduce exploit material here, and you do not need it to upgrade.

At our check on 24 October 2026 the notice named the application pattern: an attacker who can supply Brotli data that an application decompresses with node:zlib. If your code does that, upgrade first. Treat any service on an affected line as in scope and upgrade.

More incident pages from October 2026 and the other incident write-ups are collected on one page.

Questions people ask

Do I need to update Node.js itself, or just my npm packages?

Update Node.js itself. The Brotli fix is a change to a library bundled inside the runtime, so updating packages in package.json does not change it. Upgrade to 22.23.4, 24.22.1 or 26.12.1, then rebuild and redeploy.

I am on Node 20 or Node 18. What now?

The Node.js notice says end-of-life versions are always affected when a security release occurs, and no fix is published for those lines. Move to a supported line and test the application there. The release schedule lists v18 and v20 as end of life.

Is this Node.js RCE being exploited?

The Node.js notice does not say. It describes conditions, not attacks, and a missing statement is not proof that nothing happened. Treat the exploitation status as unknown.

Does my website run Node.js?

Only if something on the server or the platform runs a Node process, such as a Next.js or Express app, an API, a worker, or a managed runtime. A site built on PHP or served as static files can still have a Node API or worker behind it, so the front end does not settle the question. Build tools and CI runners can still use Node, so check there too.

Does a scan tell me if my Node.js is fixed?

No. Node usually does not announce its version to visitors, and a build can be older than the code you deployed. Only the version reported by the running process, plus a restart or redeploy after the upgrade, shows the fixed runtime.

Sources

  1. Node.js Security Releases: October 21, 2026 (nodejs.org)Lists all 10 CVEs with severity, affected lines, reporters and the fixed versions. Makes no statement about exploitation.
  2. Node.js 22.23.4 (LTS) release notes (nodejs.org)Dated 2026-10-21. Maps each fix to its CVE id for the 22.x line.
  3. Node.js 24.22.1 (LTS) release notes (nodejs.org)Dated 2026-10-21. Maps each fix to its CVE id for the 24.x line.
  4. Node.js 26.12.1 (Current) release notes (nodejs.org)Dated 2026-10-21. Maps each fix to its CVE id for the 26.x line.
  5. Node.js release schedule (nodejs.org)Lists v18, v20 and v25 as EOL, v22 and v24 as LTS, v26 as Current at our check on 24 October 2026.

Facts on this page are dated and point at the primary source next to them. If a vendor status changes after the date shown, the vendor's page wins; tell us at support@run.cloud and we will update it.