Free HTTP2Shell scanner - check for CVE-2026-111497
Scan your target for HTTP2Shell (CVE-2026-111497), the Brotli decoder flaw also known as Node2Shell, with this free scanner and download a PDF report you can share with your team.
It tests if your endpoint decodes Brotli request bodies with a vulnerable decoder and shows the request and response behind every finding.
Some HTTP2Shell paths run through outbound HTTP clients, which no external scan can reach. The self-check below covers those in a few minutes.
- Scan type
Light scan
Scan your target for HTTP2Shell (CVE-2026-111497), the Brotli decoder flaw also known as Node2Shell, with this free scanner and download a PDF report you can share with your team.
It tests if your endpoint decodes Brotli request bodies with a vulnerable decoder and shows the request and response behind every finding.
Some HTTP2Shell paths run through outbound HTTP clients, which no external scan can reach. The self-check below covers those in a few minutes.

Am I affected by HTTP2Shell?
CVE-2026-111497 affects your target if a service runs Google's Brotli decoder 1.0.3 through 1.2.0 and decodes Brotli data someone else controls. That covers Node.js below 22.23.4, 24.22.1, or 26.12.1, Bun below 1.4.4, Envoy or Istio with a Brotli decompressor, and Python apps with Brotli below 1.2.1 or brotlicffi below 1.2.1.0 installed.
Upgrade the decoder wherever it runs, then rebuild the container images that bundle it. Fixed versions for every ecosystem sit further down.
Where HTTP2Shell reaches the decoder
HTTP2Shell needs attacker-controlled Brotli data to reach a vulnerable decoder. That happens in two directions, and the direction decides how you find it.

Inbound: servers and proxies that decode request bodies
An attacker sends a request with a Brotli-compressed body, and the server decodes it before your application code runs. Common examples:
- Node.js apps using Express 5 with body-parser 2, Koa body parsers, or
@fastify/compress - Envoy, and Istio through its sidecars, when an HTTP decompressor filter uses Brotli
A bare Node.js http server doesn't decode Brotli request bodies on its own.
Outbound: clients that decode responses
Your code requests a URL, and the server answers with a Brotli-compressed response. If an attacker controls that server, they control the stream your client decodes. Common examples:
fetch()in Node.js and Bun- Python's requests, urllib3, httpx, and aiohttp, whenever Brotli or brotlicffi is installed, even if your code never imports it
- Scrapy, which installs Brotli as a dependency
- libcurl builds that decode Brotli
Look first at features that fetch URLs on someone else's behalf: webhooks, link previews, URL importers, crawlers, and integrations that call third-party APIs.
What our HTTP2Shell scanner checks, and what it can't
The free scanner tests the inbound side from the outside. The outbound side starts inside your network, so no external vulnerability scan can trigger it.
| Path | Covered by the scan? | How to check it |
|---|---|---|
| Inbound: Node.js, Bun, and Envoy endpoints that decode Brotli request bodies | Yes | Run the free scan above |
| Inbound: other servers that decode Brotli request bodies | Yes, only when the target itself decodes Brotli-compressed request bodies | Run the free scan above |
| Outbound: any client that decodes Brotli responses | No | Use the self-check |
How the HTTP2Shell scan works, in short: a few small requests show how each endpoint handles normal and malformed Brotli. Only endpoints that decode Brotli request bodies then receive a stream of about 23 MB, which a patched decoder rejects and a vulnerable one accepts. If the probe can't tell, the scanner falls back to version checks for Envoy, Node.js, and Bun.
Probe matches are marked with Certain confidence and include the full request and response, so you can verify them yourself. For every step and what each result type means, see how we detect Node2Shell.

