The Node2Shell vulnerability is a flaw in the Brotli decoder, tracked as CVE-2026-111497. Update affected Node.js runtimes to 22.23.4, 24.22.1 or 26.12.1, or a newer security-fixed release in the same supported branch. The important exposure question is whether your application decompresses Brotli data an attacker can supply—not simply whether a website uses compression.
Checked 27 October 2026: Node.js published its fixes on 21 October. Red Hat’s 26 October bulletin brings the wider Linux package and container footprint into focus. This is not a newly discovered flaw today, and it is separate from PHP2Shell.
Key takeaways
- Node2Shell and the broader informal label HTTP2Shell refer to the same Brotli CVE, not an HTTP/2 protocol defect.
- Both incoming compressed requests and fetched compressed responses can reach a decoder.
- Patch the runtime or library actually used by the application. A host update does not automatically replace bundled container dependencies.
- Lab code execution has been reported; that is different from confirmed exploitation against production victims.
- An inbound WAF is not complete protection for a service that fetches external Brotli responses.
What is the Node2Shell vulnerability?
Imperva uses Node2Shell as its research name for CVE-2026-111497. HTTP2Shell is an informal wider-ecosystem label used in current technical coverage. Neither name means that every Node.js service, or every HTTP/2 connection, is automatically exploitable.
The Node.js advisory describes malformed compressed input being mistaken for an incomplete stream. Processing continues and writes beyond an internal buffer. The consequence can be a crash, process-memory disclosure or code execution. This is a native decoder defect beneath application code, not a malicious npm package.
Which applications need attention?
Start with the data path. Does untrusted compressed input reach an affected decoder? Vercel’s guidance explicitly includes request bodies and responses an application fetches from another server. A backend can therefore have an exposed outbound path even when inbound requests pass through a WAF.
- Node.js: inspect calls to Brotli decompression APIs and middleware that inflates incoming bodies. Also review remote fetches, including user-selected destinations.
- Linux packages: Red Hat lists RHEL 7–10 as affected and identifies libraries embedded in other applications. Check your exact package and product advisory; this is not evidence that every installed package is reachable.
- Python: the Brotli and brotlicffi packages have their own fixed releases. Inventory the application’s environment, not only system Python.
- Containers: inspect the runtime inside the deployed image. Updating the host’s shared library may leave a bundled copy untouched.
Do not confuse encoding with decoding. Compressing a response is not the vulnerable operation described here. A server that merely sends Brotli-compressed content has not thereby proved that it decodes attacker-controlled input. Conversely, a service with no public upload endpoint can still consume untrusted compressed responses.
Affected and fixed versions
| Component | Remediation baseline | Important qualification |
|---|---|---|
| Node.js 22.x | 22.23.4 or newer fixed release | Update the runtime binary. |
| Node.js 24.x | 24.22.1 or newer fixed release | Check each deployed instance. |
| Node.js 26.x | 26.12.1 or newer fixed release | Use the supported branch appropriate to your application. |
| Google Brotli | Branch fixes: 1.0.10, 1.1.1 or 1.2.1 | Vendor backports may retain an older base version. |
| Python Brotli | 1.2.1 | Check every virtual environment. |
| Python brotlicffi | 1.2.1.0 | Separate distribution/package name. |
The reviewed GitHub advisory identifies vulnerable Google Brotli versions from 1.0.3 through 1.2.0 and lists the Python package fixes. Its affected range must be read alongside the branch-specific patched releases, not as a rule that every numerically lower vendor build remains vulnerable. Brotli 1.2.1’s upstream release explicitly names this CVE.
Unsupported Node.js lines need migration or a supplier-confirmed maintained fix, not an assumption that an omitted line is safe. For bundled copies in other products, use that product’s advisory rather than applying the Node.js version table to everything.
Impact and exploitation evidence
Evidence checked 27 October: Imperva reports code execution in fresh containers using the official Node.js 24.22.0 Linux arm64 image, including configured request parsers and fetched responses. The same inputs were rejected by 24.22.1. Its tests required multiple attempts and do not establish reliability across every architecture or application. LinuxPanda has not reproduced that exploit.
Red Hat describes public crash/memory-corruption proof-of-concept code and high attack complexity. The reviewed reporting does not establish confirmed attacks against production victims. Do not turn a laboratory result into a claim of widespread compromise—or treat the lack of such a report as permission to delay a reachable decoder patch.
The decoder condition itself does not require an application login or a user click. Reaching it depends on the application’s interfaces and access controls. Successful code execution inherits the affected process’s permissions; it is not automatic root access. A service account may nevertheless have valuable application credentials or writable data.
Safe inventory checks
Run these metadata-only examples in the actual application environment:
command -v node
node --version
node -p 'JSON.stringify({node:process.version,brotli:process.versions.brotli,executable:process.execPath})'
python3 -m pip show Brotli brotlicffi
The Node.js process API exposes runtime and dependency metadata. These commands do not test exploitability, prove that every worker has restarted, or establish a vendor backport’s CVE status. Missing Python packages in one environment do not rule out copies elsewhere.
For a running container, substitute its real name:
docker exec YOUR_CONTAINER node --version
Record the application, executable or image digest, installed package revision, untrusted-input path and supplier’s fix reference. That inventory is more useful than a single server-wide “patched” label. Do not send public exploit payloads to production as a verification shortcut.
Patch and verify the deployment
- Match the supplier. Obtain the runtime or library update from the source responsible for that deployment. A distribution backport must be checked against its advisory.
- Replace bundled copies. Rebuild application images on a fixed base and redeploy every replica. Restarting the old image does not add the patch.
- Restart long-running applications. Confirm the new executable is the one the service actually starts, rather than only checking your interactive shell.
- Verify normal behavior. Test request parsing, external API calls and legitimate compressed responses. Keep rollback artifacts controlled so an old image is not accidentally restored.
Vercel distinguishes managed runtime rollout from self-managed backends and asks existing projects to redeploy for its temporary runtime protections. Do not assume a provider’s inbound WAF also patched a separate VPS, CI runner or custom container.
The same Node.js security release also addressed certificate trust. Our eMudhra CA compromise guide covers that separate risk; one update can address several issues, but they should not be conflated.
Temporary mitigations and their gaps
Where application behavior permits, stop accepting or decoding untrusted Brotli input until the patch is deployed. Review both incoming bodies and outgoing clients. Removing Brotli from one negotiation header does not prove that no other library can invoke a decoder.
An edge rule can reduce inbound exposure, but it does not inspect responses fetched directly by a backend. Test changes for legitimate traffic and use the vendor’s application-specific guidance. Do not merely remove an encoding label while passing the same encoded bytes downstream. Patching remains the durable fix.
Our assessment: patch the consumer, not the buzzword
The operational trap is to find a fixed system package and stop looking. Our recommended order is to identify reachable decoding paths, patch the runtime or library that owns each path, then confirm the replacement is running. Prioritize exposed consumers without mistaking a package-presence finding for a successful attack.
We would not publish this as “every Linux server can be rooted.” It is a serious memory-safety issue with a specific input prerequisite and meaningful vendor fixes. Unlike the separate PHP2Shell vulnerabilities, this article concerns Brotli decompression. The useful response is a dependency-and-deployment inventory, not panic or a cosmetic application-package update.
Frequently asked questions
Is Node2Shell the same as HTTP2Shell?
They are names used for CVE-2026-111497. HTTP2Shell emphasizes that the decoder appears beyond Node.js; it does not mean a defect in HTTP/2 itself.
Will npm update fix Node2Shell?
Not when the vulnerable decoder is bundled in the Node.js binary. Install a fixed runtime and redeploy the application.
Does enabling Brotli compression mean my server is exposed?
Not by itself. The key condition is decoding untrusted Brotli data with vulnerable code. Review the complete application path.
Do I need to patch if a WAF is enabled?
Yes. Its coverage may exclude outbound responses, direct-origin traffic or other decoder callers.
Sources
- Node.js: 21 October security release and fixed runtime downloads
- Red Hat: 26 October Linux impact and exposure bulletin
- GitHub reviewed advisory: affected ranges and Python fixes
- Google Brotli: 1.2.1 security release
- Imperva: independent exploitation research and testing limits
- Vercel: runtime remediation and WAF limitations
- Axonius: wider ecosystem naming and technical context
- Node.js: runtime metadata documentation










Comments