Google Brotli Decoder (HTTP2Shell) Vulnerability (CVE-2026-111497)

A new critical Remote Code Execution (RCE) vulnerability, CVE-2026-111497 (aka HTTP2Shell / Python2Shell / Node2Shell / Broccoli2Shell), have been identified in Google Brotli decoder library and affects multiple stacks, including Node.js, Python and other products.  The vulnerability allows a remote unauthenticated attacker to corrupt adjacent decoder state memory, disclose sensitive memory contents, cause a denial of service, or potentially execute arbitrary code using a crafted Brotli-compressed stream.  System owners are urged to update their affected systems with the latest patches immediately.

 

Vulnerability

  • Buffer Overflow Vulnerability (CVE-2026-111497)
    • A buffer overflow vulnerability in the Brotli decoder (c/dec/decode.c) in Google Brotli versions 1.0.3 through 1.2.0 on all platforms allows a remote unauthenticated attacker to corrupt adjacent decoder state memory, disclose sensitive memory contents, cause a denial of service, or potentially execute arbitrary code using a crafted Brotli-compressed stream. Users need to update any Brotli libraries or binaries between 1.0.3 through 1.2.0 to the latest available version: 1.0.10 or 1.1.1 or 1.2.1.
    • Change of the vulnerability:
      • October 21: Node2Shell: Node.js shipped the fix first, at 10:38 UTC on October 21, the first wave of coverage treated it as a Node.js runtime bug.  Given the ubiquity of Node.js in web-facing and backend services, vulnerable internet-facing applications may attract early exploitation attempts.
      • October 23: Python2Shell: the PyPI packages Brotli and brotlicffi compile the same C decoder, and that popular Python HTTP clients load them automatically.
      • late October 23: HTTP2Shell: the bug lives in the shared library, not in one runtime, so any software that decodes Brotli over HTTP is in scope.

 

Severity Level

  • Critical 

 

Affected Products

 

Remediation

  • Update any Brotli libraries or binaries between 1.0.3 through 1.2.0 to the latest available version: 1.0.10 or 1.1.1 or 1.2.1. as soon as they released the patch.
    • Node.js: upgrade to 22.23.4, 24.22.1, or 26.12.1, or a newer supported release in the corresponding release line.
    • Native Brotli / libbrotli: upgrade to 1.2.1 or later.30 For older release lines, use patched 1.0.10 or 1.1.1.
    • Python packages: upgrade Brotli to 1.2.1 or later31 and brotlicffi to 1.2.1.0 or later32, wherever installed.
    • .NET: Brotli decompression is not enabled by default in an out-of-the-box .NET or ASP.NET Core install. Applications must manually opt in to ASP.NET Core request decompression or HttpClient response decompression, or they must manually invoke the Brotli decompression APIs provided by .NET.
    • RedHat: Working on a fix for affected versions; they state – unless explicitly stated as not affected, all previous versions of packages in any minor update stream of a product listed here should be assumed vulnerable, although may not have been subject to full analysis.
    • Debian: For the stable distribution (trixie), this problem has been fixed in version 1.1.02+deb13u1.
    • curl / libcurl: update its Brotli dependency to 1.2.133, a patched older release, or the vendor’s security-fixed package. Bundled or statically linked copies require an updated application build.
    • Bun: upgrade to 1.4.4 or later.34 Rebuild compiled executables that bundle Bun.
    • Envoy: upgrade to 1.40.0, 1.39.3, 1.38.6, or 1.37.835, or a newer release in a supported branch. 1.36.12 also includes the fix, but the 1.36 branch is unsupported.
    • Istio: the fix is included in 1.29.9, 1.30.6, and 1.31.2.36 Use a newer supported release in the corresponding line; the 1.29 branch is end of life.
    • Operating-system packages: install the vendor’s security update. Vendors may backport the fix without changing the upstream version number.
    • Other HTTP servers, reverse proxies, API gateways, and HTTP clients: update the affected runtime or Brotli library they use. Where Brotli is bundled into the product, install the product vendor’s release that explicitly addresses this CVE. For managed services, confirm remediation with the provider.
    • Palo Alto Networks products & Prisma Cloud: refers to Palo Alto Products affected by Critical Brotli Vulnerability (CVE-2026-111497)

