Node.js security release for the Brotli decoder (CVE-2026-111497) by Node.js and Google
Critical on paper (9.2), hard to exploit on standard builds, and a free patch. Check your update mode today.
The pain: A bug in the compression library inside Node.js means a malicious server or client can crash, and possibly take over, any Node service that decompresses Brotli data: webhooks, fetched pages, uploads. You don't know which of your functions run a patched Node.
The fix: Node.js 22.23.4, 24.22.1 and 26.12.1 fix it. Zip Lambdas on the managed runtime with automatic updates get the fix from AWS without a deploy; pinned functions and container images only get it when you act.
What happened
On 21 October, Node.js shipped a security release for a bug in the Brotli decoder it bundles from Google (CVE-2026-111497, nicknamed "Broccoli2Shell"). A crafted Brotli stream makes the decoder keep writing into an 8-byte internal buffer instead of failing. Node.js rates it high; Google, as the authority for the CVE, scores it 9.2 out of 10. It's fixed in Node.js 22.23.4, 24.22.1 and 26.12.1, and in Brotli 1.2.1 (1.1.1 and 1.0.10 on older branches).
Node.js names the attack path plainly: data your app decompresses with node:zlib. The explainer site adds fetch() decoding br responses and the Express 5 body parsers. In practice, that's any webhook, upload or fetched page you don't control. The explainer also reports that the public proof of concept only crashes standard builds, and that no attacks had been seen as of 22 October. So this is a patch-today problem, not a panic.
Where you stand depends on how you deploy
- Zip Lambda on the managed runtime, update mode Auto (the default): AWS patches the runtime, and your functions pick it up without a deploy. The catch is that I found no AWS bulletin or runtime release note saying the
nodejs22.xandnodejs24.xruntimes already carry the fixed builds. Logprocess.versions.nodefrom one function and you'll know. - Update mode "Function update": you get the fix on your next deploy. Redeploy.
- Update mode Manual (a pinned runtime version): never patched. AWS documents Manual as a temporary rollback. Switch it back to Auto.
- Container images, on Lambda or Fargate: nothing patches itself. Rebuild on a base image with a fixed Node, redeploy every function, and check the version in the running code.
- Node.js 20 and older: the Node.js post lists only 22, 24 and 26. Move to 22 or 24.
- Your own copies: a native Brotli package in
node_modules, or Python'sbrotli, is a separate fix (1.2.1).
On Cloudflare Workers, Cloudflare runs the runtime, so there's nothing for you to patch. It hasn't said which Brotli build workerd uses.
The argument this settles
I stopped running Lambda as container images years ago (the stack), partly because I was tired of upgrading Node on AWS's calendar. This week shows the other side of that complaint. On the managed runtime, AWS's calendar is the one that patches you. With an image, you own the Node binary and the Brotli inside it, and every function stays vulnerable until you rebuild it. For most teams, letting AWS own the patching is the better deal.
My verdict
No change to my pick: zip Lambdas on the managed runtime, updates on Auto. The script in the examples below lists every Node.js function with its update mode. Run it today, fix the pinned ones, and rebuild your images. The risk is medium: critical on paper, hard to exploit, and mostly patched for you, unless you pinned something.