Security Advisories
Node2Shell: What CVE-2026-111497 Means for Your Node.js App
How the exploited Brotli flaw reaches Node.js apps, who is really exposed, why serverless deployments can still need action, and what to do on an end-of-life runtime.
This independent write-up is not affiliated with the vendors named. Patch status reflects public advisories on the date shown, so confirm it against your vendor before acting.
Node2Shell is the name given to CVE-2026-111497, an out-of-bounds write in the Brotli decoder bundled with Node.js. According to the Node.js project, an attacker who can supply Brotli data that an application decompresses with node:zlib can corrupt process memory. Fixes arrived on October 21, 2026 in Node.js 22.23.4, 24.22.1, and 26.12.1.
CISA added the flaw to its Known Exploited Vulnerabilities catalog on October 27, with a federal deadline of November 10. Node.js rates it High, while Google, which issued the CVE for the underlying library, scores it 9.2. Either way, this is one to act on now.
This matters to a very large share of AI-built software, since most of it runs on Node.js. Your exposure depends less on your own code than on your runtime version and on what your dependencies do with compressed data. Both tend to be things nobody has looked at since the first deploy.
/01
Who is actually exposed
The condition is specific: attacker-controlled Brotli data has to reach the decompressor. A bare Node.js HTTP server does not decompress request bodies on its own, according to Aikido's analysis. That does not mean you are in the clear, because a lot of common software does it for you.
Aikido reports that Express 5 and body-parser 2.x decompress request bodies sent with Content-Encoding: br. It also points out the other direction: fetch() automatically decompresses Brotli responses. An application that fetches a URL a user supplied, a webhook target, or a page an AI agent decided to visit may be handling attacker-controlled Brotli without a single line of compression code in the repository.
We could not establish whether a default Next.js app decompresses request bodies, and we found no statement on it. Vercel does warn that Next.js does not block Brotli responses in image optimization, and that self-hosted users should upgrade Node.js.
/02
How serious is it in practice?
CISA's listing is based on evidence of active exploitation, and that should drive your priority. The public picture of reliability is more mixed. As of late October, Aikido reported that one public proof of concept worked only on a weakened test build, and that researchers had reported unreliable code execution against an unmodified Node.js image on Linux arm64.
Read that as early days, not reassurance. Memory corruption exploits generally improve with time and attention. The bug can also cause denial of service, and repeated crashes are an outage even without code execution.
/03
How to patch
Move to Node.js 22.23.4, 24.22.1, or 26.12.1, or later. Node.js published no workaround. Because the decoder ships inside the runtime, updating npm packages will not fix this, and neither will a new lockfile. It is the node binary that has to change.
Some distribution builds of Node.js link against a system Brotli library, so those systems also need the operating system package updated. The flaw reaches well past Node: Rapid7 notes affected implementations in Bun, Python's Brotli and brotlicffi packages, .NET, Envoy, Istio, brotli4j, and operating system packages.
- Run node -v inside the running container or function, not on your laptop.
- Find FROM node: lines in Dockerfiles, and rebuild images instead of reusing cached layers.
- Check version pins in .nvmrc, package.json engines, and CI configuration.
- Update reverse proxies and sidecars that handle Brotli, including Envoy and Istio.
- Update Bun if you use it. Aikido lists 1.4.4 as the fixed release.
/04
Serverless does not mean someone else handled it
Platforms are often the easiest place to be patched, but read the details. Vercel's bulletin says that as of October 28 at 11am PT, all new deployments use a patched Node.js, and that projects on 22.x or 24.x do not need to change their version setting. The word new matters. Vercel says it will update the page as remediation completes, and it does not confirm that existing deployments are patched, so a project that has not deployed since then is worth redeploying.
Other platforms vary. Aikido warns that managed platforms bundling their own Node.js runtime can lag, and Qualys counts serverless functions, including AWS Lambda's Node runtimes, as in scope. We did not find an AWS bulletin on this flaw in its security bulletin list, so check your provider's runtime version directly.
/05
The end-of-life problem
Node.js only patches supported lines, and it states that end-of-life versions are always affected when a security release occurs. Versions 20.x, 21.x, 23.x, and 25.x get no fix. Vercel's bulletin confirms that Node 20 will not receive this one, and says it disables Brotli response handling on outbound requests for unpatched versions, which is a runtime mitigation and not a patch.
Node 20 and older are extremely common in applications generated from slightly dated templates and training data. An AI assistant can happily scaffold a new project on a runtime that is already out of support. Migrating from Node 20 to 22 is usually modest work when done deliberately, but it can be stressful when forced by an active exploit, particularly with native modules involved or without a test suite.
/06
Stopgaps if you cannot upgrade today
Aikido suggests rejecting requests with Content-Encoding: br at your proxy, which covers inbound request bodies but does nothing for responses to fetch(). Qualys recommends limiting payload size and decompression ratio at the proxy or firewall. You can also restrict which hosts your server is allowed to fetch from, which is a good idea on its own merits. These measures narrow the attack without removing it, so treat them as a matter of days.
/07
What this means for vibe-coded products
Node2Shell is a clean example of the gap between working and maintained. Nothing in your app has to be wrong. A dependency decompresses data, a base image gets stale, and a template pinned an old runtime a year ago. The product keeps earning money, and nobody gets an alert. Automated dependency tools do not necessarily help either, since many of them focus on packages and not on the runtime underneath.
If customers rely on your product, someone should own the answers to a few basic questions. What runtime version is in production? When did it last change? Which features fetch URLs influenced by outsiders? How quickly could you ship a runtime upgrade with confidence?
If those answers are hard to come by, that is the point where an experienced engineer pays off. We help teams with AI-built products move to supported runtimes, add the tests that make upgrades safe, and set up a routine that keeps them current, as a production hardening engagement or an ongoing retainer.
Frequently asked
Questions about this topic.
Which Node.js versions fix Node2Shell?
Node.js 22.23.4, 24.22.1, and 26.12.1 fix CVE-2026-111497. End-of-life lines such as 20.x receive no fix, so those applications need to move to a supported major version.
Is updating npm packages enough?
No. The vulnerable decoder is bundled with the Node.js runtime, so you need a new node binary. In containers, that means rebuilding from an updated base image and redeploying.
Is my app affected if I never use Brotli myself?
Possibly. Frameworks and libraries can decompress Brotli for you, and fetch() decompresses Brotli responses automatically. Upgrade the runtime instead of trying to prove that no code path reaches the decoder.
Do I need to redeploy on Vercel?
Vercel says new deployments since October 28 use a patched Node.js on supported versions. It has not confirmed existing deployments, so redeploying an older deployment is the cautious choice. Projects on Node 20 need to change their Node.js version.
Sources