CVE-2026-111497 Node.js fixes for exploited Brotli

Node2shell reaches untrusted Brotli decoders in Node.js, Bun and .NET; check runtime versions, prioritise exposed paths and rebuild affected deployments.

A shield protects a server from malformed compressed data, illustrating Node.js fixes for the exploited Brotli flaw

At a glanceCVE-2026-111497

CVE-2026-111497 has a CVSS 3.1 base score of 9.8 (Critical) from NVD, and 9.2 (Critical, CVSS 4.0) from Google. It is fixed in Google brotli 1.0.10, 1.1.1 and 1.2.1. Ubuntu 26.04 fixed it in brotli 1.2.0-3ubuntu0.1. Debian bookworm fixed it in brotli 1.0.9-2+deb12u1.

Severity9.8 Critical (CVSS 3.1, NVD) · 9.2 Critical (CVSS 4.0, Google)
Fixed inGoogle brotli 1.0.10, 1.1.1, 1.2.1
AffectedGoogle brotli 1.0.3 – before 1.0.10; 1.1.0 – before 1.1.1; 1.2.0 – before 1.2.1
ExploitedYes: in CISA's Known Exploited Vulnerabilities catalog since October 27, 2026
EPSS88% chance of exploitation in the next 30 days (FIRST, October 28, 2026)
Public exploit67 GitHub repositories name it: proofs of concept, scanners, detections. Unverified: some are fake or malicious.
VectorCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
WeaknessCWE-252, CWE-787
Ubuntu26.04 resolute brotli: Fixed (1.2.0-3ubuntu0.1) · 26.04 resolute nodejs: Not affected · 24.04 noble brotli: Fixed (1.1.0-2ubuntu0.1) · 24.04 noble nodejs: Not affected · 22.04 jammy brotli: Fixed (1.0.9-2ubuntu0.1) · 22.04 jammy nodejs: Not affected
Debianbookworm brotli: Fixed (1.0.9-2+deb12u1) · trixie brotli: Fixed (1.1.0-2+deb13u1) · forky brotli: Vulnerable · sid brotli: Fixed (1.2.0-4.1) · bookworm nodejs: Vulnerable · trixie nodejs: Vulnerable
Red HatFixed: RHEL 10 (RHSA-2026:10767, RHSA-2026:19131, RHSA-2026:90449), RHEL 10.0 Extended Update Support (RHSA-2026:17690, RHSA-2026:19463), RHEL 7 Extended Lifecycle Support (RHSA-2026:19704), RHEL 8 (RHSA-2026:10766, RHSA-2026:13537) · RHEL 8: Affected
Also inNode.js, Python-hyper brotlicffi, Microsoft .net, Debian debian linux, istio, Anthropic bun

Is there a public exploit for CVE-2026-111497?

Yes: CVE-2026-111497 is exploited in the wild. CISA added it to its Known Exploited Vulnerabilities catalog on October 27, 2026. 67 public GitHub repositories name it: proofs of concept, scanners and detections. None of it is verified: some such repositories are fake or carry malware, so read the code before running it, and only against systems you own. FIRST's EPSS puts the chance of exploitation in the next 30 days at 88%, higher than 99.7% of scored CVEs.

From NVD, Ubuntu, Debian, Red Hat · checked October 29, 2026

The Brotli flaw behind node2shell is being exploited in the wild and has been in CISA's Known Exploited Vulnerabilities catalog since October 27. CVE-2026-111497 is fixed in Node.js 22.23.4, 24.22.1 and 26.12.1, and Bun 1.4.4; earlier releases on those lines are affected. Check with node --version. Until patched, rejecting Brotli request bodies reduces that entry path, but it does not protect fetched responses.

For a production service, the real question is whether attacker-controlled compressed data reaches the decoder. Cycode's node2shell analysis describes an out-of-bounds write that can crash a process, expose memory, or execute code. Request-body middleware and HTTP clients can provide that path without your application code ever calling Brotli directly.

Verify what's actually running

Run this command in the environment that supplies the service's Node.js runtime.

node --version

Compare the result with the fixed release for CVE-2026-111497 for that major line: 22.23.4, 24.22.1 or 26.12.1. Node.js 20.x and other end-of-life lines have no patch for releases that bundle Brotli; those deployments need a supported line.

Check the deployed container or server first. Cycode distinguishes Dockerfile declarations from built images because an image can still contain an old runtime. Its inventory guidance also includes build hosts and digest-pinned images whose runtime version cannot be determined from the tag.

Node.js security at a glance: Check the deployed container or server first; Identify which component supplies your decoder; Trace request-body decoding; Trace response and direct decoding separately

How the decoder reaches an invalid state

The defect behind CVE-2026-111497 starts with a malformed stream, not an npm dependency resolution problem. A stream can declare a single block type and then switch blocks. The vulnerable decoder fails to reject that transition, continues with invalid state, and writes beyond a buffer.

Khai Tran and Sylvie Mayer of OpenAI Codex Security found the issue and reported it to Node.js. The affected C library comes from Google and is bundled by Node.js and Bun; other runtimes and bindings also use it.

