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.
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.
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.
Someone sends your app data.
A request body reaches middleware, a gateway, or another component configured to decompress Brotli.
Your app fetches someone’s data.
An HTTP client receives a compressed response while crawling, building a URL preview, or calling an external service.
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.
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.
| Component | Fixed releases | What to update |
|---|---|---|
| Node.js ↗ | 22.23.424.22.126.12.1 | The runtime, including CI and production images. |
| Brotli · Python ↗ | 1.2.1 | Installed packages, dependency constraints, and lockfiles. |
| brotlicffi · Python ↗ | 1.2.1.0 | Every environment that contains this binding. |
| Native Brotli ↗ | 1.0.10 / 1.1.1 / 1.2.1 | The library and applications that embed it. |
| Bun ↗ | 1.4.4 | The runtime; rebuild compiled executables. |
| Envoy ↗ | 1.40.0 / 1.39.31.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.9 | Follow 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
- Inventory what runs. Check repository dependencies, installed packages, base images, bundled runtimes, CI runners, and production workloads. Record owners for affected services.
- 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.
- 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.
- 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
python -m pip show Brotli brotlicffiUpgrade 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.
# 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'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.
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-Encodingcontainsbrbefore 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
brfromAccept-Encodingis 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.
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.
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 ↗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.
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.
- Node.js · October 2026 security releases ↗
- GitHub · Reviewed Brotli and brotlicffi advisory ↗
- Google Brotli · Upstream releases ↗
- Envoy · Brotli decompressor advisory ↗
- Istio · Security update and upgrade guidance ↗
- Bun · 1.4.4 release notes ↗
- Aikido · Reporting on the broader Brotli impact ↗
Written independently by OpenHack. Credit to the original researchers, maintainers, and reporting teams. Product names belong to their respective owners.