The PoC started with an official Node.js 24.22.0 image for Linux arm64. Researchers at Imperva pointed that image, the same kind of tag teams paste into Dockerfiles, at a blob of crafted Brotli. No debugger. No custom flags. The bundled decoder executed attacker-supplied code. CVE-2026-111497, now called Node2Shell, landed in a week already crowded with consumer account dumps. It punches a hole straight through a cybersecurity habit you probably still have: treating compression as plumbing, not as native code sitting on the request path.

Demonstration of Node2Shell running attacker code through crafted Brotli on official Node.js
Imperva’s Node2Shell demo used an official Node.js 24.22.0 Linux arm64 image and the runtime’s bundled Brotli decoder. No custom build required.

The official image was the exploit host

If you run Node behind a reverse proxy, you have probably congratulated yourself for terminating TLS at the edge and letting the app speak HTTP on localhost. Node2Shell walks through that diagram without slowing down. The decoder ships inside the runtime. An official build is still a pile of C and C++ with a JavaScript face. When the application, or the platform, inflates a Brotli stream in-process, that native code shares memory with your session store, your cloud SDK, and whatever service account the container inherited.

Plenty of stacks enable br automatically because the benchmarks look nicer. Content-Encoding becomes a performance checkbox. Then a client, a CDN, or your own test harness ships compressed bodies as a matter of course. Nobody writes a threat model for the decompressor. You will now.

The PoC used Linux arm64. Do not file that under “not our architecture” and go back to standup. Decoder bugs have a habit of traveling, and the forgotten copies of Node live in CI: the arm runner, the Graviton node pool, the laptop image a contractor still uses for local compose. Those images are official too. They still execute.

This is a bad look for any program that calls the language runtime a trusted computing base while spending the year arguing about npm audit noise. Package lockfiles do not inventory libbrotli. Image scanners that only flag distro packages can miss the copy Node vendors. The researchers needed you to accept compressed input on a stock image. That is a low bar, and a lot of APIs clear it every day.

Your cybersecurity controls still watch the login form

On October 19, Capcom caught a third party inside CAPCOM ID, the account people use for web services and some online games. Public numbers settled around 11 million email addresses, with 11.7 million account records in one report, and 196 logins whose passwords were changed. Players should distrust mail that pretends to be the company. You already know that script. Stolen addresses, a handful of account takeovers, a reset campaign, a phishing aftershock.

Capcom branding tied to the CAPCOM ID account breach
Capcom’s CAPCOM ID incident is the kind of account-layer mess SOCs already staff. Node2Shell never presents a password.

That is the incident shape your SOC is staffed to handle. A firewall in front of the identity provider. Brute-force throttles on /login. Threat-protection rules aimed at credential stuffing. Cyber security budgets still buy that story because it is visible, countable, and easy to put in a quarterly slide.

Node2Shell never fails a password check. It never shows up as a spray. If your threat detection is tuned to 401s and impossible travel, a decoder abort looks like a bad bot or a broken mobile client. Incident response that starts at “was this phishing” will lose an afternoon classifying a crash loop while a child process already has the pod token.

Defense in depth that is only stacked on the authentication path is decorative once the exploit is a Content-Encoding header and a malformed stream. This fight happens in the inflater, during the first bytes of a POST.

Pull secrets out of the process that inflates bytes

You cannot buy a product that deletes a decoder from an official runtime. You can change how that runtime is allowed to live.

Do the immediate work in the next change window, not after the news cycle moves on.

  • Inventory every Node.js 24.x image you actually run, especially Linux arm64 in CI, cloud arm runners, and Kubernetes node pools, and record the tag plus the digest.
  • Hunt every path that decompresses client-controlled data, including reverse proxies that pass br through to the app, body-parser middleware, object-storage gunzip, and webhook ingest.
  • Until a patched Node.js build is in your base images, refuse Brotli from untrusted clients at the edge, or terminate Content-Encoding in a helper process that holds no credentials.
  • Turn off inspector flags and debug ports, and stop running these containers as root.
  • Page on worker deaths, fatal allocator errors, and unexpected child processes that appear after compressed requests.

Assume the first exploit attempts will look like ordinary API traffic. A compressed POST to a health endpoint, a file upload, a GraphQL mutation with br. Your access logs will show 200 or 500, not “RCE.” Build the hunt around process behavior, not around a signature you do not have yet.

The rest is security hardening you should have been doing anyway, now with a name on the ticket. Pin image digests and rebuild when Node publishes a security release. Put bundled native libraries on the SBOM with the same seriousness you give Express. Cap body size, cap decompress time, cap memory. If you truly need br for performance, put inflation in a worker that can die without taking the API keys with it.

If your edge currently advertises br and blindly inflates whatever arrives, flip that default for any service that still has cloud keys in the environment. Performance can wait a patch cycle. A stolen metadata document cannot.

Keep the firewall. Keep the brute-force controls. They still matter for the Capcom-shaped week. Pair them with a control no vendor will upsell: untrusted bytes do not get inflated next to production secrets. After a suspected hit, rotate the identity that Node process held. Recycle the pod after. Memory corruption is an identity incident the moment the process had a role.

Sources

Take Control of Your Server Security

Don't let brute-force attacks slow you down. Try IPBan Pro risk-free for 30 days.

Secure. Automated. Lightweight.

Stay up to date with the latest news, releases and more.

Take Control of Your Server Security

Don't let brute-force attacks slow you down. Try IPBan Pro risk-free for 30 days.

Secure. Automated. Lightweight.