Northwestern Tideline · news

CVE-2026-111497: the Brotli flaw in Node.js – what is true, what is hype, and how to check in an hour

A real out-of-bounds write in Google’s Brotli decoder, fixed in Node.js 22.23.4, 24.22.1 and 26.12.1 on 21 October 2026. Not every Node server is exposed – only applications that decompress Brotli data an attacker can supply. Here is how to tell which side you are on.

Contents9 sections

On 21 October 2026 the Node.js project released 22.23.4, 24.22.1 and 26.12.1 to fix ten CVEs. One of them, CVE-2026-111497, is a flaw in the Brotli decompression library that Node.js bundles. A day later it travelled under the name “Node2Shell”, and headlines of the form “Node.js remote code execution exploit” followed.

The record supports a narrower statement; the difference is an afternoon’s work or an incident.

Everything below comes from the primary records – the CVE entry, the Node.js security release post, the release schedule, the libraries’ documentation and the vendor post that coined the name – re-read on 24 and 25 October 2026.

What was published, and when

DateWhat it says
Brotli 1.0.10, 1.1.1, 1.2.121 October 2026Google published the fixed library versions on GitHub
Node.js 22.23.4, 24.22.1, 26.12.121 October 2026Security releases fixing ten CVEs; the Brotli entry is rated “high” by the Node.js project
CVE-2026-111497 record22 October 2026, 13:35 UTCCNA Google: “Out-of-Bounds Write in Google Brotli Decoder”, CVSS 4.0 base score 9.2 (Critical), CWE-787 and CWE-252
CISA KEV catalogue 2026.10.2323 October 2026CVE-2026-111497 is not listed

The CVE record describes a buffer overflow in the decoder file c/dec/decode.c of Google Brotli 1.0.3 through 1.2.0 on all platforms. A remote, unauthenticated attacker who gets a crafted Brotli-compressed stream decoded can corrupt adjacent decoder state, disclose memory contents, cause a denial of service or potentially execute arbitrary code.

The affected ranges are 1.0.3 to below 1.0.10, 1.1.0 to below 1.1.1 and 1.2.0 to below 1.2.1.

The Node.js post explains the mechanism in one sentence: an invalid block switch was reported as a temporary need for more input instead of a permanent format error, so the streaming decoder kept appending input bytes to an eight-byte internal buffer.

It also names the condition for an attack: “an attacker who can supply Brotli data that an application decompresses with node:zlib”.

What “Node2Shell” means – and does not

“Node2Shell” is, in Imperva’s own words, “Imperva Red Team’s name for our analysis of CVE-2026-111497”, published on 22 October 2026.

The post reports code execution against the official Node.js 24.22.0 Linux arm64 image, states that the proof “did not succeed on every attempt” and that the team “did not test every Node.js build or application”, and says plainly that a bare Node.js HTTP server does not decode incoming Brotli bodies simply by receiving them.

The headlines that carried the name were shorter than that. This is one decoder bug in one library, reachable only where a program feeds Brotli data of an attacker’s choosing into the decoder. A Node.js service that never decompresses anything from outside is running vulnerable code but has no path to it.

The CVSS 4.0 vector says the same in its own notation: AT:P, attack requirements present – something about the deployment has to be true before the attack works.

Who is affected

Three conditions have to hold at once:

  1. The runtime bundles an affected Brotli. Node.js 22.x, 24.x and 26.x before the 21 October releases do. So does any other software with its own copy of the library: Python brotli bindings, an nginx Brotli module, download tools.
  2. Something decompresses Brotli. Node.js decodes Brotli only when code asks, through node:zlib or a library built on it. The silent case is a web framework’s body parser: the body-parser README states that all its parsers support automatic inflation of gzip, br (brotli), deflate and zstd encodings and that the inflate option defaults to true. An Express API with default settings therefore decompresses a request body that arrives with Content-Encoding: br as soon as the parser runs – if the parser is mounted before the authentication middleware, before any credential is checked.
  3. An attacker can choose the bytes. A public listener that accepts request bodies qualifies; so does an application that fetches and decodes responses from servers it does not control.

