A Serious Node.js Flaw: What to Update and How.

On Oct 21, 2026, the Node.js project released Node.js 26.12.1, 24.22.1, and 22.23.4. They fix ten vulnerabilities. The most serious, CVE-2026-111497, is a flaw in the Brotli decompression code bundled with Node.js that can let an attacker run their own code on your server. There is no workaround that fully fixes it, so updating is the safe choice.

Facts on this page come from the Node.js project and the sources listed below, last checked Oct 27, 2026.

How Serious Is This?

CVSS is the standard scale security teams use to rate vulnerabilities from 0 to 10.

  • Brotli Decompression Flaw

    9.2out of 10Critical

    CVSS v4.0 rates 9.0 to 10.0 as Critical, the highest of its four bands.
    Where it is
    The Brotli decoder bundled with Node.js and used by node:zlib.
    What it is
    A malformed Brotli stream makes the decoder keep writing past the end of a small internal buffer instead of stopping with an error.
    What an attacker could do
    Crash the process, read memory, or run their own code, without logging in. Node.js rates it High. The CVE record scores it 9.2, Critical, under CVSS v4.0.
    Known attacks
    ELLIO reports exploit traffic aimed at Node.js 24.22.0 reaching its sensors at 11:08 AM Eastern on October 26 (15:08 UTC). Imperva showed code execution on the official Node.js 24.22.0 image on October 22, through fetch() and Express 5, and confirmed 24.22.1 rejects the same input. It was not in the CISA Known Exploited Vulnerabilities catalog when we last checked.
    CVSS v4.0 vector
    CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

Who Is Exposed

Any app on an affected Node.js version that decompresses Brotli data it did not create itself.

Your code does not need to mention Brotli. According to Akamai's analysis, the bad data can arrive three ways:

  • Code that decompresses Brotli data itself: Any call to zlib.brotliDecompress or zlib.createBrotliDecompress on data that came from outside your own systems.
  • The built-in fetch(): fetch() decompresses Brotli responses automatically, so a malicious or compromised server you call can send the bad data back to you.
  • Express 5 and body-parser 2: Their json, raw, text, and urlencoded parsers decompress request bodies sent with Content-Encoding: br by default. Anyone who can reach the endpoint can send one, with no login.

A bare Node.js HTTP server does not decompress request bodies on its own, and Express 4 with body-parser 1 only decodes gzip and deflate. Even so, update: other code in your app, or a library it uses, may call fetch() or zlib. The same flaw sits in Google's Brotli library, so other software that bundles it needs its own update, including PHP for Windows.

Affected and Fixed Versions

Node.js lineSupportLatest release before the fixUpdate to
Node.js 26Current release, moving to long-term support on October 28, 202626.12.026.12.1
Node.js 24Long-term support, security fixes until April 30, 202824.22.024.22.1
Node.js 22Long-term support, security fixes until April 30, 202722.23.322.23.4
Node.js 25, 23, 20 and olderEnd of lifeNo longer releasedNo fix. The Node.js project treats end-of-life lines as affected. Move to a supported line.

Linux distributions can patch Node.js without changing its version number. If your Node.js comes from Debian, Ubuntu, or Red Hat packages, check the distribution's tracker, such as Ubuntu's page for this CVE.

The Other Nine Fixes

The same releases fix nine smaller issues. The ratings are the Node.js project's own.

CVEWhat it isRatingLines affected
CVE-2026-105482DNS lookups (dns.resolve and related calls) can be cut short by a NUL character in a hostname. This completes an earlier fix for CVE-2026-48930.High26, 24, 22
CVE-2026-105483TLS hostname checks can be bypassed with an IP address written in fullwidth digits.High26, 24
CVE-2026-106069TLS hostname checks can be bypassed with an IPv4 address that has leading zeros.High26, 24, 22
CVE-2026-105481A reused keep-alive connection can hand back a stale response.Medium26, 24, 22
CVE-2026-106072Certificate checks accept IPv4 addresses written in non-standard forms in the DNS name list.Medium26, 24, 22
CVE-2026-106074Values cached by crypto.randomUUID and crypto.randomInt can be saved into startup snapshots and single executable applications, so copies start with the same random values.Medium26, 24, 22
CVE-2026-106070zlib.ZipFile accepts extra bytes in front of an archive.Low26
CVE-2026-106071A wildcard in the permission model can grant more access than intended.Low26
CVE-2026-106073fs.realpathSync can get around permission model checks.Low26, 24, 22

