Node2Shell: the Brotli decoder flaw CVE-2026-111497
An out-of-bounds write in Google's Brotli decoder reaches Node.js, .NET and Python packages. CISA lists it as exploited. Fixed versions and exposure checks.

Node2Shell is the nickname for CVE-2026-111497, an out-of-bounds write in Google's Brotli decoder, versions 1.0.3 to 1.2.0. A crafted compressed stream can crash a process, leak memory or possibly run code. It reaches Node.js, .NET and the Python brotli packages. CISA added it to its Known Exploited Vulnerabilities catalog on 27 October 2026. Upgrade to Brotli 1.2.1, Node.js 22.23.4, 24.22.1 or 26.12.1, or the patched .NET runtime.
The attack path
Four steps, from the way in to the fix.
Most memory-safety bugs belong to one product. CVE-2026-111497 sits in Google's Brotli decoder, a compression library that Node.js, .NET and Python packages ship inside themselves, so one flaw became separate fixes across several runtimes. The trigger is data rather than a special endpoint: a crafted Brotli stream that something in your stack decompresses, including features that decompress without being asked.
Fixes landed on 21 October 2026, when Google tagged Brotli 1.2.1 and Node.js shipped releases for all three of its supported lines. Node credits Khai Tran and Sylvie Mayer of OpenAI Codex Security with the report. NVD published the CVE record and GitHub an advisory for the Python packages on 22 October, and Microsoft published its .NET advisory on 25 October. On 27 October, CISA added it to the Known Exploited Vulnerabilities catalog.
Who is affected
| Product | Affected | Fixed |
|---|---|---|
| Google Brotli (C library) | 1.0.3 to 1.2.0 | 1.0.10, 1.1.1, 1.2.1 |
| Node.js | 22.x, 24.x, 26.x before the fix; all end-of-life lines | 22.23.4, 24.22.1, 26.12.1 |
| .NET 8 | Below 8.0.33 | Runtime 8.0.33; SDK 8.0.133, 8.0.427 |
| .NET 9 | Below 9.0.22 | Runtime 9.0.22; SDK 9.0.123, 9.0.320 |
| .NET 10 | Below 10.0.14 | Runtime 10.0.14; SDK 10.0.114, 10.0.403 |
PyPI brotli | 1.0.3 to below 1.2.1 | 1.2.1 |
PyPI brotlicffi | 1.0.3 to below 1.2.1.0 | 1.2.1.0 |
A system is exposed only when it decompresses Brotli data an attacker can influence. Node's advisory names node:zlib and stops there. Two further Node.js paths are visible in library code and documentation:
- fetch(). Node's built-in
fetch()comes from undici, whose source decodesbrresponse bodies withzlib.createBrotliDecompress. A malicious or compromised server you fetch from can feed the decoder. - Express 5. Express 5.3.0 depends on body-parser 2.x. body-parser added Brotli in 2.0.0, and its README says every parser inflates
gzip,br,deflateandzstdbodies, withinflateon by default. Any Express 5 route with a body parser mounted decodesContent-Encoding: brrequests.
On .NET, Microsoft lists BrotliStream, BrotliDecoder, HttpClient automatic decompression that includes Brotli, and ASP.NET Core request decompression with br enabled. It notes these are not on by default. .NET Framework is not affected.
How Node2Shell works
The decoder bug
Node's advisory gives the clearest account. When a stream contained an invalid block switch, the decoder reported that it needed more input instead of reporting a permanent format error. The streaming decoder therefore kept accepting bytes and appended them to an eight-byte internal buffer, writing past its end.
Google's CVE record classifies the flaw as CWE-787, an out-of-bounds write, and CWE-252, an unchecked return value. The outcome is memory corruption inside the process: a crash, disclosure of process memory, or code execution.
Preconditions and scores
An attacker has to get Brotli data into a decompression path; no account and no user interaction are needed. The scorers differ on difficulty. Google's CVSS 4.0 score of 9.2 records that attack requirements are present, and Microsoft's CVSS 3.1 score of 8.1 rates attack complexity high. Node.js rates the bug high.
Is it being exploited?
Yes, according to CISA, though the public detail is thin:
- CISA. It added CVE-2026-111497 to the KEV catalog on 27 October 2026 as the "Google Brotli Unchecked Return Value Vulnerability", with a federal due date of 10 November. Its assessment on the CVE record changed the same day to active exploitation, not automatable, with total technical impact.
- What is not public. As of 28 October, no vendor or responder has said who exploited it, against which software, or with which indicators.
- Before the listing. Aikido reported no exploitation in the wild as of 22 October, and that researchers reached code execution in a lab against an unmodified Node.js 24.22.0 build on Linux arm64, though not on every attempt. Microsoft's vector rated exploit maturity as unproven when it was published.
The name is a separate question. The GitHub Advisory Database uses "Node2Shell" in its title and Aikido calls it the name circulating online, but neither says where it came from.
Check your exposure
Check every runtime that might decompress untrusted data, on hosts and inside images:
node -v # fixed: 22.23.4, 24.22.1, 26.12.1
npm ls body-parser express # body-parser 2.x inflates br bodies by default
dotnet --list-runtimes # fixed: 8.0.33, 9.0.22, 10.0.14
pip show brotli brotlicffi # fixed: 1.2.1 and 1.2.1.0Run them inside each image you deploy as well as on hosts, because a container carries its own runtime. Other software can bundle its own copy of Brotli; check those vendors' advisories for 1.0.10, 1.1.1 or 1.2.1.
Fix it
- Node.js. Upgrade to 22.23.4, 24.22.1 or 26.12.1. Node says end-of-life versions are always affected by a security release, so move off them.
- .NET. Install runtime 8.0.33, 9.0.22 or 10.0.14, or the matching SDK. NativeAOT applications link the decoder into the executable and must be republished.
- Python. Upgrade
brotlito 1.2.1 orbrotlicffito 1.2.1.0. - Containers. Rebuild images; restarting a container does not change its runtime.
Until you can upgrade, the only vendor interim guidance is Microsoft's for .NET: remove br from existing ASP.NET Core decompression providers, and change existing HttpClient automatic decompression flags to exclude Brotli. Microsoft warns against adding these settings where an application does not already use them.
Two other stopgaps are in circulation. Neither is vendor guidance for this CVE:
- body-parser
inflate: false. The README documents that it makes parsers reject compressed bodies. It rejects gzip and deflate too, so clients that compress requests will break. - Rejecting
Content-Encoding: brat the edge. Aikido suggests doing this at a reverse proxy, load balancer or middleware.
Neither covers Brotli responses your services fetch from elsewhere. Node.js lists no workaround.
Detect attempts and compromise
No vendor has published indicators or signatures for this bug. Two signals follow from what the advisories describe:
- Crashes. Node.js, .NET or Python processes dying with memory faults while handling compressed input. A crash is one of the outcomes Node lists.
- Unexpected Brotli bodies. Inbound requests with
Content-Encoding: brto services whose clients never send it.
If you suspect a successful attempt, treat the host as compromised and rotate secrets the process held in memory, since the bug can also disclose memory contents.
Beyond this patch
Compression libraries often ship as native code inside a runtime, where package managers do not list them. Keep an inventory that reaches that layer, and know where your stack decompresses data on its own: automatic decoding is what turns a library bug into a remote one.
Frequently asked questions
Am I affected if my Node.js app never calls zlib directly?
Possibly. Node's advisory names only node:zlib, but other code reaches the same decoder. Node's built-in fetch() uses undici, whose source decodes br responses with zlib's Brotli decompressor, so a malicious server can feed it. Express 5 depends on body-parser 2, which inflates br request bodies by default. Those paths come from library code and docs, not advisories. Upgrade Node either way.
Is there a workaround for Node2Shell?
Node.js lists none; upgrading is the fix. For .NET, Microsoft suggests removing br from existing ASP.NET Core decompression providers and excluding Brotli from HttpClient automatic decompression, without adding those settings where they are not already used. For Express, body-parser's inflate: false rejects compressed bodies. That is documented behavior, not vendor guidance for this CVE, and it does not protect fetch() responses.
Is CVE-2026-111497 being exploited?
Yes, according to CISA. It added CVE-2026-111497 to its Known Exploited Vulnerabilities catalog on 27 October 2026, with a 10 November due date, and its assessment on the CVE record changed to active exploitation the same day. No vendor or responder has published details of the attacks yet. Before the listing, Aikido reported no exploitation in the wild as of 22 October, while researchers reached code execution in a lab against Node.js 24.22.0.
Which .NET applications are affected?
Applications on .NET 8, 9 or 10 below 8.0.33, 9.0.22 and 10.0.14 that decompress attacker-controlled Brotli data: BrotliStream or BrotliDecoder, HttpClient automatic decompression that includes Brotli, or ASP.NET Core request decompression with br enabled. Microsoft says these features are not on by default. .NET Framework is not affected. NativeAOT applications must be republished after updating.
Where does the name Node2Shell come from?
That is not documented. The GitHub Advisory Database entry for the Python packages uses the name in its title, and Aikido calls it the name circulating online, but neither explains its origin. The flaw is in Google's library rather than Node.js itself, and Aikido notes the label has since broadened to HTTP2Shell as more affected stacks surfaced.
Sources
- Node.js — October 2026 security releases (CVE-2026-111497)
- NVD API — CVE-2026-111497 (Google CNA record)
- google/brotli — v1.2.1 release notes
- GitHub Advisory Database — GHSA-9v8h-qqgm-4m35 (PyPI brotli, brotlicffi)
- Microsoft — .NET security advisory CVE-2026-111497 (dotnet/announcements #494)
- PyPI — Brotli 1.2.1
- CISA KEV catalog JSON feed
- CISA — Adds Two Known Exploited Vulnerabilities to Catalog (27 Oct 2026)
- CVE.org — CVE-2026-111497 record (CISA SSVC assessment)
- undici — fetch implementation (Brotli response decoding)
- body-parser — README (inflate option, supported encodings)
- body-parser — HISTORY (brotli support added in 2.0.0)
- Express — package.json (body-parser dependency)
- Aikido — Node2Shell: Node.js Brotli RCE (CVE-2026-111497)
Published 28 October 2026 · By the Rokkhe research team