Before you scan production: endpoints that decode Brotli request bodies receive an upload of about 23 MB. Plan for the bandwidth and any request-size alerts.
Behind a WAF or CDN: if it rejects Brotli-encoded request bodies, the probe can't reach the decoder. A clean result from behind one doesn't prove you're patched, so confirm the version inside the workload.
HTTP2Shell sits in a decoder that Node.js, Bun, Envoy, and Python packages each bundle on their own, and almost none of them expose a version remotely. So any detection based on version strings is mostly guesswork.
That's why we built an active check instead. It sends a request that exercises the Brotli decoding path directly and looks at how the endpoint actually handles it. This approach provides much more reliable results. We tested the check against a vulnerable environment running Node 22.23.3 to confirm it detects the issue correctly.
That check covers servers that decode request bodies. For clients that decode responses, like Python's requests or aiohttp, no external scan can trigger the path, so check installed packages by hand.
In the meantime, our research team is also digging into the mechanics of the bug to build a dedicated Sniper exploit module.
Product Security Manager at Pentest-Tools.com
Check the paths a scan can't reach
One person with access to your repositories or container images can run these checks. Run them even if the scan comes back clean, because a clean scan doesn't reveal anything about outbound clients.
List Brotli packages in every Python environment. Run this in each virtual environment and inside each container image, since images carry their own environments:
pip show brotli brotlicffiAnything below Brotli 1.2.1 or brotlicffi 1.2.1.0 needs an update.
Search lockfiles for the packages and the extras that pull them in.
urllib3[brotli],httpx[brotli],aiohttp[speedups], and Scrapy all install Brotli without anyone importing it:grep -RniE "brotli|speedups|scrapy" \ --include="requirements*.txt" --include="poetry.lock" \ --include="uv.lock" --include="Pipfile.lock" .Find Node.js and Bun code that fetches user-supplied URLs. Search for
fetch()calls and trace where each URL comes from. Prioritize webhooks, link previews, and importers.Confirm runtime versions inside running workloads. Check what actually runs, since a patched host can still run old containers:
node -v bun --version envoy --versionCheck other Brotli bindings in your stack. Java's brotli4j is fixed in 1.24.0.
Rebuild and redeploy. Update base images and wheels, rebuild every image that bundles the decoder, then rerun steps 1 and 4 against the new images.
Need a quick win before the rebuild? Where Brotli support is optional, uninstall Brotli and brotlicffi. urllib3, requests, and aiohttp then fall back to gzip and deflate.
Free HTTP2Shell scanner report (PDF) sample
Once the scan finishes, you get a PDF report you can share with whoever handles remediation. For HTTP2Shell, it includes:
the finding, with the endpoint and the result type behind it
the fixed release for each runtime, across Node.js, Bun, Envoy, and Istio
the severity rating and step-by-step remediation guidance, including how to stop disclosing your runtime version
The report also lists the open ports, DNS records, and technologies the scan found along the way.
Download sample report (PDF)What is HTTP2Shell?
Technical details
CVE-2026-111497 is an out-of-bounds write in Google's Brotli C decoder (c/dec/decode.c), versions 1.0.3 through 1.2.0.
Brotli is a standard compression format on the web, so many runtimes and libraries ship their own copy of the C decoder. Node.js and Bun compile it into the runtime binary, Envoy uses it in its HTTP decompressor filter, and Python's Brotli and brotlicffi packages bundle it in their wheels. Each copy needs its own fix, which is why patching one ecosystem leaves the others exposed.
A crafted Brotli stream can corrupt memory. Depending on the input and the code path, that means a crash, a leak of process memory, or remote code execution with the privileges of the process doing the decoding.
One bug, four names
| Name | Where it comes from |
|---|---|
| Node2Shell | Imperva Red Team's analysis of the Node.js impact |
| HTTP2Shell | A later name for the wider impact on HTTP clients and servers |
| Python2Shell, Broccoli2Shell | Other names circulating for the same bug |
Despite the name, HTTP2Shell has nothing to do with the HTTP/2 protocol. Any attacker-controlled Brotli stream that reaches an affected decoder can trigger it. In tickets and reports, use the CVE ID - CVE-2026-111497 - so every team tracks one issue.
Versions vulnerable to HTTP2Shell
| Component | Vulnerable versions | Fixed in |
|---|---|---|
| Google Brotli (C library) | 1.0.3 to 1.0.9, 1.1.0, 1.2.0 | 1.0.10, 1.1.1, 1.2.1 |
| Node.js 26.x | Below 26.12.1 | 26.12.1 |
| Node.js 24.x | Below 24.22.1 | 24.22.1 |
| Node.js 22.x | Below 22.23.4 | 22.23.4 |
| Node.js 20.x and older | All releases that bundle Brotli | No fix; move to a supported line |
| Bun | Below 1.4.4 | 1.4.4 |
| Envoy Proxy | Below the fixed release for each branch | 1.40.0, 1.39.3, 1.38.6, 1.37.8 |
| Istio | Below the fixed release for each branch | 1.31.2, 1.30.6, 1.29.9 |
| Python Brotli (PyPI) | 1.2.0 and earlier | 1.2.1 |
| Python brotlicffi (PyPI) | 1.2.0.x and earlier | 1.2.1.0 |
| Java brotli4j | Below 1.24.0 | 1.24.0 |
Sources: Node.js, Bun 1.4.4, Envoy releases, Istio bulletin 2026-007, Brotli 1.2.1.
Version numbers only provide a partial view of HTTP2Shell exposure. Container images pin the runtime and wheels they were built with, and some distribution packages lag behind upstream releases. Check what runs inside each workload, then rebuild.
HTTP2Shell severity score unpacked
Google, the CVE Numbering Authority for Brotli, gives CVE-2026-111497 a CVSS v4.0 base score of 9.2 (Critical). The Node.js project rates it High in its own advisory.
The critical rating reflects three things:
- No authentication required: a remote attacker only needs a Brotli stream to reach the decoder.
- No user interaction required: nobody on the target side needs to click or approve anything.
- Reach across stacks: any application on a vulnerable decoder inherits the flaw, whatever language or framework sits on top.
If leadership asks, here's the executive summary: every unpatched service that decodes untrusted Brotli, in either direction, is a candidate for remote code execution. Services that never decode Brotli can't be reached through this flaw today, and they still need the upgrade, because the next dependency update can add a decoding path.
HTTP2Shell disclosure timeline
| Date | Event |
|---|---|
| February 27, 2026 | Google commits the fix to the Brotli repository, with no release or advisory. |
| October 21, 2026 | Node.js releases 22.23.4, 24.22.1, and 26.12.1. Google releases Brotli 1.0.10, 1.1.1, and 1.2.1. Bun releases 1.4.4. |
| October 22, 2026 | The CVE record goes public. Python Brotli and brotlicffi publish advisories and fixed releases. |
| October 22, 2026 | Imperva reports code execution on the official Node.js 24.22.0 Linux arm64 image. |
| October 25, 2026 | We add detection for CVE-2026-111497 to the Network Vulnerability Scanner. |
| October 26, 2026 | We launch the free Node2Shell scanner. |
| October 27, 2026 | We launch this HTTP2Shell scanner and self-check. |
HTTP2Shell exploitation - what attackers can do with it
Here's what researchers have shown so far, ecosystem by ecosystem, and what they haven't:
Node.js: Imperva Red Team ran code on the official Node.js 24.22.0 image for Linux arm64, reaching the decoder through
fetch()and through Express 5 with body-parser 2. It took several attempts, and the fixed release rejected the same input.Python: researchers confirmed memory corruption in the Brotli packages with AddressSanitizer and didn't attempt an exploit.
Public proof of concept: the first one, published October 22, reached code execution only on a deliberately weakened build.
Exploited in the wild: no reports as of October 27, 2026. CISA's SSVC enrichment lists exploitation as none, automatable as no, and technical impact as total.
CISA KEV: not listed as of October 27, 2026.
If an attacker gets code execution, the impact is severe. The code runs with the privileges of the process that decoded the stream, which puts these in reach:
environment variables and mounted secrets, including API keys and database credentials
cloud instance metadata and the IAM credentials behind it
internal services on the same network, through the application's own connections
every request an Envoy proxy handles: Envoy runs as one shared process for all routes. If the memory corruption leads to code execution, the attacker controls that process and can read or change every request it handles, after TLS is decrypted.
Outbound clients deserve the same attention as servers. Workers, crawlers, and integrations that fetch external URLs often hold the API tokens and credentials that make a foothold valuable.
How to mitigate HTTP2Shell
The only complete fix is upgrading every copy of the decoder. Pick the paths that match what you run.
Upgrade paths:
Node.js: upgrade to 22.23.4, 24.22.1, 26.12.1, or later, then rebuild every container image that bundles the runtime. On Node.js 20 or older, move to a supported line.
Bun: upgrade to 1.4.4 or later.
Envoy Proxy: upgrade to 1.40.0, 1.39.3, 1.38.6, 1.37.8, or later in the same supported branch.
Istio: upgrade to 1.29.9, 1.30.6, 1.31.2, or later, so the sidecars pick up the fixed Envoy.
Python: upgrade Brotli to 1.2.1 and brotlicffi to 1.2.1.0 in every environment and image, then redeploy.
Other bindings: upgrade Java's brotli4j to 1.24.0, and track the projects still working on fixes.
If you can't upgrade right away, these temporary controls shrink your exposure while you schedule the fix:
Uninstall Brotli and brotlicffi from Python environments where Brotli support is optional.
Reject request bodies with
Content-Encoding: brbefore any parser decodes them, at the proxy or in your middleware.Turn off Brotli decoding in server-side HTTP clients, especially code that fetches user-supplied URLs.
Disable the Envoy Brotli decompressor filter in both directions, and bind the Envoy admin interface to localhost or a management network.
Note: each control closes one path to the decoder. Upgrading every copy closes all of them.

