Node2Shell / HTTP2Shell (CVE-2026-111497): Identify & fix vulnerable assets

What is CVE-2026-111497 (Node2Shell / HTTP2Shell)?
CVE-2026-111497 is a memory-safety bug in the reference C implementation of Brotli, the compression format that Google developed and most of the web uses for HTTP content encoding (Content-Encoding: br).
The decoder function that handles "block switches" (points where a Brotli stream changes Huffman tables) returned a plain true/false value. A false return could mean either "the stream is malformed" or "I need more input", and callers could not tell the two apart. A crafted stream that forces an impossible block switch is treated as "needs more input", so the streaming decoder keeps appending attacker bytes into an eight-byte internal buffer and writes past its end. The CVE record pairs CWE-252 (unchecked return value) with CWE-787 (out-of-bounds write).
Node.js was the first to disclose and patch, which is why the flaw is widely called "Node2Shell". As Python, Bun, Envoy and others confirmed they were affected, "HTTP2Shell" (and "Broccoli2Shell") came into use for the wider issue. They are all the same CVE, and because Brotli is copied into each project that uses it, each one has to ship its own fix.
The upstream fix also sat unreleased for months, and once the issue was disclosed, vendor patches arrived on different days:
Date | Event |
Feb 27, 2026 | The fix is committed to google/brotli as a routine bug fix. No release is cut and no advisory issued, so every project keeps shipping the vulnerable decoder for the next eight months. |
Oct 21, 2026 | First public disclosure. Node.js ships 22.23.4, 24.22.1 and 26.12.1, and Google releases Brotli 1.0.10, 1.1.1 and 1.2.1 naming the CVE. This is where the "Node2Shell" name comes from. |
Oct 22, 2026 | Google publishes the CVE record (CVSS 9.2). Imperva reports code execution in its lab on an unmodified Node.js 24.22.0 image. The exploit has not been released, so this remains a single-vendor claim. Bun 1.4.4 ships with the fixed decoder. |
Oct 23, 2026 | Python (Brotli, brotlicffi), Envoy and Istio confirm they are affected and ship fixes. From here the issue is treated as ecosystem-wide ("HTTP2Shell"), and more vendors that bundle Brotli keep publishing advisories. |
Why is CVE-2026-111497 critical?
Critical severity, no authentication required: Google scored it CVSS 9.2. It can be triggered remotely with no privileges or user interaction, simply by getting a crafted Brotli stream decoded.
Works in both directions: a malicious client can attack a server that decodes Brotli request bodies, and a malicious server can attack any client that fetches a Brotli response. Internal services that call external APIs are exposed too. Common routes into the decoder are Express 5 / body-parser 2 request parsers, Koa and Fastify body parsers, Node's built-in fetch(), and Python's requests, httpx and aiohttp clients.
Wide and growing blast radius: Node.js 22/24/26, Bun, the Python Brotli and brotlicffi packages, Envoy, Istio, curl builds and OS packages all bundle the vulnerable decoder. Your code does not need to import Brotli to be affected.
Proof of Concept (PoC) availability: Imperva reports achieving code execution in its lab on an unmodified Node.js 24.22.0 image (Linux arm64, several attempts needed); the exploit has not been released and no one else has reproduced it on a standard build. A separate public PoC produces a crash and a limited memory read on a standard build; it reached code execution only on a deliberately weakened build. No in-the-wild exploitation has been confirmed and the CVE is not in CISA KEV as of this writing.
Scanner blind spots: advisory databases lagged in mapping the CVE to the Python packages, and runtimes bundled inside container images, Electron apps and CI runners are often missing from package inventories.
Which systems are affected / not affected by CVE-2026-111497?
Systems affected: any runtime, library or product that decodes Brotli with Google Brotli 1.0.3 through 1.2.0. Confirmed so far:
Component | Affected versions | Fixed versions | Notes |
Google Brotli (libbrotli) | 1.0.3 – 1.2.0 | 1.0.10, 1.1.1, 1.2.1 | Upstream fix. Pick the release for your branch. |
Node.js 26.x (Current) | before 26.12.1 | 26.12.1 | Released Oct 21. |
Node.js 24.x (LTS) | before 24.22.1 | 24.22.1 | Released Oct 21. |
Node.js 22.x (LTS maintenance) | before 22.23.4 | 22.23.4 | Released Oct 21. |
Node.js 25.x, 23.x, 21.x and older | all | none | End of life. No fix will ship. Migrate to a supported line. |
Bun | before 1.4.4 | 1.4.4 | Rebuild compiled executables that bundle Bun. |
Python: Brotli (PyPI) | 1.2.0 and earlier | 1.2.1 | Pulled in by requests/urllib3, httpx[brotli], aiohttp, Scrapy. |
Python: brotlicffi (PyPI) | 1.2.0.x | 1.2.1.0 | Same as above. |
Envoy | 1.39.2, 1.38.5, 1.37.7, 1.36.11 | 1.40.0, 1.39.3, 1.38.6, 1.37.8 | Only if the Brotli decompressor is enabled. 1.36.12 also includes the fix. |
Istio | 1.29.0–1.29.8, 1.30.0–1.30.5, 1.31.0–1.31.1 | 1.29.9, 1.30.6, 1.31.2 | Only if Brotli decompression is enabled (for example via an EnvoyFilter). 1.29 is end of life. |
curl / libcurl | builds linked to vulnerable libbrotli | rebuild against 1.2.1 or vendor-patched package | Statically linked copies need an updated application build. |
Other language bindings (Java, Ruby, Go, curl_cffi) | see each project | Brotli4j 1.24.0; others per project | Bindings that compile or link the C decoder. Check each project's advisory. |
OS packages (RHEL, Amazon Linux, Debian, Ubuntu, etc.) | per vendor | per vendor | Vendors may backport without changing the upstream version string. |
Also treat as affected: Electron desktop apps and CLI tools that ship their own Node binary, container images built before October 21 that include Node.js, Bun or the Python packages, and any API gateway, reverse proxy or HTTP client that bundles Brotli.
Systems not affected:
Apache httpd with the standard mod_brotli (it compresses but does not decode), and Nginx in its default configuration.
A bare Node.js HTTP server that does not decompress incoming request bodies and does not fetch external responses.
Applications that never decode Brotli data from an untrusted source.
Note that updating npm packages does not fix this. The vulnerable code is in the Node.js runtime binary itself, and the unrelated npm package named "brotli" has nothing to do with it.
How to identify affected systems
Before you begin, run a global discovery to ensure you're working with the most current data from your environment.
1: Using the Axonius AI Companion
Use the AI Companion to identify assets running vulnerable Node.js, Bun, Python Brotli packages, Envoy or Istio, broken down by public internet exposure and by hosting plane (cloud, on-prem, workstations, and remote).
Scoping vulnerable assets and building a dashboard:
Am I affected by CVE-2026-111497? - 1 a breakdown of all servers affected and also which ones are publicly exposed to the internet. - 2 then a breakdown of where they are hosted: cloud, on-prem, workstations, and remote. If you don't find the CVE, check for devices that are live and running Node.js below 22.23.4 / 24.22.1 / 26.12.1, Bun below 1.4.4, Python packages Brotli below 1.2.1 or brotlicffi below 1.2.1.0, Envoy, or Istio. Include end-of-life Node.js versions (21 and older, 23, 25), which will never receive a fix. |
Mobilizing action:
Create a case for tracking resolution. Set <OWNER> as owner. |
2: Using the Axonius MCP
To identify vulnerable assets, use a similar prompt as the Axonius AI Companion. Replace building dashboards and mobilizing action with your harness systems of preference.
Am I affected by CVE-2026-111497? Step 1: a breakdown of all servers affected and also which ones are publicly exposed to the internet. Step 2: a breakdown of where they are hosted: cloud, on-prem, workstations, and remote. Step 3: a list of assets running end-of-life Node.js (21.x and older, 23.x, 25.x) that cannot be patched and must be migrated. Give direct answers straight from Axonius data. Avoid other MCPs given their data are already correlated in Axonius and to keep inference costs low/results deterministic. |
3: Using Axonius Queries
To identify instances of CVE-2026-111497 using Axonius Queries directly:
Already identified by your vulnerability scanners or CNAPP solutions: go to Assets > Exposures > Aggregated Security Findings and search for findings with the CVE: CVE-2026-111497.
Not identified by your vuln scanners, but presence: Because vulnerability scanners might lag behind emergency disclosures or not be able to scan all assets and surfaces, proactively hunt for devices running the affected software. Go to Assets > Compute > Devices, and search for systems with installed software where Software Name contains node, nodejs, bun, brotli, brotlicffi, envoy or istio. Compare the reported versions against the fixed releases in the table above.
Publicly exposed to the internet: To identify publicly exposed servers running the affected software, expand the query from step 2 including the field Internet Exposure = Inbound Exposed or Inbound Partially Exposed.
End-of-life Node.js that will never be patched: From the query in step 2, filter Software Name contains node and Software Version is 21.x or older, 23.x or 25.x. These assets need a runtime migration, not a patch, and should be tracked separately.
How to remediate and mitigate CVE-2026-111497
Apply the vendor patch to the runtime or library, not the application package: Node.js 22.23.4 / 24.22.1 / 26.12.1, Bun 1.4.4, libbrotli 1.0.10 / 1.1.1 / 1.2.1, Python Brotli 1.2.1 and brotlicffi 1.2.1.0, Envoy and Istio per the table above, and your OS vendor's security update. Updating npm packages does not fix it. Patch first the services that decompress request bodies or fetch URLs they do not control.
Rebuild and redeploy anything that bundles a runtime: container images, serverless bundles, Electron apps and compiled CLIs stay vulnerable until they are rebuilt on a patched version. Move workloads on end-of-life Node.js (21.x and older, 23.x, 25.x) to 22.x or 24.x, since those lines will not get a fix.
Until you can patch, block Brotli at the edge: reject requests whose Content-Encoding includes br (match it case-insensitively, including in lists such as gzip, br) at the reverse proxy, load balancer or middleware, and remove br from Accept-Encoding on outbound clients. Vendor WAF rules (see below) cover inbound traffic only. None of this replaces the patch.
WAF and network detection coverage
Several edge providers have shipped rules for this CVE:
Cloudflare added two detections to its Managed Ruleset on October 25, one for requests that declare Brotli Content-Encoding and one for the Next.js image optimizer path; both default to Log so you can review matches before switching to Block.
Vercel enabled blocking rules for all projects on October 21.
Microsoft published Azure WAF guidance on October 23: DRS 2.2 rule 920450 covers Application Gateway and Front Door Premium in Prevention mode, with a custom rule offered for Front Door Standard.
Imperva added dedicated WAF rules validated against its own exploit.
All of these cover inbound requests only.
None of them sees Brotli responses that your services fetch from other servers, and none replaces the patch.
Additional CVE-2026-111497 resources and advisories
Reviewed October 25, 2026. More vendor advisories are expected; re-check on publish.
Primary and upstream:
Runtime and library vendors:
Platform and OS vendors:
Government CERTs:
CISA Known Exploited Vulnerabilities catalog (not listed as of October 25)
Research:
Categories
- Threats Vulnerabilities

Get Started
See how to make asset intelligence actionable with a guided demo:
- Stop chasing data — work from one asset model your entire team can trust.
- See what's exposed before it's a problem — surface coverage gaps automatically.
- Turn alert noise into action — cut thousands of alerts down, to the ones that matter.
