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.

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.
| Severity | 9.8 Critical (CVSS 3.1, NVD) · 9.2 Critical (CVSS 4.0, Google) |
|---|---|
| Fixed in | Google brotli 1.0.10, 1.1.1, 1.2.1 |
| Affected | Google brotli 1.0.3 – before 1.0.10; 1.1.0 – before 1.1.1; 1.2.0 – before 1.2.1 |
| Exploited | Yes: in CISA's Known Exploited Vulnerabilities catalog since October 27, 2026 |
| EPSS | 88% chance of exploitation in the next 30 days (FIRST, October 28, 2026) |
| Public exploit | 67 GitHub repositories name it: proofs of concept, scanners, detections. Unverified: some are fake or malicious. |
| Vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Weakness | CWE-252, CWE-787 |
| Ubuntu | 26.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 |
| Debian | bookworm 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 Hat | Fixed: 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 in | Node.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.

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.
| Date | Event |
|---|---|
| February 27, 2026 | The fix entered the google/brotli repository, without a release or advisory at that time. |
| October 21, 2026 | Node.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, 2026 | The 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 line | Fixed release |
|---|---|
| Node.js 26.x | 26.12.1 |
| Node.js 24.x | 24.22.1 |
| Node.js 22.x | 22.23.4 |
| Node.js 20.x and other end-of-life lines | No patch; move to a supported line. |
| Bun | 1.4.4 |
| Google Brotli library | 1.0.10, 1.1.1 and 1.2.1 |
| PyPI brotli | 1.2.1 |
| PyPI brotlicffi | 1.2.1.0 |
| .NET 8 | Runtime 8.0.33; SDK 8.0.427 (4xx band) and 8.0.133 (1xx band) |
| .NET 9 | Runtime 9.0.22; SDK 9.0.320 (3xx band) and 9.0.123 (1xx band) |
| .NET 10 | Runtime 10.0.14; SDK 10.0.403 (4xx band) and 10.0.114 (1xx band) |
| .NET 11 preview | 11.0.100-rc.3.26522.148 (RC3) |
| PowerShell 7.4, 7.5 and 7.6 | 7.4.22, 7.5.13 and 7.6.9 |
| Visual Studio 2019 16.11, 2022 17.14 and 2026 18.11 | 16.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.
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.
Trace request-body decoding. In Express 5 and body-parser 2.x,
json(),urlencoded(),text()andraw()support Brotli bodies. Check koa-bodyparser, @koa/bodyparser, koa-body and co-body, plus @fastify/compress when request decompression is enabled.Trace response and direct decoding separately. Built-in
fetch()decompresses Brotli responses, so fetching user-supplied URLs is relevant. Review uses ofnode:zlib, particularlyzlib.brotliDecompress,brotliDecompressSyncandcreateBrotliDecompress, including libraries that call them.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
AddRequestDecompressionandUseRequestDecompression. HttpClientresponse decompression withAutomaticDecompressionset toBrotliorAll.BrotliStreamwithCompressionMode.Decompress, orBrotliDecoder.
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 in1.0.9-2ubuntu0.1; resolute fixes it in1.2.0-3ubuntu0.1. - Debian bookworm fixes brotli in
1.0.9-2+deb12u1, trixie in1.1.0-2+deb13u1and sid in1.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.
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.


