9.2 CVSS
Critical severity rating on the Brotli decoder flaw -- the highest-scored .NET component vulnerability of 2026
3 runtimes
Major ecosystems -- .NET, Node.js, and Python -- received emergency out-of-band patches within 7 days of each other
0 credentials
Required to trigger the exploit -- any HTTP request body carrying a malformed Brotli stream can reach the vulnerable decoder
7 ecosystems
Affected: .NET, Node.js, Python, PHP, Ruby, curl, and GraalVM all bundle the vulnerable Brotli C library

Reach 50,000+ security professionals

Sponsor a newsletter slot and put your brand in front of CISOs, engineers, and IT decision-makers.

Summarize with:

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 / LibraryAffected RangeFixed VersionRelease Date
Google Brotli (libbrotlidec)1.0.3 -- 1.2.01.0.10, 1.1.1, 1.2.1Oct 21, 2026
Microsoft .NET 8All < 8.0.338.0.33Oct 25, 2026
Microsoft .NET 9All < 9.0.229.0.22Oct 25, 2026
Microsoft .NET 10All < 10.0.1410.0.14Oct 25, 2026
.NET 11 RC311.0.0-rc.311.0.0-rc.3 (updated)Oct 25, 2026
Node.js 22 (LTS)All < 22.23.422.23.4Oct 26, 2026
Node.js 24 (LTS)All < 24.22.124.22.1Oct 26, 2026
Node.js 26 (Current)All < 26.12.126.12.1Oct 26, 2026
Node.js 20 and olderAll versionsNo fix (EOL)N/A
Python brotli< 1.2.11.2.1Oct 25, 2026
Python brotlicffi< 1.2.1.01.2.1.0Oct 25, 2026
Bun< 1.4.41.4.4Oct 26, 2026
PHP (brotli extension)All with libbrotlidec < 1.2.1Depends on extension versionVaries
curl (--compressed)All with libbrotlidec < 1.2.1Update system Brotli packageOct 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.

Free daily briefing

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.

Apply official patch →msrc.microsoft.com/update-guide/vulnerability/CVE-2026-111497

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

  1. Microsoft MSRC: CVE-2026-111497
  2. Wiz Research: Broccoli2Shell Brotli RCE in Node.js
  3. BleepingComputer: Microsoft ships emergency .NET patches for critical Brotli flaw
  4. ELLIO: Node2Shell CVE-2026-111497 RCE analysis
  5. Cynet: Broccoli2Shell / Node2Shell / HTTP2Shell CVE-2026-111497 Explained
Summarize with:

Free resources

25
Free download

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.

No spam. Unsubscribe anytime.

Free download

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.

No spam. Unsubscribe anytime.

Follow Decryption Digest

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.

Free. Unsubscribe anytime. Google popup confirms the Top Stories add.

Eric Bang
Author

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.

Daily Briefing

Get briefings like this every morning

Actionable threat intelligence for working practitioners. Free. No spam. Trusted by 50,000+ SOC analysts, CISOs, and security engineers.

Unsubscribe anytime.

Mythos Brief

Anthropic's AI finds zero-days your scanners miss.