The National Vulnerability Database rates the flaw 9.8 Critical under CVSS 3.1. Google assigns 9.2 Critical under CVSS 4.0, while Node.js rates it High. Those are separate assessments, not interchangeable scores.

Cycode's timeline separates the original repository fix from the later runtime releases and disclosure.

DateEvent
February 27, 2026The fix entered the google/brotli repository, without a release or advisory at that time.
October 21, 2026Node.js 22.23.4, 24.22.1 and 26.12.1 were released, alongside Brotli 1.0.10, 1.1.1 and 1.2.1.
October 22, 2026The CVE was published, code execution was demonstrated publicly on Node.js 24.22.0, and Bun 1.4.4 shipped the corrected library.

The exploitation status has changed since Cycode's original account. That article reported no known exploitation in the wild as of October 23. The newer structured data records CISA catalog inclusion on October 27. The older no-exploitation statement is no longer the current status.

CVE-2026-111497 fixes by runtime

Identify which component supplies your decoder. This consolidated list preserves the fixed releases from Cycode's runtime, Python, and Microsoft tables.

Component or product lineFixed release
Node.js 26.x26.12.1
Node.js 24.x24.22.1
Node.js 22.x22.23.4
Node.js 20.x and other end-of-life linesNo patch; move to a supported line.
Bun1.4.4
Google Brotli library1.0.10, 1.1.1 and 1.2.1
PyPI brotli1.2.1
PyPI brotlicffi1.2.1.0
.NET 8Runtime 8.0.33; SDK 8.0.427 (4xx band) and 8.0.133 (1xx band)
.NET 9Runtime 9.0.22; SDK 9.0.320 (3xx band) and 9.0.123 (1xx band)
.NET 10Runtime 10.0.14; SDK 10.0.403 (4xx band) and 10.0.114 (1xx band)
.NET 11 preview11.0.100-rc.3.26522.148 (RC3)
PowerShell 7.4, 7.5 and 7.67.4.22, 7.5.13 and 7.6.9
Visual Studio 2019 16.11, 2022 17.14 and 2026 18.1116.11.61, 17.14.43 and 18.11.2
Visual Studio 2026 18.12 (Insiders)18.12 Insiders 3

For the underlying Google library, the affected ranges for CVE-2026-111497 are 1.0.3 through versions before 1.0.10, 1.1.0 before 1.1.1, and 1.2.0 before 1.2.1. Distribution packages require a separate check because vendors may backport the correction without adopting those upstream version numbers.

Find and patch Node.js services decoding untrusted Brotli

I'd prioritise services with both a runtime vulnerable to CVE-2026-111497 and an identifiable untrusted-input path. Cycode identifies Express 5 and body-parser 2 request handling as paths used in public code-execution research.

  1. Inventory Node.js and Bun across servers, container base images, and build hosts. Include digest-pinned images for review rather than assuming an unreadable tag is safe.

  2. Trace request-body decoding. In Express 5 and body-parser 2.x, json(), urlencoded(), text() and raw() support Brotli bodies. Check koa-bodyparser, @koa/bodyparser, koa-body and co-body, plus @fastify/compress when request decompression is enabled.

  3. Trace response and direct decoding separately. Built-in fetch() decompresses Brotli responses, so fetching user-supplied URLs is relevant. Review uses of node:zlib, particularly zlib.brotliDecompress, brotliDecompressSync and createBrotliDecompress, including libraries that call them.

  4. Upgrade the runtime and rebuild the deployable artifacts. Replace end-of-life Node.js lines, rebuild container images, and include standalone binaries compiled with Bun. Updating the build environment alone is not the same action as replacing the deployed artifact.

Cycode's request-body query requires a vulnerable image and a relevant dependency in the same directory. That can identify patch candidates, but it does not prove outside reachability and does not cover direct decoder calls or user-controlled fetch destinations. Use those results as a priority list, not a complete exposure verdict.

Check .NET opt-ins and rebuild self-contained apps

Microsoft released out-of-band updates on October 25. Unlike the Node.js middleware paths above, Brotli decompression is off by default in .NET and ASP.NET Core. Exposure to CVE-2026-111497 depends on the application or a dependency enabling it.

Search application code and dependencies for these settings and decoder APIs:

  • ASP.NET Core request decompression using AddRequestDecompression and UseRequestDecompression.
  • HttpClient response decompression with AutomaticDecompression set to Brotli or All.
  • BrotliStream with CompressionMode.Decompress, or BrotliDecoder.

Update the runtime and the applicable SDK band from the table, then restart applications. Self-contained applications must be rebuilt and republished because they carry a runtime that a host update does not replace. Containers also need rebuilding: a previously built image using a floating tag such as aspnet:8.0 retains its old runtime.

Track host updates, self-contained applications, and container rebuilds as separate completion checks. A vulnerable .NET image is a reason to inspect the opt-ins, not proof that the application enables decompression.

Check distribution advisories for backported fixes

