Broccoli2Shell CVE-2026-111497: Emergency .NET and Node.js Brotli Patch Stops Pre-Auth RCE
Reach 50,000+ security professionals
Sponsor a newsletter slot and put your brand in front of CISOs, engineers, and IT decision-makers.
CVE-2026-111497, rated CVSS 9.2, is an out-of-bounds write in Google's Brotli C decoder library that lets any unauthenticated HTTP client trigger heap corruption and, in confirmed researcher tests, execute arbitrary code on unmodified .NET, Node.js, and Python servers. Microsoft shipped emergency out-of-band .NET patches on October 25, 2026 -- three weeks after October Patch Tuesday failed to fully address the flaw -- joining Node.js (22.23.4, 24.22.1, 26.12.1) and Python (brotli 1.2.1) in a cross-ecosystem emergency response.
The vulnerability lives in DecodeBlockTypeAndLength(), a function in Google's libbrotlidec C library that validates block-type switches in a Brotli-compressed data stream. Versions 1.0.3 through 1.2.0 return a plain boolean from this function. When an attacker sends a crafted stream containing an invalid block-type switch, the function fails to drain the decoder's internal input buffer. Subsequent decompression writes then extend past the buffer's allocated bounds (CWE-787), corrupting adjacent heap memory. Researchers at ELLIO confirmed a working interactive shell on a stock Node.js x86-64 build using this technique. The root cause is CWE-252 (Unchecked Return Value) -- a single missing error check that propagates into heap corruption.
Seven runtime ecosystems bundle the vulnerable Brotli decoder: .NET, Node.js, Python, PHP, Ruby, curl, and GraalVM. Any internet-facing web service accepting Brotli-encoded HTTP request bodies is exposed right now. Express.js 5 and body-parser 2.x process compressed request bodies by default when the Content-Encoding header is present, meaning the attack surface extends to millions of Node.js APIs without any configuration required. With public proof-of-concept references already circulating and no CISA KEV listing to force a federal remediation deadline, the window for proactive patching is open -- but it will not stay open once automated exploit tooling matures.
How Does the Broccoli2Shell Exploit Work?
The Broccoli2Shell exploit path begins at the HTTP layer and ends at the heap. An attacker sends a POST or PUT request to any endpoint that decompresses Brotli-encoded request bodies -- no authentication, session token, or application-specific knowledge required.
The crafted Brotli stream contains a block-type switch instruction with an invalid value. In the affected versions of Google's libbrotlidec, the function DecodeBlockTypeAndLength() evaluates the switch and returns a plain boolean indicating success or failure. Calling code does not check the return value (CWE-252). When the switch is invalid, the function exits without draining the decoder's small internal input buffer. The decoder then continues, writing decompressed output past the end of that buffer (CWE-787). What gets overwritten depends on heap layout: in the best case for defenders, the process crashes with a segmentation fault; in the worst case, the overwritten region is adjacent to a heap structure that can be shaped into a code-execution primitive.
ELLIO researchers confirmed the latter case on an official, unmodified Node.js x86-64 binary. They obtained an interactive shell using a malformed Brotli body without modifying the server binary, disabling ASLR, or requiring any server-side state. Brandefense separately confirmed RCE on x86-64 with ASLR enabled and display_errors disabled.
The fix in Brotli 1.0.10, 1.1.1, and 1.2.1 makes DecodeBlockTypeAndLength() return the enum constant BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH (numeric value -17) on invalid transitions. Calling code now receives a typed error rather than an ambiguous boolean, and decompression halts cleanly instead of writing past the buffer.
No special tool or skill is required to trigger the vulnerability. Any HTTP client -- curl, a browser, a custom script -- can send a Brotli-encoded body. The attacker's only constraint is reaching an endpoint that processes compressed request bodies, which for Node.js Express 5 and Python aiohttp is any POST endpoint with Brotli support compiled in.
Internal link: PHP2Shell CVE-2026-109618 followed a similar unchecked-return-value pattern in PHP's request handling, demonstrating that memory-management bugs in widely-deployed runtime components reliably produce pre-auth RCE.
Which Versions of .NET, Node.js, and Python Are Affected?
CVE-2026-111497 affects any application that decompresses Brotli data using the vulnerable Google libbrotlidec C library. The table below shows affected and fixed versions across the major ecosystems. Note that .NET Framework is not affected -- only the cross-platform .NET runtime (formerly .NET Core) bundles libbrotlidec.
| Runtime / Library | Affected Range | Fixed Version | Release Date |
|---|---|---|---|
| Google Brotli (libbrotlidec) | 1.0.3 -- 1.2.0 | 1.0.10, 1.1.1, 1.2.1 | Oct 21, 2026 |
| Microsoft .NET 8 | All < 8.0.33 | 8.0.33 | Oct 25, 2026 |
| Microsoft .NET 9 | All < 9.0.22 | 9.0.22 | Oct 25, 2026 |
| Microsoft .NET 10 | All < 10.0.14 | 10.0.14 | Oct 25, 2026 |
| .NET 11 RC3 | 11.0.0-rc.3 | 11.0.0-rc.3 (updated) | Oct 25, 2026 |
| Node.js 22 (LTS) | All < 22.23.4 | 22.23.4 | Oct 26, 2026 |
| Node.js 24 (LTS) | All < 24.22.1 | 24.22.1 | Oct 26, 2026 |
| Node.js 26 (Current) | All < 26.12.1 | 26.12.1 | Oct 26, 2026 |
| Node.js 20 and older | All versions | No fix (EOL) | N/A |
| Python brotli | < 1.2.1 | 1.2.1 | Oct 25, 2026 |
| Python brotlicffi | < 1.2.1.0 | 1.2.1.0 | Oct 25, 2026 |
| Bun | < 1.4.4 | 1.4.4 | Oct 26, 2026 |
| PHP (brotli extension) | All with libbrotlidec < 1.2.1 | Depends on extension version | Varies |
| curl (--compressed) | All with libbrotlidec < 1.2.1 | Update system Brotli package | Oct 21, 2026 |
For .NET applications: exposure requires explicit use of BrotliDecoder, BrotliStream, or request decompression middleware. ASP.NET Core does not enable Brotli request decompression by default, but you should update regardless to close the library-level risk. For Node.js: all Express 5 and body-parser 2.x applications process Brotli-encoded request bodies when the Content-Encoding header is present -- no application-level configuration needed for exposure.
Enterprise Java and Go applications are not directly affected unless they explicitly shell out to libbrotlidec. Ruby's brotli gem links against the system libbrotlidec, so update the system package as well as the gem.
Briefings like this, every morning before 9am.
Threat intel, active CVEs, and campaign alerts, distilled for practitioners. 50,000+ subscribers. No noise.
Who Discovered CVE-2026-111497 and What Happened?
OpenAI's Codex Security team discovered CVE-2026-111497 during internal security research on HTTP compression libraries. OpenAI followed responsible disclosure procedures, reporting the flaw to Google's security team before public disclosure.
The public timeline exposes a significant gap between the Brotli library fix and the .NET ecosystem patch:
October 13, 2026: Microsoft's Patch Tuesday included updates for hundreds of CVEs but did not fully remediate CVE-2026-111497 in the .NET runtime. Several security researchers noted post-Patch-Tuesday that the vulnerable Brotli decoder remained present in updated .NET installations.
October 21, 2026: Google shipped Brotli 1.0.10, 1.1.1, and 1.2.1, fixing the out-of-bounds write. Downstream runtimes began their own patching processes.
October 25, 2026: Microsoft shipped emergency out-of-band security updates for .NET 8 (8.0.33), .NET 9 (9.0.22), .NET 10 (10.0.14), and .NET 11 RC3. The out-of-band release -- unusual for Microsoft outside of Patch Tuesday cycles -- signals the severity and exploitation risk Microsoft assigned to this flaw.
October 26, 2026: Node.js shipped fixed versions 22.23.4, 24.22.1, and 26.12.1. Python's brotli and brotlicffi packages also received fixed releases.
The flaw was separately documented as Node2Shell when Node.js researchers explored it and HTTP2Shell when the HTTP transport layer was emphasized. Broccoli2Shell became the cross-ecosystem tracking name at broccoli2shell.com.
The October Patch Tuesday failure is a particular concern: organizations relying on their standard patch cadence to address the flaw will have remained exposed for nearly two weeks after the Microsoft October 13 patch wave, assuming they did not separately update the Brotli library.
A related developer supply chain risk: the LiteLLM PyPI compromise on October 21, 2026 demonstrates that Python ecosystem attacks are active right now -- update Python dependencies in a controlled process and verify integrity of pip-installed packages.
“The underlying Google Brotli C library shipped an unchecked return value for over six years before this was caught. Every runtime that bundles it is now a liability until patched.”
ELLIO Security Research, October 2026
Indicators of Compromise for CVE-2026-111497
CVE-2026-111497 does not produce network-layer IOCs such as C2 domains or IP addresses. Compromise indicators are behavioral: anomalous process spawning from web worker processes, unexpected writes to temp directories, and abnormal memory access patterns.
No confirmed in-the-wild attacks have been reported as of October 27, 2026. The indicators below are derived from the confirmed exploit chain documented by researchers and represent the artifacts an attacker would produce after successfully triggering the out-of-bounds write and gaining code execution.
Defend against pre-exploitation by monitoring HTTP requests with the Content-Encoding: br header for oversized or malformed bodies. Any Brotli-encoded request body exceeding 64 MB without a corresponding legitimate application workflow warrants investigation. Post-exploitation detection depends on catching the child process spawned by the web worker.
Subscribe to unlock Indicators of Compromise
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
Sigma Detection Rules for CVE-2026-111497 Broccoli2Shell
These two rules cover the primary post-exploitation indicator (web process spawning a shell) and a persistence pattern (web process writing executables to user-writable directories). Both carry experimental status; validate against your environment before enabling automatic blocking. Deploy in alert-only mode first to baseline legitimate activity from your .NET, Node.js, and Python web services.
Subscribe to unlock Sigma Detection Rules
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
Subscribe to unlock Sigma Hunt Queries
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
Subscribe to unlock WAF Detection Rules
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
How to Patch and Mitigate CVE-2026-111497 Now
These steps address both the immediate patching requirement and interim mitigations for systems that cannot be updated immediately. Mitigations without patching reduce exploitation risk but do not eliminate the underlying vulnerability.
Subscribe to unlock Remediation & Mitigation steps
Free subscribers unlock full IOC lists, Sigma detection rules, remediation steps, and every daily briefing.
Why CVE-2026-111497 Matters for Enterprise Web Security
Broccoli2Shell is not a niche language runtime bug -- it is a supply-chain risk embedded in the HTTP stack of seven major ecosystems simultaneously. The vulnerability sits in libbrotlidec, a C library authored by Google and bundled by .NET, Node.js, Python, PHP, Ruby, curl, and GraalVM without independent security review. A single bug in that shared dependency exposes applications across every cloud provider, on-premises data center, and edge deployment simultaneously.
The enterprise attack surface is broad. ASP.NET Core applications represent a significant share of enterprise web APIs, particularly in financial services, healthcare, and government. Node.js powers the majority of modern API gateways, serverless functions, and microservice frontends. Any of these services accepting Brotli-encoded HTTP request bodies -- a configuration that Express 5 enables by default -- is exposed to pre-authentication RCE until patched.
The out-of-band emergency patch release is significant. Microsoft ships out-of-band patches for a narrow category of flaws: those where the exploitation risk is severe enough that waiting until the next Patch Tuesday is unacceptable. The standard Patch Tuesday cycle would not have delivered the fix until November 11, 2026 -- two weeks after the Brotli fix was available and after public PoC references began circulating.
Container environments compound the risk. Organizations running containerized .NET or Node.js workloads must update base images and rebuild all derived containers; patching the host OS alone leaves container workloads unexposed. CI/CD pipelines that pin Node.js or .NET base image digests rather than tracking security releases will remain vulnerable until those digests are updated.
This is the second time in October 2026 that a library-level vulnerability in a widely-bundled runtime component created pre-auth RCE at scale -- the PHP2Shell CVE-2026-109618/109619 chain followed the same pattern two weeks earlier. Runtime vendors need continuous dependency auditing, not reactive patching, to prevent shared libraries from becoming systemic liabilities.
The bottom line
CVE-2026-111497 turns any application decompressing attacker-controlled Brotli data into a remote execution target. The flaw crosses seven ecosystems simultaneously -- .NET, Node.js, Python, PHP, Ruby, curl, and GraalVM -- and requires zero credentials to trigger. Update .NET to 8.0.33, Node.js to 22.23.4, and Python brotli to 1.2.1 before public exploit tooling matures into automated attack campaigns. Organizations running containerized workloads must rebuild base images. The patch window is open today.
This analysis is generic. create a free account to score threats like this against your own stack.
Frequently asked questions
What is CVE-2026-111497 (Broccoli2Shell)?
CVE-2026-111497, also called Broccoli2Shell, Node2Shell, or HTTP2Shell, is a critical out-of-bounds write in Google's Brotli C decoder library, versions 1.0.3 through 1.2.0. The flaw lets an unauthenticated attacker send a malformed Brotli-encoded HTTP request body that corrupts heap memory in the processing server. Depending on heap layout, the result is a crash or arbitrary code execution with the privileges of the web process.
Am I affected if I run ASP.NET Core or an Express.js API?
For .NET: you are affected if your application explicitly uses BrotliDecoder from System.IO.Compression, or if your ASP.NET Core middleware is configured to decompress Brotli request bodies. ASP.NET Core does not enable Brotli request decompression by default, but many enterprise apps enable it via ResponseCompression or custom middleware. For Node.js: any Express 5 or body-parser 2.x application running on Node.js 22 below 22.23.4, 24 below 24.22.1, or 26 below 26.12.1 is exposed whenever it accepts compressed request bodies.
What is the difference between Broccoli2Shell, Node2Shell, and HTTP2Shell?
All three names refer to the same vulnerability, CVE-2026-111497. Node2Shell was the original name used when disclosure focused on Node.js bundles of the Brotli decoder. HTTP2Shell emphasizes that the exploit path travels over the HTTP layer. Broccoli2Shell is the broader research tracking name that covers all affected runtimes including .NET, Python, PHP, Ruby, and curl. The underlying bug is the same out-of-bounds write in Google's libbrotlidec C library.
How do attackers exploit CVE-2026-111497?
An attacker sends an HTTP POST or PUT request to any endpoint that decompresses Brotli-encoded request bodies. The request carries a crafted Brotli stream where a block-type switch field is set to an invalid value. Because DecodeBlockTypeAndLength() returned a plain boolean in vulnerable versions, the invalid switch goes unchecked and the decoder never drains its internal buffer. Subsequent writes land past the allocated buffer boundary, overwriting adjacent heap memory. With a suitable heap layout, this produces a shell. No authentication, session token, or prior knowledge of the application is required.
Is CVE-2026-111497 being exploited in the wild?
As of October 27, 2026, no confirmed in-the-wild exploitation has been reported. CISA has not yet added CVE-2026-111497 to the Known Exploited Vulnerabilities catalog. However, ELLIO researchers confirmed a working shell on an unmodified Node.js x86-64 build, and multiple security firms have published proof-of-concept references. The risk of weaponization is rated high by Microsoft. Patching before exploitation begins is the correct response.
How do I check whether my .NET application uses Brotli decompression?
Search your codebase for BrotliDecoder, BrotliStream, RequestDecompressionMiddleware, and UseResponseCompression. In ASP.NET Core, Brotli request decompression requires explicit opt-in via AddRequestDecompression() and UseRequestDecompression(). Check your Startup.cs or Program.cs for these calls. If neither is present, your application does not decompress Brotli request bodies. You should still update .NET to 8.0.33 or later because the fix addresses the underlying library regardless of your configuration.
Does disabling Brotli at the CDN or load balancer fully protect servers?
No. Stripping Content-Encoding: br at the CDN layer prevents inbound Brotli request bodies from reaching your application server, which closes the most direct exploitation path. However, outbound Brotli response decoding (client receives a Brotli-encoded response) also passes through the vulnerable library if your application or HTTP client library calls BrotliDecoder on the response body. Apply the upstream runtime patch to close all paths. CDN-layer stripping is a useful interim measure, not a replacement for patching.
What exact versions fix CVE-2026-111497 across .NET, Node.js, and Python?
For .NET: update to 8.0.33, 9.0.22, or 10.0.14 (all released October 25, 2026 as out-of-band updates). .NET Framework is not affected. For Node.js: update to 22.23.4, 24.22.1, or 26.12.1. Node.js 20 and earlier are end of life with no fix available. For Python: update brotli to 1.2.1 or brotlicffi to 1.2.1.0 via pip. For the underlying Brotli C library: version 1.0.10, 1.1.1, or 1.2.1. Bun users require 1.4.4 or later.
Sources & references
Free resources
Critical CVE Reference Card 2025–2026
25 actively exploited vulnerabilities with CVSS scores, exploit status, and patch availability. Print it, pin it, share it with your SOC team.
Ransomware Incident Response Playbook
Step-by-step 24-hour IR checklist covering detection, containment, eradication, and recovery. Built for SOC teams, IR leads, and CISOs.
Daily briefings + Google Top Stories in one step.
Enter your email and we'll subscribe you to the daily briefing and add Decryption Digest to your Google Search feed at the same time.

Founder & Cybersecurity Evangelist, Decryption Digest
Cybersecurity professional with expertise in threat intelligence, vulnerability research, and enterprise security. Covers zero-days, ransomware, and nation-state operations for 50,000+ security professionals every morning.