* Notes:

  • Update dependency locks, rebuild affected applications and container images, redeploy, and restart services. Verify that running workloads use the patched components.
  • Check if you are decoding Brotli as a dependency within your libraries. Stay on guard for wider announcements and be ready to upgrade as soon as possible. If there is no patch
    available for a library or application that may be affected, we recommend disabling Brotli decoding until patches become available.

 

Workarounds

Below are some workarounds to reduce exposure:

  • Configuring your WAF, if any, to reject request bodies with `Content-Encoding: br` after testing. This will help block malicious Brotli payloads from reaching your exposed applications.
    • Incoming HTTP requests: reject requests whose Content-Encoding includes br at the reverse proxy, load balancer, or application middleware, before any vulnerable decoder processes the body. Match br case-insensitively, including within lists of encodings.
    • Outbound HTTP requests: remove br from Accept-Encoding. Also disable Brotli response decoding or reject responses whose Content-Encoding includes br before decoding begins.  Ensure this check occurs before automatic body processing; checking after the client has downloaded and decoded the response is too late.

Changing Accept-Encoding alone is insufficient: a malicious server can send a Brotli response regardless of what the client advertises, and urllib3 selects its decoder from the response’s Content Encoding header.

  • Temporary mitigation: Turning off Brotli decoding cuts off the path to the vulnerable decoder. Each tool handles this differently, and blocking Brotli in one place doesn’t protect the others.
    • curl and libcurl:
      • curl only decodes compressed responses when you pass –compressed. Remove the flag from scripts, aliases, CI jobs, and .curlrc files. Setting an Accept-Encoding header yourself with -H doesn’t turn decoding on.
      • In apps that use libcurl, leave CURLOPT_ACCEPT_ENCODING at its default of NULL, which stops libcurl from decompressing responses. Setting it to a list like “gzip, deflate” won’t protect you, because a malicious server can respond with Brotli regardless of what the client asks for.
      • To check whether your curl build can decode Brotli at all, run curl -V and look for brotli in the Features line.
    • Python
      • Where Brotli support is optional, uninstall Brotli and brotlicffi, remove extras such as httpx[brotli] and any other requirements that would reinstall them, regenerate your lockfiles, and rebuild and restart your workloads. Requests, urllib3, and HTTPX keep gzip and deflate support without these packages, but a server that sends Brotli anyway may cause an unreadable response or an application error. Uninstalling the packages also leaves any Brotli decoders bundled into other runtimes, libraries, or products in place.
    • Node.js and Bun
      • Reject requests whose Content-Encoding includes br in middleware or at your proxy, before Express 5 or body-parser 2.x decodes the body. fetch() decodes Brotli responses automatically and doesn’t offer a standard setting to turn that off, so upgrading the runtime is the only fix for responses your app fetches.
    • Envoy and Istio
      • Envoy only decodes Brotli when the Brotli decompressor filter is configured, which Istio doesn’t do by default. To find it in your EnvoyFilters, run:
        • kubectl get envoyfilters -A -o yaml | grep -nE
          ‘compression\.brotli\.decompressor|brotli\.decompressor\.v3\.Brotli’
        • To check a running sidecar or gateway, run:
          istioctl proxy-config listeners -n -o json | grep -nE
          ‘compression\.brotli\.decompressor|brotli\.decompressor\.v3\.Brotli’
      • If either command returns a match, remove the Brotli decompressor from the EnvoyFilter and run the second command again to confirm it’s gone from the live proxy configuration. Using Brotli only to compress responses doesn’t trigger the vulnerable code.
    • Apache
      • mod_brotli compresses responses and doesn’t decode them, so a standard Apache setup doesn’t run the vulnerable decoder.

 

Reference

 

 

 

Published on: 27 October 2026