Last updated: 23rd October 2026, 13:00
At a glance
| Threat | Node2Shell, also called HTTP2Shell and Broccoli2Shell (CVE-2026-111497) |
| Severity | High (Node.js and Google Threat Intelligence). CVSS v4.0 9.2, Critical, on the CVE record |
| Status | Fixes available. No exploitation in the wild reported, but code execution has been shown in the lab and reconnaissance scanning has started |
| Exposure | Anything that decompresses untrusted Brotli data, including Node.js, Bun, Python, .NET, Envoy and Istio |
| Priority | Update, rebuild and restart. Strip Brotli from untrusted traffic at the edge until that is done |
Summary
A flaw in Google's Brotli decompression library lets an unauthenticated attacker corrupt memory by sending compressed data that an application decodes, either in a request or in a response to an outbound call. It is not known to be exploited in the wild, but lab exploits work, including one against a standard Node.js build, and scanning has begun. Brotli is built into runtimes and proxies, so fixing it means updating those runtimes, rebuilding images and restarting services.
What has happened
The flaw
Brotli versions 1.0.3 to 1.2.0 mishandle an illegal "block switch" in a compressed stream. Instead of rejecting it as a format error, the decoder treats it as a temporary need for more input. On streaming paths it then keeps appending input to an 8-byte internal buffer and writes past the end of it.
The result can be a crash, a hung process, disclosure of process memory or, in some conditions, code execution. The trigger is small: Google Threat Intelligence describes a crash payload of 22 to 86 bytes.
Fixes and how quickly the picture has moved
- The flaw was reported by OpenAI Codex Security. A fix was committed to Brotli in February 2026 but not released as a security fix until 21 October, alongside Node.js 22.23.4, 24.22.1 and 26.12.1.
- The first public proof of concept achieved code execution only on a deliberately weakened build. On a standard build it caused a crash and a limited memory read.
- On 23 October Imperva's red team reported code execution on the official Node.js 24.22.0 image for Linux arm64, with no debugger or custom build. It took several attempts and the exploit has not been released.
- Google Threat Intelligence considers reliable code execution difficult in practice, because the flaw gives no built-in way to defeat memory randomisation (ASLR) and depends on specific memory layout. Crashing a service is much easier.
- The scope has widened daily, from Node.js to Python, Bun, PHP and Ruby extensions, Envoy, Istio and, on 25 October, .NET.
- CVE-2026-111497 was not in CISA's Known Exploited Vulnerabilities catalogue as of 26 October.
Who is affected
The flaw is in the decoder, so the question is not "do we run Node.js?" but "does anything we run decompress Brotli data that someone else controls?". There are two routes in.
- Inbound. A request body marked Content-Encoding: br that middleware decodes, such as Express 5 and body-parser 2 ( express.json() , express.raw() ), ASP.NET Core request decompression, or an Envoy Brotli decompressor.
- Outbound. A Brotli response from a server you do not control, decoded automatically by Node.js fetch() or node:zlib , Python urllib3, requests, httpx, aiohttp or Scrapy when Brotli is installed, or .NET HttpClient with decompression enabled. Webhooks, link previews, crawlers and third-party integrations are typical.
| Product | Fixed in | Notes |
| Google Brotli (libbrotli) | 1.0.10, 1.1.1, 1.2.1 | Affected 1.0.3 to 1.2.0. Distribution packages may backport the fix and keep the old version number. |
| Node.js | 22.23.4, 24.22.1, 26.12.1 | Brotli is built into the binary, so only a runtime upgrade fixes it. 18.x, 20.x, 23.x and 25.x are end of life and will not be fixed. |
| Bun | 1.4.4 | Affected 1.0.21 to 1.4.3. Rebuild compiled executables. |
| Python Brotli / brotlicffi | 1.2.1 / 1.2.1.0 | Reached through HTTP clients without being imported directly. |
| .NET | 8.0.33, 9.0.22, 10.0.14 | Only where Brotli decompression is enabled (off by default). Republish self-contained apps. .NET Framework is not affected. |
| Envoy | 1.36.12, 1.37.8, 1.38.6, 1.39.3, 1.40.0 | Only when the Brotli decompressor is configured. |
| Istio | 1.29.9, 1.30.6, 1.31.2 | Through its bundled Envoy. |
| Go (andybalholm/brotli) | v1.2.7 | Go port of Brotli. |
| PHP and Ruby Brotli extensions | PHP 0.21.1, Ruby gem 0.9.1 | Both now bundle Brotli 1.2.1. Reports on availability conflict, so confirm in the package registry. |
| curl / libcurl | Follows system libbrotli | Patch the operating system package, then restart. |
Not affected by default: Apache mod_brotli (compresses only), Nginx (does not decode request bodies by default), a plain Node.js HTTP server with no decoding middleware, and .NET Framework.
Still catching up: as of 25 October, bundled copies in products such as DuckDB, ClickHouse, Apache Arrow bundled builds and several 7-Zip forks were unpatched. Check vendor advisories for any product or appliance that bundles Brotli.
What the world is seeing
- No confirmed exploitation. Google Threat Intelligence reports zero confirmed compromises across perimeter, endpoint and passive network telemetry. No vendor or agency has attributed an attack to the flaw, and it is not in CISA's Known Exploited Vulnerabilities catalogue.
- Reconnaissance has started. Google's passive sensors have seen limited, opportunistic scanning of generic ingestion and upload endpoints, such as /api/ingest , /api/v1/upload and /api/webhook, sending Content-Encoding headers and an http2shell proof-of-concept user agent. Separately, ELLIO reports a scanner using the user agent node2shell-check/1.0 to catalogue which hosts decompress Brotli. Neither achieved code execution.
- Exploit code. Several proofs of concept are public. Crashing a service is reliable and easy. Code execution has been shown only in the lab, and the one demonstrated against a standard build has not been released. Treat denial of service as the realistic near-term risk and code execution as the worst case.
- Wide exposure. Wiz reports that 91 per cent of cloud environments contain resources vulnerable to CVE-2026-111497 and 82 per cent have publicly exposed Node.js instances.
- Severity ratings differ. Node.js and Google rate it High. The CVE record gives CVSS v4.0 9.2, Critical. Red Hat rates it Important, Ubuntu Medium, and Amazon gives a CVSS v3 score of 8.1. The difference reflects how hard code execution is in practice, not doubt about the flaw.
- Inventory blind spots. Brotli built into Node.js, Bun or .NET binaries does not show up as a libbrotli package, so scanners can miss it. Patched distribution packages can be wrongly flagged because they keep the old version number. As of 23 October, pip-audit, Dependabot and Safety were not yet flagging the affected Python packages.
- WAF coverage is partial. Cloudflare, Azure, Imperva and Vercel have added rules. These inspect inbound requests only and do not protect an application that fetches a malicious response from an outside server.
What an attack looks like
Node.js, Google and published research give enough detail to explain the shape of an attack, and this bulletin keeps to that level. Payloads, offsets and stream contents are deliberately not shown.
DETECTION CHALLENGE: Decompression usually happens in the runtime or middleware before application logic runs, so application validation and logging never see the decoded payload. A WAF only inspects inbound traffic: a malicious response to an outbound fetch() never passes it.
A crash is the most likely trace, because failed attempts bring the process down. Google advises checking crash logs and core dumps for unexpected SIGSEGV exits in ProcessCommandsInternal or BrotliDecoderDecompressStream. Sysdig recommends watching for a Node.js crash followed by new program execution in the same workload.
After a successful attack the attacker runs as the service account. In containers that includes service account tokens, mounted secrets and cloud credentials.
Recommended actions
Node.js, Google and Microsoft all say updating is the only complete fix. Temporary controls reduce exposure but do not replace patching.
- Find every copy of Brotli, not only Node.js. Check runtimes, container images, SBOMs, Python environments, proxies and appliances. Check the version that running workloads actually report (for example node --version ), not image tags.
- Update to Node.js 22.23.4, 24.22.1 or 26.12.1; Brotli 1.2.1, 1.1.1 or 1.0.10; Bun 1.4.4; Python Brotli 1.2.1 or brotlicffi 1.2.1.0; .NET 8.0.33, 9.0.22 or 10.0.14; and the fixed Envoy and Istio releases. Do internet-facing services that decode request bodies first, then services that fetch external URLs.
- Rebuild and restart. Regenerate lockfiles, rebuild images, republish self-contained .NET apps and compiled Bun executables, redeploy, and restart every process. A running process keeps the old decoder until it restarts.
- Move off end-of-life Node.js lines (18.x, 20.x, 23.x and 25.x). They will not receive a fix.
- If you cannot update yet, reject or strip Content-Encoding: br on untrusted inbound requests at the WAF, reverse proxy or API gateway, and disable Brotli request decompression in middleware such as Express and body-parser (for example, accept only gzip and deflate).
- For outbound clients that talk to untrusted servers, remove br from Accept-Encoding, or uninstall the Python Brotli and brotlicffi packages so clients fall back to gzip and deflate. Some clients decode based on the response header whatever was requested, so this reduces exposure rather than removing it.
- Hunt for signs of attack: SIGSEGV crashes and core dumps involving the Brotli decoder, Content-Encoding: br traffic to ingest, upload and webhook endpoints, and web runtimes spawning shells or making unexpected outbound connections.
- Confirm patch status with hosting providers, appliance vendors and third-party suppliers. Several products that bundle Brotli were still unpatched as of 25 October.
- Do not run public exploit code on your own systems.
In summary
Node2Shell is not known to be exploited in the wild, but lab exploits work, scanning has begun and the flaw reaches well beyond Node.js. Update every runtime and library that decodes Brotli, rebuild and restart, and strip Brotli from untrusted traffic at the edge until that is done.
Nomios is continuing to monitor, threat hunt and follow this situation closely. If you have any questions or queries, contact your account manager or the Nomios team on [email protected].
Get in touch with our security experts
Our UK team is available for a quick call or video meeting. Let's connect and discuss your security challenges, dive into vendor comparison reports, or talk about your upcoming IT projects. We are here to help.









