SECURITY BRIEFING / CVE-2026-111497

HTTP2Shell.
One decoder.
A much wider impact.

The Brotli flaw behind Node2Shell reaches beyond Node.js. Here’s how to understand your exposure, update affected software, and verify the fix.

VULNERABLE COMPONENTBrotli decoder
POTENTIAL IMPACTRemote code execution
RECOMMENDED ACTIONPatch & redeploy
01 / THE VULNERABILITY

Start with the decoder,
not the protocol.

Brotli makes data smaller for storage and transport. HTTP applications often use it to compress content, then decode that content at the other end. CVE-2026-111497 is a memory-safety vulnerability in Google’s Brotli decoder: malformed compressed input can cause an out-of-bounds write. The potential consequences include a process crash, exposure of process memory, or arbitrary code execution.

The problem was publicized in Node.js as Node2Shell. The same underlying library is used elsewhere, which is why a Node.js-only patching plan can leave other software exposed. Node.js rates its issue High; the GitHub advisory lists a Critical CVSS 4.0 score of 9.2.

THE NAME CAN BE MISLEADING

HTTP2Shell does not mean an HTTP/2 protocol bug. The relevant question is whether untrusted data reaches a vulnerable Brotli decoder. Switching to HTTP/1.1 or adding HTTPS does not repair it.

At a high level, the vulnerable decoder mishandles an invalid stream state instead of stopping with a format error. The upstream correction makes that error explicit and stops decoding. The remedy must reach the copy of Brotli actually used by each application.

02 / WHO IS EXPOSED

Follow the compressed data.

A vulnerable package is a reason to patch. Reachability determines urgency: prioritize processes that decompress data supplied by someone outside your trust boundary.

INBOUND

Someone sends your app data.

A request body reaches middleware, a gateway, or another component configured to decompress Brotli.

Request → Decoder → Application
OUTBOUND

Your app fetches someone’s data.

An HTTP client receives a compressed response while crawling, building a URL preview, or calling an external service.

External server → HTTP client → Decoder

Python applications can acquire Brotli support through dependencies without directly importing it. Inspect resolved packages as well as your own code. Native executables, base images, and bundled runtimes require a separate inventory; a repository lockfile does not describe everything deployed.

Envoy specifically identifies deployments with the Brotli decompressor configured. Istio similarly calls out enabled Brotli decompression, including through an EnvoyFilter. Merely serving Brotli-compressed static files does not, by itself, establish exposure to this decoder flaw.

03 / HOW TO FIX IT

Upgrade. Rebuild. Verify.

Use a security-fixed version in a supported release line. These are published patch baselines, not a recommendation to stay on an older branch. For distribution-managed packages, consult the vendor advisory: a backported fix can retain an older upstream version number.

Published fixed versions · checked October 23, 2026
ComponentFixed releasesWhat to update
Node.js ↗22.23.4
24.22.1
26.12.1
The runtime, including CI and production images.
Brotli · Python ↗1.2.1Installed packages, dependency constraints, and lockfiles.
brotlicffi · Python ↗1.2.1.0Every environment that contains this binding.
Native Brotli ↗1.0.10 / 1.1.1 / 1.2.1The library and applications that embed it.
Bun ↗1.4.4The runtime; rebuild compiled executables.
Envoy ↗1.40.0 / 1.39.3
1.38.6 / 1.37.8
The proxy image. The advisory also lists 1.36.12; prefer a supported branch.
Istio ↗1.31.2 / 1.30.6 / 1.29.9Follow the supported upgrade path and roll out updated proxies.

For curl/libcurl, gateways, appliances, and managed services, establish whether they use an affected decoder and obtain the vendor’s fixed build. Updating a system library will not replace a private or statically linked copy inside an application.

A practical rollout checklist

  1. Inventory what runs. Check repository dependencies, installed packages, base images, bundled runtimes, CI runners, and production workloads. Record owners for affected services.
  2. Update the source of truth. Raise dependency constraints and regenerate lockfiles. Update runtime pins, image references, and build configuration so a later deployment cannot restore the old version.
  3. Build and roll out new artifacts. Rebuild images and bundled executables, deploy them, and restart or replace existing processes. Confirm the rollout reached every replica.
  4. Verify the deployed result. Check installed versions and image digests, run application compatibility checks, and rescan with current advisory data. A clean repository scan alone does not prove production is fixed.

