Free HTTP2Shell scanner - check for CVE-2026-111497

Scan type
  • Light scan

Read the Terms of Service

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.

Two paths to a vulnerable Brotli decoder: inbound request bodies, which our scan checks, and outbound responses, which need a self-check

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.

PathCovered by the scan?How to check it
Inbound: Node.js, Bun, and Envoy endpoints that decode Brotli request bodiesYesRun the free scan above
Inbound: other servers that decode Brotli request bodiesYes, only when the target itself decodes Brotli-compressed request bodiesRun the free scan above
Outbound: any client that decodes Brotli responsesNoUse 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.

HTTP2Shell scanner report finding with the request and response behind it

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.

  1. 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 brotlicffi

    Anything below Brotli 1.2.1 or brotlicffi 1.2.1.0 needs an update.

  2. 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" .
  3. 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.

  4. Confirm runtime versions inside running workloads. Check what actually runs, since a patched host can still run old containers:

    node -v
    bun --version
    envoy --version
  5. Check other Brotli bindings in your stack. Java's brotli4j is fixed in 1.24.0.

  6. 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

NameWhere it comes from
Node2ShellImperva Red Team's analysis of the Node.js impact
HTTP2ShellA later name for the wider impact on HTTP clients and servers
Python2Shell, Broccoli2ShellOther 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

ComponentVulnerable versionsFixed in
Google Brotli (C library)1.0.3 to 1.0.9, 1.1.0, 1.2.01.0.10, 1.1.1, 1.2.1
Node.js 26.xBelow 26.12.126.12.1
Node.js 24.xBelow 24.22.124.22.1
Node.js 22.xBelow 22.23.422.23.4
Node.js 20.x and olderAll releases that bundle BrotliNo fix; move to a supported line
BunBelow 1.4.41.4.4
Envoy ProxyBelow the fixed release for each branch1.40.0, 1.39.3, 1.38.6, 1.37.8
IstioBelow the fixed release for each branch1.31.2, 1.30.6, 1.29.9
Python Brotli (PyPI)1.2.0 and earlier1.2.1
Python brotlicffi (PyPI)1.2.0.x and earlier1.2.1.0
Java brotli4jBelow 1.24.01.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

DateEvent
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, 2026Imperva 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, 2026We 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: br before 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

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 do

In 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.

Read more in our vulnerability research manifesto.