The releases also update bundled dependencies, including c-ares, undici, OpenSSL, SQLite, and the list of trusted certificate authorities.

How to Check Your Node.js Version

Check where the app actually runs, not just your own computer.

  • On the Command Line

    node -v

    Shows the version on that machine. Run it on the server, not your own computer, and check every server that runs your app.

  • Inside the Running App

    process.version

    Logging this from the app itself shows the version actually serving traffic, which can differ from the one on the command line.

  • In Docker

    docker compose exec app node -v

    Replace app with the name of your service. The FROM line in your Dockerfile tells you which Node.js image it starts from.

  • For Express Apps

    npm ls express body-parser

    Shows which versions your app installs. Express 5 and body-parser 2 decode Brotli request bodies; Express 4 with body-parser 1 does not.

How to Update Safely and Quickly

Move to the fixed release on the line you already use.

  1. List every place Node.js runs: web servers, background workers, scheduled jobs, build machines, and Docker images.
  2. Try the update on a staging copy first if you have one. A security release stays on the same major version, so it is a small change.
  3. Install the fixed release for your line with the method below, then rebuild and redeploy any images.
  4. Restart every Node.js process so it loads the new runtime. A process that keeps running still uses the old version.
  5. Check the version again from inside the running app, and keep a note of what you changed.

Docker

docker compose build --pull && docker compose up -d

A floating tag such as node:24-slim picks up the fix when you pull and rebuild. A pinned tag such as node:24.22.0-slim never changes, so change it to node:24.22.1-slim. The official images for 26.12.1, 24.22.1, and 22.23.4 are on Docker Hub.

Version Managers

nvm install 24 nvm alias default 24

With nvm, this installs the newest 24.x release. Use 22 or 26 for those lines, and update any .nvmrc or engines field that pins an older patch.

Hosting Platforms

Platforms that run Node.js for you choose when to ship the update. Check your provider's status or changelog, and confirm the version from inside the running app.

If You Can't Update Today

These steps lower the risk for a short while. None of them replaces the update.

  • In Express 5 or body-parser 2, set inflate: false on each body parser. Compressed request bodies are then refused with an HTTP 415 error instead of being decoded.
  • Refuse request bodies sent with Content-Encoding: br at your proxy or load balancer if your app does not need them.
  • Update body-parser to 2.4.0 or 1.20.9 as well. They fix a separate denial of service flaw in compressed request bodies, CVE-2026-111181.
  • Limit which outside servers your app fetches from until the update is in.
  • Put the update on the calendar with a named person and a date.

Timeline

  1. Oct 21, 2026. The Node.js project publishes the security releases for the 26, 24, and 22 lines.
  2. October 22, 2026. Imperva shows code execution on the official Node.js 24.22.0 Linux arm64 image. body-parser 2.4.0 and 1.20.9 are released.
  3. October 26, 2026, 11:08 AM Eastern (15:08 UTC). ELLIO reports exploit traffic aimed at Node.js 24.22.0 reaching its sensors.
  4. Oct 27, 2026. We last checked the sources on this page.

Sources

Get Help Updating Node.js Quickly

Bracken East keeps Node.js and Express applications up to date for businesses, including apps whose original developers have moved on. For this release, we can:

  • Find the exact Node.js version on every server, worker, and container your app uses.

  • Install the fixed release, or plan the move to a supported line if you are on Node.js 20 or older.

  • Check whether your app decodes Brotli from outside, and close that path.

  • Send you a short written note of what changed and what we checked.

Get Your Node.js Onto a Fixed Release.

Book a free 45-minute call. We will look at how your app runs Node.js and tell you plainly what the update involves.

Book a Call