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- Official advisory
- Node.js security release and GHSA-9v8h-qqgm-4m35
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 line | Support | Latest release before the fix | Update to |
|---|---|---|---|
| Node.js 26 | Current release, moving to long-term support on October 28, 2026 | 26.12.0 | 26.12.1 |
| Node.js 24 | Long-term support, security fixes until April 30, 2028 | 24.22.0 | 24.22.1 |
| Node.js 22 | Long-term support, security fixes until April 30, 2027 | 22.23.3 | 22.23.4 |
| Node.js 25, 23, 20 and older | End of life | No longer released | No 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.
| CVE | What it is | Rating | Lines affected |
|---|---|---|---|
| CVE-2026-105482 | DNS 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. | High | 26, 24, 22 |
| CVE-2026-105483 | TLS hostname checks can be bypassed with an IP address written in fullwidth digits. | High | 26, 24 |
| CVE-2026-106069 | TLS hostname checks can be bypassed with an IPv4 address that has leading zeros. | High | 26, 24, 22 |
| CVE-2026-105481 | A reused keep-alive connection can hand back a stale response. | Medium | 26, 24, 22 |
| CVE-2026-106072 | Certificate checks accept IPv4 addresses written in non-standard forms in the DNS name list. | Medium | 26, 24, 22 |
| CVE-2026-106074 | Values 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. | Medium | 26, 24, 22 |
| CVE-2026-106070 | zlib.ZipFile accepts extra bytes in front of an archive. | Low | 26 |
| CVE-2026-106071 | A wildcard in the permission model can grant more access than intended. | Low | 26 |
| CVE-2026-106073 | fs.realpathSync can get around permission model checks. | Low | 26, 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 -vShows 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.versionLogging 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 -vReplace 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-parserShows 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.
- List every place Node.js runs: web servers, background workers, scheduled jobs, build machines, and Docker images.
- 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.
- Install the fixed release for your line with the method below, then rebuild and redeploy any images.
- Restart every Node.js process so it loads the new runtime. A process that keeps running still uses the old version.
- 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: falseon 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: brat 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
- Oct 21, 2026. The Node.js project publishes the security releases for the 26, 24, and 22 lines.
- 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.
- October 26, 2026, 11:08 AM Eastern (15:08 UTC). ELLIO reports exploit traffic aimed at Node.js 24.22.0 reaching its sensors.
- Oct 27, 2026. We last checked the sources on this page.
Sources
- Node.js October 2026 security releases (nodejs.org)
- CVE-2026-111497 in the National Vulnerability Database
- CVE-2026-111497 record (CVE.org)
- GitHub advisory GHSA-9v8h-qqgm-4m35 (Brotli)
- The upstream Brotli fix (google/brotli)
- body-parser advisory GHSA-27r3-jxmh-p828
- Node.js release schedule (nodejs/Release)
- Ubuntu tracker for CVE-2026-111497
- Imperva: Node2Shell, From Brotli Data to Remote Code Execution
- Akamai: Inside Node2Shell, A Closer Look at CVE-2026-111497
- ELLIO: Node2Shell exploit traffic on stock Node.js builds
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.