TL;DR: The big Node.js vulnerability of October 2026 is CVE-2026-111497, nicknamed Node2Shell and now HTTP2Shell. It’s an out-of-bounds write in Google’s Brotli decompression library (versions 1.0.3 through 1.2.0), so it reaches far beyond Node.js: Python’s Brotli and brotlicffi packages, Bun, Envoy, Istio and many Linux packages carry the same code. The CVE record scores it 9.2 (Critical) on CVSS v4. Update now: Node.js 22.23.4, 24.22.1 or 26.12.1; Python Brotli 1.2.1 / brotlicffi 1.2.1.0; Bun 1.4.4. Node.js 20 and older get no fix. Update (October 29): CISA added it to its exploited list on October 27 (federal deadline November 10), and two honeypot operators logged exploitation attempts on October 26 and 27. No confirmed successful compromise has been reported, but failed attempts can still crash unpatched services.
Last updated: October 29, 2026. By Veer. Facts checked against the Node.js security advisory, the Brotli 1.2.1 release, the Bun advisory, Debian, Ubuntu and Red Hat trackers, CISA’s KEV catalog, and reporting by The Hacker News, Aikido, Tanium, Brandefense and Mallory.
Update (October 29, 2026): Three developments since our last update, all from SecurityWeek (October 28):
- CISA now lists it as exploited. CVE-2026-111497 was added to the Known Exploited Vulnerabilities catalog on October 27, with a remediation deadline of November 10 for US federal civilian agencies. CISA gave no details of the attacks.
- Attempts seen in the wild. Previdian recorded one exploitation attempt on October 27 from a US-based IP address, noting that its “confirmed” rating “does not mean the attempt succeeded.” ELLIO’s sensors caught a malicious request aimed at Node.js 24.22.0 on x86-64 on October 26, from an IP it had previously seen targeting PHP2Shell. ELLIO says that exploit was broken and didn’t produce a shell in 50 of its own tests, but warns that failed attempts can crash the target process.
- VMware is affected. Broadcom says SDDC Manager in VMware Cloud Foundation and vSphere Foundation uses Node.js and is affected (CVSS 9.8 for SDDC Manager 9.1.1). Patches are pending; Broadcom has published workarounds.
What it means for you: nothing changes in the fix (update Node.js, Brotli or Bun, rebuild images, restart), but it’s now an “exploited” bug, so move it to the top of your patch list.
What is the Node.js vulnerability (HTTP2Shell / Node2Shell)?
It’s a memory-corruption bug in the Brotli decoder that Node.js bundles, and it can let an attacker who sends crafted compressed data crash your app, read its memory or potentially run code. Brotli is Google’s compression format, and it’s one of the main ways web servers shrink HTML, CSS, JavaScript and API responses (Content-Encoding: br).
The Node.js advisory explains the root cause in one line: “An invalid block switch was reported as a temporary need for more input instead of a permanent format error, so the streaming decoder kept appending input bytes to an eight-byte internal buffer.” In plain English, the decoder hits a point in the stream that should be impossible, wrongly decides it just needs more data, and keeps writing past the end of a tiny buffer.
Key facts you can quote:
- CVE: CVE-2026-111497 (CWE-787 out-of-bounds write; Aikido also lists CWE-252, unchecked return value).
- Affected code: Google Brotli 1.0.3 through 1.2.0. Fixed upstream in 1.0.10, 1.1.1 and 1.2.1, all published on GitHub on October 21, 2026.
- Severity: 9.2 Critical on CVSS v4.0 in Google’s CVE record (per Tanium and Aikido). Node.js rates it High; Red Hat rates it Important (8.1 on CVSS 3.1), citing the need for a malformed stream and platform hardening.
- Who found it: Node.js credits OpenAI Codex Security (Khai Tran and Sylvie Mayer).
- The awkward part: the fix was committed to Google’s Brotli repository on February 27, 2026 (commit 0ed4268) with no security note and no release, so nobody shipped it for eight months, according to Tanium’s timeline.
Why two names?
Node2Shell and HTTP2Shell are the same bug, one CVE. It was called Node2Shell first because Node.js shipped the first fix on October 21. Aikido renamed it HTTP2Shell on October 23 after showing Python HTTP clients were exposed too, and Bun used the new name for its advisory on October 24. Despite the name, it has nothing to do with the HTTP/2 protocol; the bug is in the Brotli decoder file c/dec/decode.c, as Brandefense points out.
Which versions are affected, and which are fixed?
Anything that decompresses Brotli with a vulnerable copy of Google’s decoder is in scope. Here are the fixed versions published by each project as of October 25, 2026.
| Software | Affected | Fixed version | Source |
|---|---|---|---|
| Node.js 26.x (Current) | Before 26.12.1 | 26.12.1 | Node.js |
| Node.js 24.x (LTS “Krypton”) | Before 24.22.1 | 24.22.1 | Node.js |
| Node.js 22.x (LTS “Jod”) | Before 22.23.4 | 22.23.4 | Node.js |
| Node.js 20.x and older, 23.x, 25.x | All | No fix (end of life) | Node.js release schedule |
| Google Brotli library (C) | 1.0.3 to 1.2.0 | 1.0.10, 1.1.1, 1.2.1 | google/brotli |
Python Brotli (PyPI) |
1.2.0 and earlier | 1.2.1 | Aikido, PyPI |
Python brotlicffi (PyPI) |
1.2.0.x | 1.2.1.0 | PyPI |
| Bun | 1.0.21 to 1.4.3 | 1.4.4 (rebuild bun build --compile apps) |
Bun advisory |
| Envoy | With Brotli decompressor configured | 1.40.0, 1.39.3, 1.38.6, 1.37.8 | Envoy advisory |
| Istio | With Brotli decompression enabled | 1.31.2, 1.30.6 (1.29.9 is end of life) | Istio bulletin |
Ruby brotli gem |
Before 0.9.1 | 0.9.1 | Brandefense |
A Node.js timing note for US and UK teams planning upgrades: per the official Node.js release schedule, Node.js 24 moved to maintenance on October 20, 2026, Node.js 26 becomes LTS on October 28, 2026, and Node.js 20 reached end of life on April 30, 2026. If you’re still on 20, this is the vulnerability that should force the move.
Where Linux distributions stand
Debian and Alpine have fixed packages; Ubuntu and Red Hat Enterprise Linux did not as of the latest tracker updates. Distributions often backport fixes without changing the upstream version number, so compare the full package release, not just “1.0.9” or “1.1.0”.
| Distribution | Status | Fixed package |
|---|---|---|
| Debian 12 (bookworm) | Fixed (DLA-4855-1) | brotli 1.0.9-2+deb12u1 |
| Debian 13 (trixie) | Fixed (DSA-6582-1) | brotli 1.1.0-2+deb13u1 |
| Debian forky / sid | Vulnerable | None yet (1.2.0-4) |
| Alpine 3.21 / 3.23 / 3.24 | Fixed | brotli 1.1.1-r0 / 1.2.1-r0 |
| openSUSE Tumbleweed | Fixed | brotli 1.2.1-1.1, nodejs24 24.22.1-1.1 |
| Ubuntu 16.04 to 26.10 | “Needs evaluation” for brotli and nodejs | None listed |
| RHEL 8, 9, 10 | Affected | None listed (Red Hat Hardened Images only, RHSA-2026:87420) |
Sources: Debian security tracker and Ubuntu CVE page, both checked October 25; Alpine, SUSE and Red Hat status as compiled by Brandefense on October 24. On Debian, the system brotli package is the one that fixes Node.js, because Debian’s nodejs links the system library.
Am I affected?
You’re exposed if something you run decompresses Brotli data that someone else controls, in either direction. No login is needed, but the attacker’s data has to reach the decoder.
- Inbound (server side): your app decodes a request body sent with
Content-Encoding: br. Express 5’s body parsers (express.json(),urlencoded(),text(),raw()) decode Brotli bodies, The Hacker News reports; Express 4 rejects Brotli bodies, per Tanium. A plain Node.jshttpserver doesn’t decode a Brotli body just by receiving it. - Outbound (client side): your app fetches a Brotli response from a server an attacker controls: webhooks, link previews, crawlers, RSS readers, “import from URL” features and AI agent tools. Node.js
fetch()and Bunfetchdecode Brotli automatically, and Python’s urllib3 (so requests), httpx and aiohttp do the same whenever Brotli or brotlicffi is installed, according to Aikido. - Python with no
import brotlianywhere: still exposed if the package is installed, because HTTP clients load it on their own. Scrapy installs it for you. Aikido puts Brotli’s downloads at 82.8 million a month.
Probably not affected: Apache’s mod_brotli and nginx, which compress responses but don’t decode Brotli by default (Aikido, Mallory). Ordinary visitors browsing your website aren’t at risk from this bug on your server; it’s software that decodes hostile Brotli data that matters.
Don’t forget bundled copies. Tanium reports that VS Code Server 1.143.1 (bundling Node.js 24.22.1) is fixed, while Kibana had no fix yet as of October 24. Electron desktop apps, single-executable apps and container images carry their own Node.js and stay vulnerable until their vendor or you rebuild them.
Is HTTP2Shell being exploited?
Yes, attempts have been seen. CISA added CVE-2026-111497 to its exploited list on October 27, and honeypots logged attempts on October 26 and 27, though no successful compromise had been confirmed as of October 28. Here’s what each source says:
- CISA: CVE-2026-111497 was added to the Known Exploited Vulnerabilities catalog on October 27, 2026, due November 10 (catalog version 2026.10.28, checked October 29). It was not listed as of October 25.
- Imperva (October 22): demonstrated code execution on the official, unmodified Node.js 24.22.0 image for Linux arm64, through both
fetch()and Express 5 request parsing. It took several attempts, and 24.22.1 rejected the same data (The Hacker News). - OtterSec (October 24): reported a privately held, AI-written exploit that succeeded 50 times out of 50 against the official Node.js 24.22.0 image on x86_64 with ASLR on, per Mallory. It hasn’t been published.
- Public code: Mallory tracks 35 GitHub repositories for the CVE (Brandefense counted 38). None runs code on a stock Node.js build, but several can hang or crash a vulnerable service with a few dozen bytes. Treat remote denial of service as available to anyone.
- The dissent: one researcher argues the bad write can’t lead to code execution and the real impact is a crash. Two independent teams report code execution on official builds, so don’t bank on that argument.
Scam warning: a crypto token called “$HTTP2SHELL” started circulating on X within about 40 minutes of the name spreading, and some “scanner” repositories reuse old, unrelated projects named http2shell, Brandefense reports. Take fixes only from the vendor pages linked above, and don’t run random exploit or checker code outside an isolated lab.
This is the second “2Shell” bug in a week: the PHP vulnerability (PHP2Shell) hit PHP servers on October 21 and is already seeing mass exploitation attempts. Earlier in the month, the Plex vulnerability went from public proof of concept to CISA’s exploited list within days, which is a good reason not to wait on this one.
How to fix the Node.js vulnerability: step by step
Update every copy of the decoder, then restart or rebuild whatever was running the old code. A patched package on disk does nothing for a process that already loaded the vulnerable version.
- Check your Node.js version. Run
node -v. You need v22.23.4, v24.22.1 or v26.12.1 or later on that line. Don’t rely onprocess.versions.brotli: Tanium notes it still reports 1.1.0 or 1.2.0 on fixed releases because the fix was cherry-picked. - Update Node.js. Download from nodejs.org, or use your version manager:
nvm install 24.22.1(orfnm install,volta install node@24.22.1). On Homebrew, runbrew upgrade node. Then repeat on every CI runner and build agent. - Rebuild container images. Pull a fresh
node:24.22.1(or 22.23.4 / 26.12.1) base image and rebuild; Tanium warns that cached base layers may still be old. Redeploy and confirm withdocker run --rm IMAGE node -v. - Fix Python environments. Run
pip show Brotli brotlicffiin every virtualenv, container and CI image. Upgrade withpip install -U "Brotli>=1.2.1"orpip install -U "brotlicffi>=1.2.1.0", then regenerate lockfiles (Poetry, uv, pip-tools). Usepipdeptree -r -p Brotlito see what pulls it in. Aikido warned that as of October 23, pip-audit, Dependabot and Safety didn’t flag the vulnerable PyPI versions yet, so check by hand. - Update Bun to 1.4.4 with
bun upgrade, and rebuild anybun build --compileexecutables. - Patch Linux system packages (
libbrotli1/brotli) where your distribution has a fix:sudo apt update && sudo apt install --only-upgrade libbrotli1on Debian,apk upgrade brotlion Alpine. Restart services afterward. On Ubuntu and RHEL, watch the vendor page daily. - Update proxies: Envoy and Istio to the fixed versions in the table above.
- Move off Node.js 20 or older. There is no fix coming. Plan the jump to 22 or 24, or to 26 once it becomes LTS on October 28. If you also track Windows lifecycles, our Windows end-of-support calendar covers those dates.
If you can’t patch today
These cut exposure but don’t replace the update (Aikido, Tanium, Bun):
| Where | Stopgap | Catch |
|---|---|---|
| Reverse proxy / WAF / load balancer | Reject requests whose Content-Encoding includes br (case-insensitive, including inside lists) |
Covers inbound only, not responses your code fetches |
| Express 5 | express.json({ inflate: false }), same on urlencoded(), text(), raw() |
Also rejects gzip and deflate bodies; check your clients |
| Python | Uninstall Brotli and brotlicffi; remove extras like httpx[brotli] |
Breaks Scrapy and WOFF2 font handling; a server that sends Brotli anyway may cause errors |
Bun fetch |
Pass decompress: false per request |
Applies only to that request |
| Outbound fetchers | Egress allow-list for webhooks, previews and crawlers | Doesn’t help for user-supplied URLs you must fetch |
| Envoy / Istio | Remove the Brotli decompressor filter | Loses Brotli decompression |
Stripping br from your Accept-Encoding header isn’t enough on its own: a malicious server can send Brotli anyway, and urllib3 picks its decoder from the response header. Vercel added WAF rules for hosted projects on October 21, but those rules don’t cover Brotli responses your own server-side fetch() calls decode (The Hacker News).
What to patch first
Start with anything that decodes Brotli from strangers. Based on the guidance from Brandefense, Mallory and Tanium, a sensible order is:
- Internet-facing Express 5 apps and Envoy gateways with the Brotli decompressor on.
- Fetchers: crawlers, link previews, webhook senders, RSS readers, scrapers and AI agent sandboxes that browse arbitrary URLs. If you run AI agents with web access, our AI agent security checklist covers the wider risks.
- Build servers and developer laptops that run Node.js, Bun or Python and pull third-party content.
- End-of-life Node.js (20 and older), which won’t get a fix at all.
- Linux hosts, as each distribution ships its package.
After patching, look back for warning signs: Node.js, Bun or Python processes that crashed with SIGSEGV or kept restarting since October 21, node spawning a shell or download tool, and spikes of inbound requests carrying Content-Encoding: br. Each failed exploit attempt usually crashes the process, so a service stuck in a restart loop deserves a look.
HTTP2Shell timeline
| Date (2026) | What happened |
|---|---|
| February 27 | Fix committed to google/brotli with no advisory or release |
| October 6 | Envoy ships fixed releases (advisory follows October 23) |
| October 15 | Istio security bulletin names CVE-2026-111497 |
| October 21 | Node.js 22.23.4, 24.22.1 and 26.12.1 released; Brotli 1.0.10, 1.1.1, 1.2.1 published; Vercel deploys WAF rules |
| October 22 | Bun 1.4.4 and Python Brotli 1.2.1 / brotlicffi 1.2.1.0 released; CVE record published at 9.2; Imperva shows code execution on an official arm64 build |
| October 23 | Aikido shows Python HTTP clients are exposed and coins “HTTP2Shell”; Bun advisory published; Czech national CERT urges patching |
| October 24 | Ruby brotli gem 0.9.1 ships; OtterSec reports a reliable private exploit; Ubuntu and RHEL still list no fixed package |
| October 25 | Still not in CISA KEV; no in-the-wild exploitation reported |
| October 26 | ELLIO logs an exploitation attempt against Node.js 24.22.0; the exploit fails to produce a shell |
| October 27 | CISA adds CVE-2026-111497 to KEV (due November 10); Previdian logs one attempt; Broadcom says VMware SDDC Manager is affected |
Sources: Tanium, Mallory, Brandefense, GitHub releases.
The other fixes in the same Node.js update
The October 21 Node.js release fixes nine other CVEs, so updating is worth it even if you never touch Brotli. Three more are rated High in the advisory:
| CVE | Severity | What it does | Lines affected |
|---|---|---|---|
| CVE-2026-105482 | High | dns.resolve*() silently truncates hostnames containing a NUL byte, so allowlist checks can be bypassed |
26, 24, 22 |
| CVE-2026-105483 | High | TLS hostname check accepts the wrong certificate when an IP is written in fullwidth digits | 26, 24 |
| CVE-2026-106069 | High | TLS check validates against the wrong IP for leading-zero IPv4 literals like 0127.0.0.1 |
26, 24, 22 |
| CVE-2026-105481 | Medium | Keep-alive sockets can accept a response sent before the request | 26, 24, 22 |
| CVE-2026-106074 | Medium | crypto.randomUUID() and randomInt() repeat values across processes built from snapshots/SEAs |
26, 24, 22 |
The release also updates c-ares, OpenSSL (24.x, 22.x), SQLite (22.x), Undici and the bundled CA list after the eMudhra intermediate CA compromise.
What we don’t know yet
- Whether real attacks have started. None reported so far; that can change within hours once a reliable exploit goes public, as it did with PHP2Shell.
- When Ubuntu and Red Hat ship fixes. Both trackers showed no fixed brotli or nodejs package at last check.
- How many other products bundle Brotli. Bug trackers cited by Mallory name .NET, DuckDB, ClickHouse, libjxl, MuPDF, archive tools and UEFI tooling, and most had no fixed release as of October 24.
We’ll update this page as vendors ship fixes or exploitation status changes.
FAQ
What is the Node.js vulnerability in October 2026?
It’s CVE-2026-111497, called Node2Shell or HTTP2Shell: an out-of-bounds write in the Brotli decoder bundled with Node.js. Crafted Brotli-compressed data can crash a Node.js app, leak memory or potentially run code. Node.js fixed it on October 21, 2026 in versions 22.23.4, 24.22.1 and 26.12.1.
Is HTTP2Shell the same as Node2Shell?
Yes. Both names refer to the same CVE, CVE-2026-111497. “Node2Shell” came first because Node.js shipped the first fix; “HTTP2Shell” spread after Aikido showed Python HTTP clients and other software using Brotli were affected too. It is not a flaw in the HTTP/2 protocol.
Which Node.js version fixes HTTP2Shell?
Node.js 22.23.4, 24.22.1 and 26.12.1, or any later release on those lines. Node.js 20 and older, 23 and 25 are end of life and will not get a fix, so move to a supported line.
Is my Python app affected by HTTP2Shell?
Yes, if any environment has Brotli 1.2.0 or earlier or brotlicffi 1.2.0.x installed, even if your code never imports it, because requests, httpx and aiohttp decode Brotli automatically when the package is present. Upgrade to Brotli 1.2.1 or brotlicffi 1.2.1.0 and rebuild your images.
Is HTTP2Shell being exploited in the wild?
Attempts, yes. CISA added CVE-2026-111497 to its Known Exploited Vulnerabilities catalog on October 27, 2026, and Previdian and ELLIO logged exploitation attempts on October 26 and 27. No successful compromise had been confirmed as of October 28, but failed attempts can crash unpatched services, so patch now.
What if I can’t update Node.js right away?
Reject requests with Content-Encoding: br at your proxy or WAF, set inflate: false on Express 5 body parsers, and limit which servers your app fetches from. These only reduce exposure; the update is the only real fix, and WAF rules don’t cover Brotli responses your own code fetches.
Sources
- Node.js: October 21, 2026 security releases and release schedule
- Google: Brotli v1.2.1 release
- Bun: advisory GHSA-663w-cv8g-jj2p
- Envoy: advisory GHSA-3wvj-j6qm-62mr; Istio: ISTIO-SECURITY-2026-007
- Debian security tracker, Ubuntu CVE page, Red Hat CVE page
- CISA: Known Exploited Vulnerabilities catalog
- SecurityWeek: CISA warns of Node2Shell exploitation as honeypots log attack attempts (October 28, 2026)
- The Hacker News: Researchers demonstrate Node2Shell RCE exploit
- Aikido: Node2Shell evolves to HTTP2Shell
- Tanium: HTTP2Shell: find and fix vulnerable Brotli copies
- Brandefense: HTTP2Shell fixed versions by stack
- Mallory: Node2Shell / HTTP2Shell: am I affected?