How to check in an hour

You run these yourself, with the access you already have. Each takes minutes; the hour is for finding every host.

  1. Which Brotli does each Node process carry? On every server and in every container run node -p process.versions.brotli. Anything in the affected ranges (1.0.3 to 1.0.9, 1.1.0, 1.2.0) is vulnerable code.
  2. Which Node.js line, and is it supported? node -v. Lines 22, 24 and 26 have fixes (22.23.4, 24.22.1, 26.12.1). Line 20 and older have none.
  3. Does anything inflate request bodies? npm ls body-parser express in each application. With body-parser present and inflate not set to false, compressed request bodies are inflated by default. Look also for direct zlib.brotliDecompress calls and for HTTP clients that accept Brotli responses from untrusted servers.
  4. Does nginx decode Brotli itself? nginx -V 2>&1 | grep -o brotli. No output means nginx has no Brotli module and is not a decoder; it still forwards br bodies to the application.
  5. Is Brotli present in other languages? python3 -c 'import brotli'. ModuleNotFoundError is a clean negative; a successful import means that copy needs checking against the same ranges.
  6. Write down the negatives. Negative results are findings too; they stop someone patching what is not there.

Running WordPress rather than a Node.js API? Spend the hour on plugin advisories instead.

Mitigation order

StepWhatWhy in this order
1. Edge blockMake the reverse proxy reject request bodies with Content-Encoding: brReversible in minutes, no code change, closes the request-body path
2. Runtime upgradeMove each service to 22.23.4, 24.22.1 or 26.12.1 within its major line; rebuild containers from the patched base imageThe actual fix; same-major upgrades carry little compatibility risk
3. Operating-system packagesUpdate the system Brotli library when your distribution ships itCovers curl, nginx-with-Brotli and Python; does not change Node’s bundled copy
4. Planned major upgradeNode 20 and older: schedule 20 → 22 with a test run and a maintenance windowNo vendor fix exists; this is a project, not a patch

The nginx rule is one line in the server block, before proxy_pass:

``nginx if ($http_content_encoding ~* "br") { return 415; } ``

Verify with two requests: with Content-Encoding: br the answer is 415, without it the usual code. Rollback is removing the line and reloading nginx. Before applying it, check whether any of your own clients or integrations send Brotli-compressed request bodies; a rejected legitimate client is the only side effect.

The rule does not cover responses your own application fetches from untrusted servers; that path needs the runtime upgrade.

What we do not know

  • Whether reliable code execution exists on standard builds. Imperva reports code execution on one official image (Node.js 24.22.0, Linux arm64), not on every attempt, with no other builds tested; we have not reproduced it. The CVE record says “potentially execute arbitrary code”: a crash or memory disclosure is the documented effect, code execution the demonstrated-once worst case.
  • Whether it is being exploited. Not in CISA’s Known Exploited Vulnerabilities catalogue as of version 2026.10.23; CISA’s entry in the CVE record, dated 23 October 2026, gives exploitation “none”; EPSS 0.0071 (53rd percentile) on 24 October 2026. For a CVE two days old these are early signals, not an all-clear.
  • Every product that embeds Brotli. Vendors that link the library statically publish advisories at their own pace; the Node.js and operating-system fixes are the known list, not the complete one.

How we handled it

Our Sentinel engine flagged CVE-2026-111497 from the primary feeds and separated record from chatter the way this article does. The checks above are the ones it runs on a host; the four-step order is the one it proposes, edge block first and reversibly, anything that needs a maintenance window left to a person.

That is cybersecurity oversight for companies in the age of AI in practice: one advisory, read at the source, turned into a yes-or-no answer for your systems.

If you want that answer for your own estate, the Northwestern Tideline page explains how an audit works and the enquiry form reaches us directly. We check only what you authorise in writing.

Frequently asked questions

