CVE-2026-111497: Brotli decoder out-of-bounds write in Node.js enables RCE (Node2Shell)
Exploited in the wild Critical 9.2 EPSS 82.6% Brotli
An unchecked return value in the Google Brotli decoder (versions 1.0.3 to 1.2.0) turns a malformed block switch into an out-of-bounds write, so attacker-supplied Brotli data reaching Node.js through request bodies with Content-Encoding: br (Express 5 / body-parser 2), Brotli responses decoded by fetch(), or node:zlib Brotli calls can crash the process, leak memory or run code. Public exploits give a shell on official Node.js 24.22.0 builds and CISA added it to the KEV catalog on 2026-10-27 (due 2026-11-10). Fixed in Node.js 22.23.4, 24.22.1 and 26.12.1 and in Brotli 1.0.10/1.1.1/1.2.1; distro Node.js builds that link the system libbrotli are fixed by the brotli package update.
Also known as “Node2Shell”.
- CVE-2026-111497CVE identifier
- 9.2CVSS 4.0 base score (critical)
- 2026-10-27added to CISA's exploited list (US federal deadline 2026-11-10)
- 82.6%EPSS: chance of exploitation in the next 30 days (higher than 100% of CVEs)
- 2026-10-22published
What do these terms mean? CVE · CVSS score · exploited (KEV) · EPSS · backported fix · all terms
What to do now
- Check whether you run Brotli and which version (commands below).
- Install the fixed version for your system: see “Patch it” below.
- Restart every Node.js process after updating, including processes that only loaded the system libbrotli (a library update does not affect running processes): systemd: sudo systemctl restart <app>.service; PM2: pm2 update, then pm2 save; containers: rebuild and recreate. Other services that decode Brotli with the system library (for example curl/git clients, nginx brotli modules, Python brotli) also need a restart; find them with: sudo lsof -n | grep -E 'libbrotli.*\(deleted\)'.
- If you cannot patch today, apply the temporary mitigation below and patch as soon as possible.
- Because this flaw is being exploited, also check the server for signs of compromise.
Affected and fixed versions
Affected:
- Node.js 22.x up to 22.23.3
- Node.js 24.x up to 24.22.0
- Node.js 26.x up to 26.12.0
- End-of-life Node.js 20.x, 23.x, 25.x and older (bundled Brotli, no fix)
- Google Brotli 1.0.3 to 1.0.9, 1.1.0 and 1.2.0 (system library used by Debian, Ubuntu, Alpine, FreeBSD and some RHEL Node.js builds)
Fixed in:
- Node.js 22.23.4
- Node.js 24.22.1
- Node.js 26.12.1
- Brotli 1.0.10
- Brotli 1.1.1
- Brotli 1.2.1
Node.js lines affected: 22.x || 24.x || 26.x; fixed in ^22.23.4 || ^24.22.1 || ^26.12.1.
Am I affected?
node -v # official/NodeSource/nvm/Docker builds bundle Brotli: need 22.23.4, 24.22.1, 26.12.1 or later
ldd "$(command -v node)" | grep -i brotli # output = node uses the system libbrotli, so the brotli package must be updated
# process.versions.brotli is not a reliable indicator: it still reports 1.2.0 on patched Node.js builds
dpkg -l libbrotli1 | grep ^ii # Debian/Ubuntu
rpm -q brotli libbrotli; dnf module list --enabled nodejs # RHEL
apk info -v brotli-libs nodejs nodejs-current # Alpine
pkg audit -F # FreeBSD
sudo lsof -n 2>/dev/null | grep -E 'libbrotli.*\(deleted\)' # processes still using the old library after an update
Patch it
Use the commands for your system. Distribution packages often keep an older version number with the fix backported, so compare with the fixed package versions in the table below, not only with the upstream version.
Debian
sudo apt update
sudo apt install --only-upgrade libbrotli1 nodejs
# Debian's nodejs links the system libbrotli; NodeSource builds bundle their own and need nodejs >= 22.23.4 / 24.22.1 / 26.12.1
node -vUbuntu
sudo apt update
sudo apt install --only-upgrade libbrotli1 nodejs
# Ubuntu nodejs on 22.04+ uses the system brotli (USN-8956-1); 20.04 nodejs uses a vendored copy and is still marked 'needed'
node -vRHEL, AlmaLinux, Rocky, Oracle
# System brotli (used by nodejs:22 on RHEL 8/9 and nodejs22/nodejs24 on RHEL 10)
sudo dnf upgrade --refresh brotli # RHEL 8
sudo dnf upgrade --refresh libbrotli # RHEL 9 / 10 (and brotli if installed)
# nodejs:24 module streams bundle brotli (RHEL 8/9)
sudo dnf upgrade --refresh 'nodejs*'
node -vFedora
sudo dnf upgrade --refresh libbrotli brotliSUSE / openSUSE
sudo zypper refresh
sudo zypper update libbrotlicommon1 libbrotlidec1 brotliAmazon Linux
sudo dnf upgrade --releasever=latest libbrotli brotliArch Linux
sudo pacman -SyuAlpine
apk update
apk upgrade brotli-libs # main-repo nodejs uses the system library
apk upgrade nodejs-current # 3.24 community, if installed (26.12.1-r0)
node -vFreeBSD
pkg update
pkg upgrade brotli node24 # node ports link the system brotli; or node22 / node26 / node
pkg audit -FDocker images
# Official node images ship the upstream binary with bundled Brotli: rebuild on a fixed tag
# FROM node:24.22.2-trixie-slim (also: node:22.23.4-alpine, node:26.13.0-slim)
docker pull node:24.22.2-trixie-slim
docker build --pull -t myapp:patched .
docker run --rm myapp:patched node -v # must be 22.23.4 / 24.22.1 / 26.12.1 or later
docker compose up -d --force-recreateBuilt from source
# nvm: install the newest patch release of your line and make it the default
nvm install 24 --reinstall-packages-from=current # or 22 / 26
nvm alias default 24
node -v # must be at least 22.23.4 / 24.22.1 / 26.12.1
# Official binaries (Linux x64); verify the checksum before installing
VER=v24.22.2 # current fixed releases: v22.23.4, v24.22.2, v26.13.0
curl -fsSLO https://nodejs.org/dist/$VER/node-$VER-linux-x64.tar.xz
curl -fsSLO https://nodejs.org/dist/$VER/SHASUMS256.txt
grep " node-$VER-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c -
sudo tar -xJf node-$VER-linux-x64.tar.xz -C /usr/local --strip-components=1
/usr/local/bin/node -vGeneral update steps for every system are on the Linux and Unix & BSD pages; after updating, see which services to restart.
Fix status in Linux distributions
| Release | Package | Status | Fixed version / advisory |
|---|---|---|---|
| Debian 12 | brotli | fixed | 1.0.9-2+deb12u1 |
| Debian 13 | brotli | fixed | 1.1.0-2+deb13u1 |
| Debian testing | brotli | not fixed yet | |
| Debian 12 | nodejs | not fixed yet | |
| Debian 13 | nodejs | not fixed yet | |
| Debian testing | nodejs | not fixed yet | |
| Debian 13 | python-brotlicffi | not fixed yet | |
| Debian testing | python-brotlicffi | fixed | 1.2.1.0+ds-1 |
| Ubuntu 22.04 | brotli | fixed | 1.0.9-2ubuntu0.1 |
| Ubuntu 24.04 | brotli | fixed | 1.1.0-2ubuntu0.1 |
| Ubuntu 18.04 (ESM) | brotli | fixed | 1.0.3-1ubuntu1.3+esm1 |
| Ubuntu 20.04 (ESM) | brotli | fixed | 1.0.7-6ubuntu0.1+esm1 |
| Ubuntu 26.04 | brotli | fixed | 1.2.0-3ubuntu0.1 |
| Ubuntu 26.10 | brotli | fixed | 1.2.0-4ubuntu0.1 |
| Ubuntu 18.04 (ESM) | nodejs | not affected | |
| Ubuntu 22.04 | nodejs | not affected | |
| Ubuntu 24.04 | nodejs | not affected | |
| Ubuntu 26.04 | nodejs | not affected | |
| Ubuntu 26.10 | nodejs | not affected | |
| Ubuntu 20.04 (ESM) | nodejs | not fixed yet | |
| Ubuntu 22.04 | dotnet6 | deferred | |
| Ubuntu 22.04 | dotnet7 | not planned | |
| Ubuntu 22.04 | dotnet8 | fixed | 8.0.133-8.0.33-0ubuntu1~22.04.1 |
| Ubuntu 24.04 | dotnet8 | fixed | 8.0.133-8.0.33-0ubuntu1~24.04.1 |
| Ubuntu 24.04 | dotnet10 | fixed | 10.0.114-10.0.14-0ubuntu1~24.04.1 |
| Ubuntu 26.04 | dotnet10 | fixed | 10.0.114-10.0.14-0ubuntu1~26.04.1 |
| Ubuntu 26.10 | dotnet10 | fixed | 10.0.114-10.0.14-0ubuntu1~26.10.1 |
| Ubuntu 26.10 | dotnet11 | fixed | 11.0.100-11.0.0~rc3-0ubuntu1~26.10.1 |
| Red Hat Enterprise Linux 9 | firefox-0:140.10.0-1.el9_7 | fixed | RHSA-2026:10757 |
| Red Hat Enterprise Linux 9 | thunderbird-0:140.10.0-1.el9_7 | fixed | RHSA-2026:15892 |
| Red Hat Enterprise Linux 9 | brotli-0:1.0.9-10.el9_8.1 | fixed | RHSA-2026:90495 |
| Red Hat Enterprise Linux 9 | nodejs:24-9080020261027142403.rhel9 | fixed | RHSA-2026:92378 |
| Red Hat Enterprise Linux 9 | dotnet8.0-0:8.0.133-1.el9_8 | fixed | RHSA-2026:92492 |
| Red Hat Enterprise Linux 9 | nodejs:26/nodejs | affected | |
| Red Hat Enterprise Linux 8 | firefox-0:140.10.0-1.el8_10 | fixed | RHSA-2026:10766 |
| Red Hat Enterprise Linux 8 | thunderbird-0:140.10.0-1.el8_10 | fixed | RHSA-2026:13537 |
| Red Hat Enterprise Linux 8 | brotli-0:1.0.6-5.el8_10 | fixed | RHSA-2026:90501 |
| Red Hat Enterprise Linux 8 | nodejs:24-8100020261027151919.6d880403 | fixed | RHSA-2026:92376 |
| Red Hat Enterprise Linux 8 | dotnet8.0-0:8.0.133-1.el8_10 | fixed | RHSA-2026:92420 |
| Red Hat Enterprise Linux 10 | firefox-0:140.10.0-1.el10_1 | fixed | RHSA-2026:10767 |
| Red Hat Enterprise Linux 10 | thunderbird-0:140.10.0-1.el10_2 | fixed | RHSA-2026:19131 |
| Red Hat Enterprise Linux 10 | brotli-0:1.1.0-8.el10_2.1 | fixed | RHSA-2026:90449 |
| Red Hat Enterprise Linux 10 | dotnet8.0-0:8.0.133-1.el10_2 | fixed | RHSA-2026:92428 |
| Debian 12 (bookworm) | brotli (libbrotli1) | fixed | 1.0.9-2+deb12u1 (DLA-4855-1) |
| Debian 13 (trixie) | brotli (libbrotli1) | fixed | 1.1.0-2+deb13u1 (DSA-6582-1) |
| Ubuntu 22.04 LTS (jammy) | libbrotli1 | fixed | 1.0.9-2ubuntu0.1 (USN-8956-1) |
| Ubuntu 24.04 LTS (noble) | libbrotli1 | fixed | 1.1.0-2ubuntu0.1 (USN-8956-1) |
| Ubuntu 26.04 LTS (resolute) | libbrotli1 | fixed | 1.2.0-3ubuntu0.1 (USN-8956-1) |
| Ubuntu 26.10 (stonking) | libbrotli1 | fixed | 1.2.0-4ubuntu0.1 (USN-8956-1) |
| RHEL 8 | brotli | fixed | 1.0.6-5.el8_10 (RHSA-2026:90501) |
| RHEL 9 | brotli / libbrotli | fixed | 1.0.9-10.el9_8.1 (RHSA-2026:90495) |
| RHEL 10 | brotli / libbrotli | fixed | 1.1.0-8.el10_2.1 (RHSA-2026:90449) |
| RHEL 8 (nodejs:24 module, bundled brotli) | nodejs | fixed | 1:24.22.1-1.module+el8.10.0+25218+d9e131cb (RHSA-2026:92376) |
| RHEL 9 (nodejs:24 module, bundled brotli) | nodejs | fixed | 1:24.22.1-3.module+el9.8.0+25216+afa2a4a4 (RHSA-2026:92378) |
| RHEL 9 (nodejs:26 module) | nodejs | fixed | no fix yet (Red Hat: Affected, 2026-11-03) |
| Alpine 3.23 / 3.24 / edge | brotli-libs | fixed | 1.2.1-r0 (secdb) |
| Alpine 3.22 | brotli-libs | fixed | 1.1.1-r0 (in repository; not yet listed in secdb) |
| Alpine 3.24 | nodejs-current | fixed | 26.12.1-r0 (secdb) |
| FreeBSD | brotli | fixed | 1.2.1,1 (VuXML f1e61d76-cdb6-11f1-b15e-589cfc104230) |
| FreeBSD (ports/pkg) | node22 / node24 / node26 / node | fixed | 22.23.4 / 24.22.1 / 26.12.1 / 24.22.1 (VuXML 33a752ba-4cbe-46d8-abda-587011d90575) |
From the Debian security tracker, Ubuntu CVE tracker and Red Hat Security Data API, refreshed every few hours.
If you cannot patch yet
- Until patched, reject inbound requests with Content-Encoding: br at the reverse proxy, load balancer or app middleware (Aikido, ELLIO). nginx example inside server {}: if ($http_content_encoding ~* br) { return 415; }
- That does not cover Brotli responses your app fetches (fetch()/undici, axios, got, webhooks, link previews, URL-fetching tools); only the update removes that path.
- Failed exploit attempts crash the worker; where core dumps are enabled the cores can contain other users' sessions and keys, so restrict access to /var/lib/systemd/coredump and keep cores short-lived (ELLIO).
- Node.js 20.x, 23.x and 25.x are end-of-life and get no fix: move to 22.x, 24.x or 26.x.
Look for signs of exploitation
- ELLIO saw a scanner with User-Agent 'Mozilla/5.0 (compatible; node2shell-check/1.0)' sending POST bodies with Content-Encoding: br in bursts before exploitation.
- In-the-wild exploit (26 Oct 2026, from 94.154.43.7) was a single Brotli-coded request body of about 23 MB targeting Node.js v24.22.0 x86-64 (ELLIO).
- Repeated Node.js worker crashes (segfaults) followed by supervisor restarts while receiving Brotli-encoded requests; patched builds reject the trigger with ERR__ERROR_FORMAT_BLOCK_SWITCH.
CISA required action: Apply mitigations in accordance with vendor instructions, ensuring compliance with CISA’s BOD 26-04 Prioritizing Security Updates Based on Risk (see URL in Notes) guidance and CISA’s “Forensics Triage Requirements” (see URL in Notes). Follow applicable BOD 26-04 guidance for cloud services or discontinue use of the product if mitigations are unavailable. Stakeholders are responsible for evaluating each asset's internet exposure and ensuring adherence to BOD 26-04 patching guidelines.
This vulnerability affects an open-source component, third-party library, protocol, or proprietary implementation that could be used by different products. For more information, please see: https://github.com/google/brotli/releases/tag/v1.2.1 ; ; BOD 26-04: https://www.cisa.gov/news-events/directives/bod-26-04-prioritizing-security-updates-based-risk ; Forensics Triage Requirements: https://www.cisa.gov/news-events/directives/bod-26-04-implementation-guidance-prioritizing-security-updates-based-risk ; https://nvd.nist.gov/vuln/detail/CVE-2026-111497
Related vulnerabilities
Sources
- Node.js security releases, October 21, 2026
- CVE record CVE-2026-111497
- NVD: CVE-2026-111497
- CISA KEV: CVE-2026-111497 (added 2026-10-27)
- Google Brotli 1.2.1 release
- GitHub advisory GHSA-9v8h-qqgm-4m35 (CVE-2026-111497)
- Debian security tracker: CVE-2026-111497
- Ubuntu CVE tracker: CVE-2026-111497
- USN-8956-1 Brotli vulnerability
- Red Hat CVE page: CVE-2026-111497
- Alpine secdb (v3.22/v3.23/v3.24 main + community)
- FreeBSD VuXML: brotli
- FreeBSD VuXML 33a752ba-4cbe-46d8-abda-587011d90575 (Node.js, October 2026)
- Docker official image: node (tags)
- ELLIO: Node2Shell, remote code execution on stock Node.js builds
- Aikido: Node2Shell (CVE-2026-111497)
- oss-security: Brotli CVE-2026-111497 thread
- Node.js release status (previous releases)
- https://github.com/andybalholm/brotli/releases/tag/v1.2.7
- CISA Known Exploited Vulnerabilities catalog
Page generated automatically from official sources on 2026-11-03 17:06 UTC and reviewed by an editor. Always confirm with your vendor's advisory.