Python: inspect the active environment

TERMINAL · READ-ONLY CHECK
python -m pip show Brotli brotlicffi

Upgrade whichever binding your application uses. If both are installed, update both. With Poetry, uv, or pip-tools, make the corresponding change through your dependency manager and regenerate its lockfile.

TERMINAL · PACKAGE UPGRADES
# Run the applicable command for each installed binding.
python -m pip install --upgrade 'Brotli>=1.2.1'
python -m pip install --upgrade 'brotlicffi>=1.2.1.0'
ADVISORY UPDATE

GitHub’s reviewed advisory now includes both Python packages and their fixed versions. Earlier reporting that the Python mappings were missing is outdated. Refresh your scanner’s database and check its supported files and coverage.

04 / TEMPORARY MITIGATIONS

Stop decoding untrusted Brotli.

If you cannot deploy a patch immediately, remove the vulnerable decoding path while preparing the upgrade. Validate each control against your actual request and response processing order.

  • Inbound traffic: reject bodies whose Content-Encoding contains br before any vulnerable decompression happens. Account for case differences and lists of encodings.
  • Outbound traffic: disable Brotli response decoding or reject Brotli responses before automatic decoding. Removing br from Accept-Encoding is insufficient on its own: a remote server can ignore that preference.
  • Optional Python bindings: if the application works without them, remove both Brotli and brotlicffi and remove extras or constraints that reinstall them. Rebuild and restart. This does not remove decoders embedded in other products.

Test expected behavior when a peer still sends Brotli. A request may fail rather than fall back automatically. Keep temporary controls until patched artifacts are deployed and verified.

05 / HOW OPENHACK HELPS

Turn a dependency finding
into a patching plan.

OpenHack’s supply-chain scanning helps identify vulnerable Python dependencies in supported repository dependency files and surface the patched versions. That includes transitive packages recorded in supported resolved dependency files. Use those findings to locate affected projects, assign upgrades, and rescan after making changes. Our local validation detected CVE-2026-111497 in vulnerable Brotli and brotlicffi dependency fixtures and returned no findings for the patched fixtures; coverage depends on the files scanned and the advisory data available.

We are also developing container-image scanning through customer CI, with image identity, findings, recommended fixes, and scan history in OpenHack. That integration is upcoming, not generally available. Neither repository scanning nor an image scan alone establishes which artifact is running in production.

PUT THE FIX IN MOTION

Find the dependencies.
Ship the upgrade.

Start with OpenHack’s supply-chain analysis and bring your remediation work into one workflow.

Sign up for OpenHack Talk to the team ↗
06 / COMMON QUESTIONS

The details that matter.

Are all HTTP applications vulnerable?

No. Exposure requires an affected decoder and a path that feeds it untrusted compressed input. Patch vulnerable components, then assess that path to prioritize the rollout.

Does updating my npm dependencies fix Node.js?

Not necessarily. Node.js bundles Brotli in the runtime. Upgrade Node.js itself and the images or distributions that supply it, then restart workloads.

Do I need to change from HTTP/2 to HTTP/1.1?

No. The decoding library is the issue. Changing HTTP versions does not replace a vulnerable decoder.

Can I rely on a clean vulnerability scan?

Only within the scan’s actual coverage. Confirm it completed successfully, used current advisory data, and inspected the relevant dependency files or artifacts. Independently check deployed runtimes and vendor-patched builds.

Did OpenHack discover this vulnerability?

No. Node.js credits OpenAI Codex Security researchers Khai Tran and Sylvie Mayer. This is OpenHack’s independently written remediation guide, informed by upstream advisories and public reporting.

07 / SOURCES & UPDATES

Go straight to the source.

This guide was reviewed on October 23, 2026. Check vendor advisories for subsequent corrections, supported versions, and product-specific instructions.

Written independently by OpenHack. Credit to the original researchers, maintainers, and reporting teams. Product names belong to their respective owners.