Get a free HTTP2Shell scan report
HTTP2Shell references
- Pentest-Tools.com Vulnerability & Exploit Database - CVE-2026-111497
- Pentest-Tools.com - free Node2Shell scanner
- CVE.org - CVE-2026-111497
- NVD - CVE-2026-111497
- Google Brotli - v1.2.1 release
- Node.js - October 2026 security releases
- Bun - v1.4.4 release notes
- Envoy Proxy - releases
- Istio - security bulletin ISTIO-SECURITY-2026-007
- Imperva - Node2Shell: from Brotli data to remote code execution
- BleepingComputer - critical HTTP2Shell Brotli vulnerability triggers emergency patches
- Patch the Planet - Brotli
About our Network Vulnerability Scanner
Our Network Vulnerability Scanner is a well-rounded tool for all your network security assessments.
It combines multiple engines and fine-tuned scan settings that surface more than 17,500 vulnerabilities, misconfigurations, and outdated services.
Each scan automatically updates your attack surface and provides an up-to-date map for planning targeted attacks or strategic lateral movements.
Explore a sample report, which includes a vulnerability summary, automatically confirmed findings, evidence, and more.
See what else it can doIn a transparent benchmark, our tool outperformed the 6 most popular network scanners on the market, both open-source and commercial.
FAQs
What is HTTP2Shell?
HTTP2Shell is one of the names for CVE-2026-111497, an out-of-bounds write in Google's Brotli C decoder, versions 1.0.3 through 1.2.0. The name reflects its reach across HTTP clients and servers in Node.js, Bun, Envoy, Python, and other stacks. The CVE record rates it critical, with a CVSS v4.0 base score of 9.2.
Is HTTP2Shell an HTTP/2 vulnerability?
No. The name refers to HTTP stacks in general, and the bug has nothing to do with the HTTP/2 protocol. Any attacker-controlled Brotli stream that reaches an affected decoder can trigger it, whatever protocol carries it.
Is HTTP2Shell the same as Node2Shell?
Yes. Both names refer to CVE-2026-111497, along with Python2Shell and Broccoli2Shell. Node2Shell describes the Node.js impact. For Node.js-specific detail, see our free Node2Shell scanner.
Does this scanner check my Python services?
The scanner tests endpoints that decode Brotli request bodies in Node.js, Bun, and Envoy. Python's main exposure runs through HTTP clients decoding responses, which an external scan can't reach. Use the self-check for those.
Is my Python app affected if it never imports Brotli?
It can be. If Brotli or brotlicffi is installed, requests, urllib3, httpx, and aiohttp decode Brotli responses automatically. An app that fetches URLs an attacker can influence is then exposed. Upgrade Brotli to 1.2.1 and brotlicffi to 1.2.1.0, or uninstall them where Brotli support is optional.
Can I uninstall Brotli instead of upgrading?
As a temporary control, where Brotli support is optional. urllib3, requests, and aiohttp fall back to gzip and deflate without it. Upgrade anyway, since a later dependency update can bring the package back.
Which name should I use in tickets and reports?
Use the CVE ID, CVE-2026-111497. Different vendors and news outlets use different nicknames, and the CVE ID keeps every team tracking the same issue.
Why does the scan upload about 23 MB?
The probe needs a stream large enough to show whether the decoder rejects malformed Brotli the way a patched decoder does. So it first sends a malformed Brotli response class with four one-byte POST requests. Only endpoints that decode Brotli request bodies then receive a 23 MB Brotli stream.
Why are you offering a free scanner for HTTP2Shell?
Every day, our team develops tools, detections, and exploits to help security professionals find vulnerabilities before attackers can exploit them.
We know the fight is unfair: security teams follow strict rules, while threat actors do whatever they want. That's why we build free tools like this one, so security teams can validate their exposure quickly, without waiting for a scheduled scan or a costly engagement.