Is CVE-2026-111497 a vulnerability in every Node.js server?

No. It is an out-of-bounds write in the Brotli decoder that Node.js bundles. The Node.js project states the condition: an attacker who can supply Brotli data that the application decompresses with node:zlib. A service that never decompresses outside data carries the vulnerable code but has no path to it. “Node2Shell” is the name Imperva Red Team gave to its analysis of the CVE, not a description of scope.

Which Node.js versions fix the Brotli flaw?

Node.js 22.23.4, 24.22.1 and 26.12.1, released on 21 October 2026. The fixed Brotli library versions are 1.0.10, 1.1.1 and 1.2.1. Node 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.

How do I check whether my server is exposed?

Run node -p process.versions.brotli on each server and container (1.0.3 to 1.0.9, 1.1.0 and 1.2.0 are affected), check node -v for the release line, run npm ls body-parser express to see whether request bodies are inflated by default, and run nginx -V to see whether nginx carries a Brotli module. Record the negative results as well as the positive ones.

What should I do first if I cannot upgrade today?

Make the reverse proxy reject request bodies that arrive with Content-Encoding: br, for example an nginx rule that returns 415. It is reversible in minutes and closes the request-body path; first check that none of your own clients send such bodies. It does not cover Brotli responses your own application fetches from untrusted servers; that needs the runtime upgrade.

Is CVE-2026-111497 being exploited in the wild?

As of the CISA Known Exploited Vulnerabilities catalogue of 23 October 2026 it is not listed, the CISA entry in the CVE record of the same date gives exploitation as none, and the EPSS probability on 24 October 2026 was 0.0071 (53rd percentile). For a CVE published on 22 October these are early signals, not an all-clear.

Sources

  1. 01

    CVE-2026-111497 record, CNA Google: “Out-of-Bounds Write in Google Brotli Decoder” (published 2026-10-22 13:35 UTC; affected and fixed versions, CWE-787, CWE-252, CVSS 4.0 9.2 Critical, vector AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H; CISA-ADP SSVC entry of 2026-10-23: Exploitation none)

    Open the source accessed 

  2. 02

    Node.js project: “Wednesday, October 21, 2026 Security Releases” (22.23.4, 24.22.1, 26.12.1; ten CVEs; Brotli decoder entry rated high; “End-of-Life versions are always affected when a security release occurs”)

    Open the source accessed 

  3. 03

    Node.js Release Working Group, schedule.json (Node 18 end 2025-04-30, Node 20 end 2026-04-30, Node 22 end 2027-04-30)

    Open the source accessed 

  4. 04

    google/brotli releases on GitHub: v1.0.10, v1.1.1 and v1.2.1 published 2026-10-21

    Open the source accessed 

  5. 05

    expressjs/body-parser README: “All parsers support automatic inflation of gzip, br (brotli), deflate and zstd encodings”; option inflate “Defaults to true”

    Open the source accessed 

  6. 06

    CISA Known Exploited Vulnerabilities catalogue, version 2026.10.23 (released 2026-10-23): CVE-2026-111497 not listed

    Open the source accessed 

  7. 07

    FIRST EPSS API: CVE-2026-111497 epss 0.0071, percentile 0.5306, date 2026-10-24

    Open the source accessed 

  8. 08

    Imperva Threat Research, Ron Masas: “Node2Shell: From Brotli Data to Remote Code Execution” (2026-10-22; “Node2Shell is Imperva Red Team’s name for our analysis of CVE-2026-111497”; tested on the official Node.js 24.22.0 Linux arm64 image; “did not succeed on every attempt”; a bare Node.js HTTP server does not decode incoming Brotli bodies)

    Open the source accessed 

How this guide was prepared

Northwestern Solutions wrote this guide from the texts of the laws and other sources listed above. The legal statements were compared with those texts; the date of the check is shown with the sources. The parties and amounts in the examples are invented. This is not legal or tax advice: for an unusual transaction, ask an accountant.

Found an inaccuracy? .