HTTP2Shell is a name some researchers use for CVE-2026-111497, the Brotli decoder out-of-bounds write also known as Node2Shell, when it reaches HTTP stacks outside Node.js. Any client, server or proxy that decodes Content-Encoding: br with Google Brotli 1.0.3 to 1.2.0 is exposed. In Python, the Brotli package up to 1.2.0 and brotlicffi up to 1.2.0.2 bundle the vulnerable decoder; requests, urllib3, httpx and aiohttp use them automatically when installed. Fixed in Brotli 1.2.1 and brotlicffi 1.2.1.0.
What HTTP2Shell is
HTTP2Shell is not a separate CVE. It is the same Brotli decoder bug tracked as CVE-2026-111497, described from the point of view of HTTP in general rather than Node.js in particular. The name is far less established than Node2Shell; you will mostly see it in dependency-security write-ups.
The flaw is in Google's Brotli C library, versions 1.0.3 to 1.2.0, in the streaming decoder: a malformed block switch is treated as "need more input" instead of a format error, and the decoder keeps writing past a small internal buffer. Any software that embeds that library and decodes untrusted br data inherits the bug, whatever language sits on top. The name does not refer to the HTTP/2 protocol; HTTP/1.1 and HTTP/2 are equally affected because the bug is in body decoding.
Where the exposure shows up
The bug only fires when attacker-controlled Brotli data is decoded, so the question is which of your components decode br:
- Python HTTP clients. requests and urllib3, httpx and aiohttp advertise
brinAccept-Encodingand decode Brotli responses automatically when the Brotli or brotlicffi package is installed. A scraper, webhook consumer or link-preview service fetching attacker-chosen URLs is exposed. - Python servers and middleware that inflate compressed request bodies.
- Proxies, gateways and CDN-style services that decompress traffic to inspect or rewrite it.
- Node.js, Bun and Electron, covered on the Node2Shell page.
A gap worth knowing about: as of October 23, 2026, the Python package fixes had no advisory database entry, so dependency scanners may not flag the vulnerable versions. Check versions by hand.
How to check if you are exposed
Look for the decoder in every environment that handles untrusted HTTP:
- Python:
pip show brotli brotlicffi, orpip list | grep -i brotli. Vulnerable if Brotli is 1.2.0 or older, or brotlicffi is 1.2.0.2 or older. - Lock files: search
requirements.txt,poetry.lockanduv.lockforbrotliandbrotlicffi; they often arrive as an optional extra such asurllib3[brotli]oraiohttp[speedups]. - System packages: OS-level
libbrotliused by native software. Check your distribution's advisory for the patched package. - Containers: scan images, not just source repositories. Wheels bundle their own compiled copy of the decoder.
How to fix and mitigate
Upgrade the decoder wherever it lives:
- Python: Brotli 1.2.1 or later, brotlicffi 1.2.1.0 or later, then rebuild images.
- Native and system libraries: Brotli 1.0.10, 1.1.1 or 1.2.1 or later, depending on your branch.
- Node.js: 22.23.4, 24.22.1 or 26.12.1 or later.
If you cannot patch a component yet, stop it from decoding untrusted Brotli: remove the Brotli package so clients fall back to gzip, strip br from outbound Accept-Encoding headers, and reject inbound Content-Encoding: br at the edge. These reduce exposure; only the library upgrade fixes the bug.
References
- [1]NVD: CVE-2026-111497(NIST NVD)
- [2]Google Brotli releases(Google)
- [3]PyPI: brotlicffi(PyPI)
- [4]Node.js October 2026 security releases(Node.js)
- [5]MITRE CWE-787: Out-of-bounds Write(MITRE)