A package with an older-looking upstream version can already contain the correction for CVE-2026-111497. The October 29 tracker snapshot gives concrete examples:

  • Ubuntu noble fixes brotli in 1.1.0-2ubuntu0.1; jammy fixes it in 1.0.9-2ubuntu0.1; resolute fixes it in 1.2.0-3ubuntu0.1.
  • Debian bookworm fixes brotli in 1.0.9-2+deb12u1, trixie in 1.1.0-2+deb13u1 and sid in 1.2.0-4.1. Forky remains listed as vulnerable in that snapshot.
  • Red Hat records fixed advisories for Red Hat Enterprise Linux 10, 10.0 Extended Update Support and 7 Extended Lifecycle Support.

Keep the runtime and system-library assessments separate. Ubuntu marks its nodejs entries for the listed releases as not affected, while Debian marks bookworm and trixie nodejs as vulnerable. A fixed distribution brotli package does not by itself settle the status of every bundled decoder.

Other consumers need the same ownership check. Python clients such as urllib3, httpx and aiohttp decode Brotli responses when brotli or brotlicffi is installed. Envoy and Istio exposure depends on enabling the Brotli decompressor. Go's cbrotli binding uses the system library, so its remediation depends on patched libbrotli.

Request filtering leaves fetch() responses uncovered

Cycode recommends a temporary request-side restriction while rebuilt services are being deployed: reject Content-Encoding: br at the proxy or load balancer. Match br case-insensitively and inside encoding lists such as gzip, br.

Turning off body-parser inflation is another request-side option, but it rejects every compressed body, including gzip. Neither measure protects Brotli responses consumed by fetch(). Node.js lists no workaround; these controls narrow specific paths rather than replace the runtime upgrade.

A bare Node.js HTTP server does not automatically decompress Brotli request bodies. Express 4 and body-parser 1.x do not decode those bodies either. Those details help distinguish request paths, but a service can still have a separate fetched-response or direct-decoder path.

Prioritise reachable decoders, then finish the rollout

CISA's current exploitation status makes the older absence-of-exploitation report a poor reason to delay. Start with exposed request decoders and user-controlled fetch destinations, apply temporary request restrictions where appropriate, and finish by replacing the deployed runtimes and artifacts. A dependency match helps find work; a rebuilt deployment is the remediation.

FAQ

Frequently asked questions

Is HTTP2Shell a different vulnerability from node2shell?

No. Cycode says HTTP2Shell is another name used for CVE-2026-111497, not a separate vulnerability. The underlying issue is the vulnerable Brotli decoder.

Does pip itself need a Brotli update?

Cycode says pip is not affected because its bundled urllib3 has Brotli disabled. That does not extend to other Python clients that enable Brotli through installed brotli or brotlicffi packages.

Is .NET Framework affected?

No. Cycode’s Microsoft update explicitly states that .NET Framework is not affected.

Will updating the npm package named brotli fix Node.js?

No. Cycode distinguishes the npm package named brotli from the vulnerable decoder bundled inside the Node.js runtime. The Node.js fix requires updating the runtime.

Sources

  1. node2shell (CVE-2026-111497): What to Patch and How to Find Exposed Services - Cycode
  2. NVD and distribution data for CVE-2026-111497 (checked 2026-10-29)
Vishal
· Software & security engineer

Vishal writes Trickyworld's tutorials and interview-preparation guides on programming, databases, cyber security and AI. Vishal has been shipping production software long enough to have firm opinions about Python, PHP, Node.js, and JavaScript, and to have been wrong about each of them at least once. The work has run the whole stack: Drupal and Laravel applications, React front ends, MySQL and MongoDB underneath, Redis and Memcached for the things that had to be fast, Apache Solr for the things that had to be findable. That last part turned out to matter more than anyone expected. Tune a Solr index for a season, then watch a language model confidently retrieve the wrong document, and you recognise an old problem wearing new clothes. Most of what is hard about AI systems is not the model. It is retrieval, caching, latency budgets, and deciding what the system does when the answer comes back wrong — which is work he has been doing since well before anyone called it AI engineering. He plays a lot of games, which is less a hobby disclosure than an admission of where a good share of his engineering instinct came from. Real-time systems with a frame budget. State that has to stay coherent while a player does something no designer anticipated. The permanent question of what happens when the frame cannot finish in time. Those habits carry over more directly than they have any right to. He has written several books on programming, all built on the same conviction: most technical writing is unclear because the author never decided what to leave out. More from Vishal → · Editorial policy

More on Cyber Security.

Cyber Security

PHP2Shell vulnerability: PHP code execution without login

A new PHP flaw nicknamed PHP2Shell lets an attacker take over a server with a single request — no login, no stolen password, no bug in your code required. Here's exactly how CVE-2026-109618 and CVE-2026-109619 work, how to check if you're exposed with a free script, and how to fix it before someone else finds it first.

16 min read

Latest articles

$ subscribe --weekly

Get the next tutorial in your inbox.

Programming, security and AI — the practical bits, no spam. Unsubscribe any time.