CVE-2026-111497 is an out-of-bounds write in the Brotli decoder bundled with Node.js, which the Node.js project rates High and says "permits remote code execution." It affects the 22.x, 24.x and 26.x lines, and end-of-life lines such as 20.x get no fix. Upgrade to 22.23.4, 24.22.1 or 26.12.1, then rebuild every image and app that ships Node.
The fix shipped on 21 October 2026 as part of a security release that closed ten CVEs. As of 22 October, neither Node.js nor Vercel reports exploitation in the wild, and Node.js has published no CVSS score or technical write-up. That leaves a short window to find every copy of the runtime you own. The hard part is not the upgrade command. It is that Node hides in base images, serverless runtimes, desktop apps and single binaries that nobody lists as "a Node server."
What happened
| Date (2026) | Event | Source |
|---|---|---|
| 21 Oct | Node.js publishes security releases v22.23.4, v24.22.1 and v26.12.1, fixing ten CVEs, four rated High. CVE-2026-111497 is one of the four. | Node.js October 2026 security releases post |
| 21 Oct | Release notes for all three lines list the Brotli fix as a cherry-pick of upstream Brotli commit 0ed4268a4401abcb44720963. | Node.js release notes for each version |
| 21 Oct | Google's Brotli project tags v1.2.1, v1.1.1 and v1.0.10, each with a security note naming CVE-2026-111497. | google/brotli releases page |
| 21 Oct | Vercel publishes a bulletin, deploys WAF rules for all projects the same day and starts rolling patched runtimes. | Vercel knowledge base bulletin |
| 21 Oct | Heroku's changelog lists Node.js 26.12.1, 24.22.1 and 22.23.4 as available. | Heroku Dev Center changelog |
| 21 to 22 Oct | Docker Official Images publish node tags for the three fixed versions: slim variants first on 21 Oct (UTC), the full Debian and Alpine variants and the moving tags such as lts and latest early on 22 Oct (UTC). | Docker Hub tag listing for library/node |
| 22 Oct | The CVE record is not yet in NVD: a query of the NVD API returned no results. | NVD API |
The facts from the Node.js advisory
Node's post is short. Here is everything it says about this CVE, plus what the release notes add.
| Item | What Node.js states |
|---|---|
| CVE | CVE-2026-111497 |
| Title | "Node.js Brotli decoder out-of-bounds write permits remote code execution" |
| Severity | High (no CVSS vector published) |
| Affected lines | 26.x, 24.x, 22.x |
| End-of-life lines | "always affected when a security release occurs", per the post's standard note |
| Fixed versions | v22.23.4, v24.22.1, v26.12.1 |
| Fix | deps: brotli: cherry-pick 0ed4268a4401abcb44720963, in all three release notes |
| Credit | Reported by mcollina, fixed by aduh95 |
| Exploitation | Not mentioned |
| Workaround | None listed |
The same release also updated the bundled root certificates to NSS 3.131.1 and carried a CA certificate change that Node's post labels "eMudhra Intermediate CA Compromise." If you were already planning a Node upgrade for that reason, our post on trust store updates in Python, Node, Go and Electron after eMudhra covers the certificate side. One upgrade handles both.
Where sources differ
- Impact detail. Node.js says the flaw permits remote code execution and stops there. Vercel's bulletin goes further, saying researchers "demonstrated process-memory disclosure and command execution" on unpatched versions. That claim is Vercel's, not Node's.
- Scoring. Node.js gave a High rating with no CVSS score. Secondary coverage, including Cyber Kendra, notes the absence of scores for all ten issues. Treat any number you see quoted elsewhere with care until the CVE record is published.
- Exploitation. Neither Node.js nor Vercel reports attacks in the wild. A Japanese roundup by Jinrai, updated 17:00 JST on 22 October, says it found no attack code and no reports of exploitation. Absence of reports is not proof of absence.
Technical details
Every value below comes from the source named next to it. Node.js has not published the vulnerable code path or a proof of concept, and neither do we.
Identifiers and scores
| Field | Value | Source |
|---|---|---|
| CVE ID | CVE-2026-111497 | Node.js security release post |
| Node.js severity | High | Node.js security release post |
| CVSS score or vector | Not published | Node.js post; NVD API returned no record on 22 Oct (09:00 UTC) |
| Weakness as described | Out-of-bounds write in the Brotli decoder | Node.js post title |
| Stated impact | Remote code execution | Node.js post title |
| Additional impact claimed | Process memory disclosure and command execution demonstrated by researchers | Vercel bulletin only |
| Upstream library fix | Brotli v1.2.1, v1.1.1 and v1.0.10, each with a note naming the CVE | google/brotli releases page |
Affected and fixed versions per line
| Line | Status per Node.js release schedule | Affected | Fixed | GitHub release published (UTC) |
|---|---|---|---|---|
| 22.x "Jod" | Maintenance LTS | below 22.23.4 | v22.23.4 | 2026-10-21 10:38:20 |
| 24.x "Krypton" | LTS (Node marks it "Latest LTS") | below 24.22.1 | v24.22.1 | 2026-10-21 10:38:25 |
| 26.x | Current | below 26.12.1 | v26.12.1 | 2026-10-21 10:38:29 |
| 20.x and older | End of life (20.x since 30 April 2026) | All | None | n/a |
Release times are the published_at values from GitHub's API for the nodejs/node release tags.
The fix, by commit
Node.js applied the same upstream Brotli change to every line. The release notes list it as deps: brotli: cherry-pick 0ed4268a4401abcb44720963 (author shown as Evgenii Kliuchnikov), from the private pull request nodejs-private/node-private#1002, alongside a second commit titled src: expose `BROTLI_DECODER_ERROR_FORMAT_BLOCK_SWITCH` .
| Line | Brotli cherry-pick commit | Companion src: commit |
|---|---|---|
| v22.23.4 | 67d294739f | a18ec92752 |
| v24.22.1 | 49dff6f57a | b5f41529df |
| v26.12.1 | a6040b50d9 | 0392385841 |
The pull request is in Node's private security repository, so there is no public PR page to link.
Affected component and APIs
The advisory names the component, the Brotli decoder, and does not name individual functions. Node's zlib documentation lists these Brotli decompression entry points, all of which use that decoder:
| API | Kind |
|---|---|
zlib.brotliDecompress(buffer[, options], callback) | Async |
zlib.brotliDecompressSync(buffer[, options]) | Sync |
zlib.createBrotliDecompress([options]) | Stream |
zlib.BrotliDecompress | Class |
Code that calls none of these directly can still reach the decoder through libraries, or through fetch(), which NVD's record for CVE-2024-22025 says always decodes Brotli responses.
Verified downloads
If you install from nodejs.org tarballs, check them against the signed SHASUMS256.txt for each release. Selected values:
| File | SHA-256 |
|---|---|
node-v22.23.4-linux-x64.tar.xz | 1805bcd35e6815559bd2eb97db438d3fdb0eb3a5e6a977b7c1badca76337e9ce |
node-v22.23.4-linux-arm64.tar.xz | 6287aa46b6c375d816e63ae66d024fbbfd70404825aabdfdf898a970871d2f4b |
node-v24.22.1-linux-x64.tar.xz | 6c172a9ab6718f7b801fb5a7bd486af2ee5e32758086a04b84fcce2aa77095e6 |
node-v24.22.1-linux-arm64.tar.xz | dbabf7a1cbf947e6059ffad2c27b80041db97dea1e553b62afdee7f13fca336e |
node-v24.22.1-darwin-arm64.tar.gz | 89c682593d76cd44233fa53b1563264e7de9cbb189cad169135c5b4fadfbc0a7 |
node-v24.22.1-win-x64.zip | d2046d28c2c3dcd211ac5145c0bf30e2047ef9dfb306693c8c6e2eccd8b95fa5 |
node-v26.12.1-linux-x64.tar.xz | 6170b2d474e1c626f43cff3adc118df9fe3b573258a4fc3d850c8dbc6b079bbd |
node-v26.12.1-linux-arm64.tar.xz | 42aa04922591ee5d4dbc7740d452621acf28508239daa512f5ee8c47ee224fdb |
curl -fsSLO https://nodejs.org/dist/v24.22.1/SHASUMS256.txt
sha256sum -c SHASUMS256.txt --ignore-missing
Docker Official Image tags that carry the fix
From the Docker Hub tag listing for library/node (times UTC):
| Line | Fixed tags (examples) | First pushed |
|---|---|---|
| 22.x | 22.23.4-slim, 22.23.4-bookworm-slim, 22.23.4-trixie-slim | 2026-10-21 17:38 |
| 22.x | 22.23.4-alpine3.23 | 2026-10-21 23:38 |
| 22.x | 22.23.4, 22.23.4-bookworm, 22.23.4-trixie, 22.23.4-alpine, 22.23.4-alpine3.24 | 2026-10-22 02:39 |
| 24.x | 24.22.1-slim, 24.22.1-bookworm-slim, 24.22.1-trixie-slim | 2026-10-21 17:39 |
| 24.x | 24.22.1-alpine3.23 | 2026-10-21 23:39 |
| 24.x | 24.22.1, 24.22.1-bookworm, 24.22.1-trixie, 24.22.1-alpine, 24.22.1-alpine3.24 | 2026-10-22 02:39 to 02:40 |
| 26.x | 26.12.1, 26.12.1-bookworm, 26.12.1-trixie, 26.12.1-alpine, 26.12.1-alpine3.24 | 2026-10-22 02:40 |
The moving tags lts, lts-alpine, krypton, jod, current and latest were updated at about 02:41 UTC on 22 October. Images built from 24.22.0 or 22.23.3 tags, including ones pushed on 21 October before the fix, are still affected.
Indicators of compromise
Neither Node.js nor Vercel has published indicators of compromise, such as IP addresses, domains, hashes or request signatures. Vercel says requests blocked by its WAF rules appear in each project's Firewall dashboard, which is the only detection signal either source offers. A crash in a process that decodes Brotli from untrusted input is worth investigating, but it is not a published indicator.
How it works, in plain language
Brotli is a compression format, widely used for HTTP responses with Content-Encoding: br. Node.js bundles a copy of Google's Brotli library and exposes it through the zlib module. Decoding Brotli means reading compressed bytes and writing the expanded output into memory buffers.
An out-of-bounds write means that, for some malformed input, the decoder writes past the end of a buffer it owns. In native code that can corrupt memory the process relies on. Depending on what gets overwritten, the result can be a crash, leaked memory, or in the worst case code running with the permissions of the Node process. Node.js classes this one as permitting code execution. It has not published the triggering input, and neither will we.
The important practical question is reachability. Vercel's bulletin makes a point worth repeating: Node.js does not decode Brotli on its own. Your process is exposed when your code, or a library you use, decompresses Brotli data an attacker can influence. Vercel names two routes:
- Inbound request bodies. Some servers and body parsing middleware decompress a request body when the client sends
Content-Encoding: br. - Outbound responses. When your app fetches from a server and decodes a Brotli response, the remote server controls the input. Node's built-in
fetch()decodes Brotli automatically; NVD's description of an older Node issue, CVE-2024-22025, says plainly thatfetch()"always decodes Brotli." Any service that fetches URLs supplied by users (link previews, webhooks, image proxies, scrapers) deserves first attention.
Vercel adds that its WAF can only inspect traffic passing through Vercel, so it does nothing for responses your code fetches from elsewhere. In Vercel's words, only the runtime patch covers that path.
The upstream library matters too
The flaw sits in Brotli itself, and Google released fixed Brotli versions on the same day. Two consequences follow.
- Distribution builds of Node. Some Linux distributions build their
nodejspackage against the system Brotli library rather than the copy Node bundles. On those systems the fix may arrive through the distro'sbrotlipackage as well as, or instead of, a newnodejspackage. Follow your distro's advisory rather than assuming. - Other software. Anything else that embeds the Brotli decoder (other language runtimes, proxies, browsers, native modules) may need its own update. This post covers Node; check your other stacks against the Brotli releases.
Who is affected
| You run | Affected? | What fixes it |
|---|---|---|
| Node 22.x below 22.23.4 | Yes | 22.23.4 or later |
| Node 24.x below 24.22.1 | Yes | 24.22.1 or later |
| Node 26.x below 26.12.1 | Yes | 26.12.1 or later |
| Node 20.x or older | Yes, and no fix is coming | Move to 22.x or 24.x. Node 20 reached end of life on 30 April 2026 per the Node.js release schedule |
Docker images built FROM node:... before the fixed tags | Yes, until rebuilt | Rebuild on a fixed tag and redeploy |
| Vercel projects on 22.x or 24.x | Vercel manages the patch version | Nothing to change in settings, per Vercel |
| Vercel projects on 20.x | Yes | Switch to 22.x or 24.x and redeploy, per Vercel |
| Electron apps | Depends on the Electron release | An Electron release that carries the fix, then an app update to users |
| Single executable apps and Node bundled into CLIs | Yes, if built with an affected Node | Rebuild with a fixed Node and redistribute |
The release schedule on the Node.js GitHub lists 22.x in Maintenance LTS and 26.x as Current, due to enter LTS on 28 October 2026. Node's post marks 24.22.1 as the latest LTS.
What to do now
Work from the outside in: find every copy, upgrade the ones exposed to untrusted Brotli first, then rebuild and redeploy everything else.
1. Check servers and developer machines
node -v
node -p "process.versions.node"
which -a node # more than one result means more than one runtime
Node applied the fix as a cherry-pick, so do not use process.versions.brotli as your test. Check the Node version.
Upgrade according to how Node was installed:
# nvm
nvm install 24.22.1 && nvm alias default 24.22.1
# fnm
fnm install 24.22.1 && fnm default 24.22.1
# Volta
volta install node@24.22.1
# Homebrew (macOS)
brew update && brew upgrade node
# Debian or Ubuntu packages
apt-cache policy nodejs
dpkg -l | grep -i -E 'nodejs|brotli'
# RHEL, Fedora and derivatives
rpm -q nodejs brotli
For distro packages, wait for and apply your vendor's update; package names and version strings differ from upstream. After upgrading, restart every Node process. A running process keeps the old runtime in memory until it exits.
systemctl restart my-node-service
pm2 reload all
For a fleet, run the same check everywhere and collect the output, for example with Ansible:
ansible all -m command -a "node -v"
2. Rebuild Docker images
The official node tags for 22.23.4, 24.22.1 and 26.12.1 are on Docker Hub. Moving tags such as node:24, node:lts and node:24-alpine now point at fixed builds. That only helps if you rebuild.
# Find base images in your repos
grep -rn --include='Dockerfile*' -E '^FROM\s+node' .
# Confirm what a tag contains today
docker run --rm node:24-bookworm-slim node -v
# Check what an image you already built contains
docker run --rm --entrypoint node myapp:current -v
# Rebuild without cached layers, pulling the newest base
docker build --pull --no-cache -t myapp:patched .
Pin the exact fixed version so a stale cache cannot hand you the old one:
FROM node:24.22.1-bookworm-slim
If you pin by digest, update the digest; an old digest will never change. Then check running containers and Kubernetes pods, since an image in the registry and the image in production are often different:
docker ps --format '{{.Names}}\t{{.Image}}'
docker exec my-container node -v
kubectl get pods -A -o jsonpath='{range .items[*]}{.metadata.namespace}{"/"}{.metadata.name}{"\t"}{range .spec.containers[*]}{.image}{" "}{end}{"\n"}{end}' | grep -i node
kubectl exec -n my-namespace my-pod -- node -v
Remember images that do not say "node" in the name: a Python or Go image with Node installed for a build step, a frontend image that runs a Node server for server-side rendering, or a CI image.
3. Serverless and managed platforms
What platforms said, as of 22 October:
| Platform | What it says | Source |
|---|---|---|
| Vercel | WAF rules deployed on 21 Oct for all projects, no configuration needed; patched runtimes rolling out with no completion date given; projects on 22.x and 24.x need no version change; 20.x projects must move to 22.x or 24.x and redeploy; self-hosted Node, CI and local machines should upgrade "regardless of WAF protections"; self-hosted Next.js should upgrade Node | Vercel bulletin |
| AWS Lambda | No issue-specific notice found. Lambda's documentation says managed runtimes update automatically by default in Auto mode, with a two-phase rollout; container image functions must be rebuilt from the updated base image | AWS Lambda docs |
| Heroku | Fixed versions available for builds on 21 Oct | Heroku changelog |
| Netlify, Google Cloud Run, Azure App Service, Render | No issue-specific notices found by Jinrai's roundup; it summarises each platform's documented patching behaviour, including that Render defaults new services to a pre-fix 24.x version unless you set one | Jinrai roundup (we did not verify each platform page) |
For Lambda, find your Node functions and check their update mode:
aws lambda list-functions \
--query "Functions[?starts_with(Runtime, 'nodejs')].[FunctionName,Runtime]" \
--output table
aws lambda get-runtime-management-config --function-name my-function
Functions in Function update mode only pick up a new runtime version when you deploy them, and Manual mode never does. Container image functions need a rebuild on a fixed base image. To see the Node version a function actually runs, log process.version from inside the handler. If you still run nodejs20.x, move to nodejs22.x or nodejs24.x; a platform cannot patch a runtime that upstream no longer fixes.
For Vercel, set the Node version in project settings or in package.json:
{
"engines": { "node": "24.x" }
}
For platforms that use the version you specify (Render, Netlify builds, Heroku), set an exact fixed version or a range that resolves to one, then redeploy.
4. CI pipelines
CI runners run Node too, and often fetch from the internet. With GitHub Actions, actions/setup-node can serve a cached older patch release; ask for the newest one:
- uses: actions/setup-node@v4
with:
node-version: 24
check-latest: true
Check .nvmrc, .node-version and .tool-versions files in your repos, and update any that pin an affected patch release.
5. Electron apps
Electron ships its own Node inside every app. Updating Node on your machine does nothing for an Electron app you build or install.
npm ls electron # which Electron your app depends on
npx electron --version # the installed Electron version
Electron's release index lists the Node version each release bundles. As of 22 October, the newest stable releases (45.0.0 and 44.9.3, both dated 21 October) list Node 24.22.0, and the 44.9.3 release notes do not mention Brotli or this CVE. Electron sometimes backports fixes without changing the reported Node version, so the number alone does not settle it either way. Watch Electron's releases and security advisories for an entry naming CVE-2026-111497, then:
- Bump Electron in
package.jsonto the release that carries the fix. - Rebuild and re-sign your app.
- Ship it through your auto-update channel, and track how many users have actually updated.
Electron apps also embed Chromium, which carries its own copy of Brotli for web content. We found no Chromium advisory referencing this CVE as of 22 October; do not assume either way.
6. Single binaries and embedded Node
Single executable applications, packaged CLIs and appliances that bundle a Node binary keep the version they were built with. Rebuild them with a fixed Node and redistribute. The same release fixed a separate issue (CVE-2026-106074) about random number caches saved into startup snapshots and single executable apps, which is another reason to rebuild those now.
7. If you cannot upgrade today
Node.js lists no workaround. As a stopgap, not a fix:
- Find the code paths that decode Brotli from untrusted sources and prioritise those services for patching.
- At your reverse proxy, consider rejecting inbound request bodies with
Content-Encoding: brif your app does not need them. This does nothing for responses your app fetches. - For services that fetch user-supplied URLs, restrict where they can connect while you patch.
- If you are on Vercel, its WAF rules cover traffic through Vercel only, and Vercel says the WAF "reduces exposure but does not replace patching."
What would have helped
Nothing here would have stopped a memory safety bug in a compression library. What decides the impact is how fast you can find and replace the runtime. These practices make that fast.
- Treat the runtime as a dependency. Most teams track
node_modulescarefully and thenodebinary not at all. Record the runtime version in your SBOMs and inventory, for images, hosts and desktop apps. Check that your SBOM tool records the Node runtime itself and not only npm packages. - Know which services decode untrusted input. Keep a short list of services that fetch arbitrary URLs or accept compressed uploads. When a decoder bug lands, those go first.
- Rebuild base images on a schedule and on demand. A pipeline that rebuilds from
node:24-slimnightly and redeploys on green tests turns a runtime CVE into a routine change. Automated base image update tools that open pull requests when a new tag appears shorten the gap further. - Pin exact versions, update them automatically. Pinning
node:24.22.1-bookworm-slimmakes builds reproducible; an update bot keeps the pin fresh. Floating tags without rebuilds give you the worst of both. - Stay on supported lines. Node 20 users have no fix to install. A policy that moves services off a line before its end of life date avoids being stuck in exactly this position.
- Know your platform's patch model. On managed runtimes, the platform patches for you only in some modes. Write down, per platform, whether patches arrive automatically, on deploy or never.
- Plan for desktop and embedded copies. Electron apps and single binaries need a release and an update on every user's machine. Measure update uptake, not just release dates.
We wrote the same pattern up for PHP in finding and patching every PHP runtime after PHP2Shell; the commands differ, the inventory problem is the same.
Where Safeguard fits
Safeguard does not patch your Node runtime, change platform settings for you, or ship Electron updates to your users. Those steps are yours. Here is where it helps.
- Inventory images and repos.
safeguard scan --imagescans a container image,safeguard scan --dir .scans a repository andsafeguard scan --sbomscans an SBOM file, with JSON results under ./output. Scan the images you build onnodebases to see their components. Whether this Node advisory is matched depends on the vulnerability data and on the runtime being identified in the image, so still confirm withnode -vas shown above. - Find every project with a component. The platform shows which projects contain a given component and version. That is the query you need after any runtime or library advisory; our post on SBOMs in incident response walks through it.
- Prioritise. Vulnerability matching against vulnerability databases, with reachability analysis, helps separate exposed services from the long tail.
- Gate rebuilds. Policies and gates evaluated in the platform, and
safeguard execin CI, can block a build that still pulls a known vulnerable component. - Do the change work with approval. The Safeguard CLI's assistant can edit files and run commands with your approval. Ask it to bump
FROMlines to the fixed tags, update.nvmrcandengines.node, rebuild and run tests. Use/permissionsset to Ask or Strict so each command waits for you. Autonomous remediation can open fix pull requests, and it is off by default.
Zero-Day Discovery and Gold
- Zero-Day Discovery looks for previously unknown flaws before a CVE exists, in an agentic mode and a deterministic scanner mode, and issues findings as SGZ advisories before they reach public CVE databases. It covers seven package ecosystems. The Node.js runtime and the C Brotli library inside it are outside that scope, and we make no claim that it found this flaw.
- Gold Open Source at gold.safeguard.sh is free with no login: searchable CVE intelligence with CVSS, EPSS, KEV status, affected and fixed versions and a recommended safe version, a free read API, and a CI gate GitHub Action. As of 22 October the CVE record for this flaw was not yet in NVD, so check the Node.js advisory directly for now.
- Gold Registry at registry.safeguard.sh is the paid tier: hardened drop-in components and container images held to zero exploitable critical or high CVEs, SLSA L3 or higher, Sigstore signed, with evidence pages; an artifact loses its badge if it regresses.
The habit they support is the one this incident rewards: pull patched, signed base images and components from a curated source, and rebuild and redeploy quickly when an advisory lands.
Common mistakes
- Upgrading Node on the host and forgetting the containers. Containers carry their own Node. Rebuild them.
- Pulling
node:24without--pullor with a warm cache. Your build may reuse the old base layer. Pin the fixed tag or force a fresh pull. - Rebuilding but not redeploying. A new image in the registry protects nothing until pods and tasks run it. Check running versions.
- Patching without restarting. Long-running processes keep the old binary in memory.
- Assuming serverless is always patched. Lambda functions in Function update or Manual mode, container image functions, and anything on an end-of-life runtime need action from you.
- Trusting the WAF. Edge rules only see traffic that crosses the edge. Fetched responses never do.
- Forgetting Electron and single binaries. Your laptop's Node version has nothing to do with the Node inside an app you ship.
- Using
process.versions.brotlias the check. A cherry-picked fix may not change that string. Checkprocess.versions.node. - Staying on Node 20 because it "still works." It will not receive this fix.
FAQ
Is CVE-2026-111497 being exploited?
As of 22 October 2026, Node.js does not mention exploitation and Vercel describes researcher demonstrations only, with no claim of attacks in the wild. Jinrai's roundup found no public attack code. Treat that as a short window rather than reassurance.
Is this remote code execution or denial of service?
Node.js calls it an out-of-bounds write that "permits remote code execution." It has not published a CVSS score or details. Vercel says researchers demonstrated memory disclosure and command execution; that is Vercel's statement, not Node's.
Is my app exposed if it never calls zlib directly?
Possibly. Libraries and built-in fetch() can decode Brotli for you. Vercel's guidance is that exposure comes from code or libraries that decompress attacker-controlled Brotli, in request bodies or fetched responses. Patch regardless; reachability only tells you what to patch first.
I am on Vercel. Do I need to do anything?
For projects on 22.x or 24.x, Vercel says no version change is needed because it manages patch versions, and its WAF rules are already on. Projects on 20.x must move to 22.x or 24.x and redeploy. Any Node you run outside Vercel's managed runtimes, including self-hosted Next.js, CI and external backends, still needs upgrading.
Does node:lts already include the fix?
Docker Hub shows the lts tag updated early on 22 October (UTC), after the fixed 24.22.1 tags were published. Confirm with docker run --rm node:lts node -v, then rebuild your images; existing images built on the old lts keep the old runtime.
Is Node 20 affected?
Node's post says end-of-life versions are always affected when a security release occurs, and Node 20 reached end of life on 30 April 2026. No 20.x fix is coming. Move to 22.x or 24.x.
Are Electron apps affected?
Electron bundles Node, and the latest stable releases we checked on 22 October list Node 24.22.0. Electron had not published a note naming this CVE when we checked. Watch Electron's releases, then rebuild and ship an update.
Do I need to update the Brotli library separately?
If your Node comes from a distribution package built against the system Brotli library, the distro may fix it through its brotli package. Upstream Node builds bundle their own copy, fixed in the new releases. Other software that embeds Brotli needs its own update.
Fix it without waiting for upstream
In incidents like this one, most of the risk sits in two gaps. The first is the time between a fix being published and that fix actually running in your production builds. The second, and worse, is the time before any fix exists at all, while a maintainer works out a patch and a release schedule. Waiting through both gaps is a habit, not a requirement. Safeguard gives teams three ways to close them.
1. Autonomous remediation: pull requests, not tickets
When a fixed version exists, Safeguard's Griffin models open a tested, policy gated pull request that moves the affected dependency to the safe version. You can run it on one repository or in bulk across every project that carries the vulnerable version. Remediation covers eight categories, including dependencies, licenses, security posture and findings. Reachability analysis ranks the vulnerable code paths your application actually calls first, so the first pull requests you merge are the ones that matter most. Autonomous remediation ships switched off, with every category set to Manual, so your team decides how much runs on its own and what still needs a human approval.
2. Gold Open Source: the safe version in seconds, free
gold.safeguard.sh is free and needs no login. Search any CVE or package to see affected and fixed versions, CVSS, EPSS, CISA KEV status and a recommended safe version, or use the "Am I affected?" checker. The same data is available through a free read API, README status badges and RSS threat feeds. The safeguard-sh/gold-scan-action GitHub Action can fail a build on a known exploited vulnerability, on any known vulnerability, or never, so a version you have just removed cannot quietly come back in next week's merge.
3. Gold Registry: start from components that are already fixed
registry.safeguard.sh provides hardened, drop in replacements for upstream packages and container images. Every Gold artifact is held continuously to zero exploitable critical or high CVEs, zero malware and a completed license check, with SLSA L3 or higher provenance, a Sigstore signature and a public evidence page you can hand to an auditor. An artifact loses its Gold badge if it regresses. Teams can point their own package directory at the registry so hardened equivalents resolve without changing how developers install anything.
When upstream has no fix yet, or will not ship one, Safeguard first works to get the fix accepted upstream. If the issue is severe or upstream will not move, Safeguard builds a fork, fixes the vulnerability there and publishes a hardened Gold build, so you are not stuck on a maintainer's release schedule. You can also request a hardened, compatibility tested build of a specific package. This fork and patch flow is in early access today, so ask which packages it covers before you plan around it.
| Your situation | What to use |
|---|---|
| A fixed version exists | Autonomous remediation opens the upgrade pull request; Gold Open Source confirms the safe version |
| You need to know today whether you are affected | Gold Open Source lookup and "Am I affected?" checker, free and without login |
| You want vulnerable versions to stop shipping | The Gold scan GitHub Action in CI, plus Safeguard policies and gates |
| Upstream has no fix yet, or will not ship one | A custom Gold request; fork and patch (early access) |
| You want to start clean on new projects | Pull hardened components and images from Gold Registry |
One honest limit: when the vulnerable code lives in a vendor appliance, a hosted service or an operating system runtime you do not build yourself, the fix still has to come from that vendor or distribution. The steps above apply to the open source dependencies and container images you build and ship, which is where most teams carry the largest and least tracked share of their exposure.
See how Safeguard would have helped
These are real product sessions on other examples; none shows this Node.js incident.
The CLI demo shows the assistant fixing a lodash CVE: it reads the finding and advisory, asks before each command, edits package.json to lodash 4.17.21, runs npm install and npm test with approval, and pushes nothing. For CVE-2026-111497, the same flow applies to a service repo: ask it to change the FROM node line to 24.22.1, update .nvmrc and engines.node, rebuild the image and run tests, approving each step.
Click through it at your own pace, or open it full screen.
The local runner demo shows setting up the runner on your own machine, approving it with its device code, and scanning from the terminal. After a runtime advisory, that is how you would scan the Node based images you build locally, including private ones, and see what each contains before and after a rebuild.
Click through it at your own pace, or open it full screen.
The desktop app demo shows a CLI session in the conversation list, a request for work on the computer, a folder choice, and Approve or Deny on each command and file edit, ending with an upgrade done and tests passing. For this incident, you would pick an Electron app's folder, ask for the Electron bump once a fixed release is out, and approve the install, build and test commands one by one.
Click through it at your own pace, or open it full screen.
To try it on your own systems, download Safeguard and read the CLI documentation.
Quick check
Your Dockerfile says FROM node:24 and you rebuilt last week. Are you covered?
No. The fixed 24.22.1 images were published on 21 and 22 October. Rebuild with a fresh pull, ideally pinned to 24.22.1 or later, redeploy, and confirm with node -v inside the running container.
Your Vercel WAF is blocking the attack pattern. Can a service that fetches user-supplied URLs skip the upgrade?
No. The WAF only sees traffic through Vercel's network, and Vercel says only the runtime patch covers Brotli responses your code fetches. Upgrade Node.
Sources
- Node.js: Wednesday, October 21, 2026 Security Releases
- Node.js: v24.22.1 release notes
- Node.js: v22.23.4 release notes
- Node.js: v26.12.1 release notes
- Node.js: Security vulnerability posts
- Node.js Release schedule (GitHub)
- Node.js: zlib module documentation
- Node.js: v22.23.4 SHASUMS256.txt
- Node.js: v24.22.1 SHASUMS256.txt
- Node.js: v26.12.1 SHASUMS256.txt
- GitHub: nodejs/node release v22.23.4
- GitHub: nodejs/node release v24.22.1
- GitHub: nodejs/node release v26.12.1
- google/brotli releases
- Vercel: Node.js security advisory: Brotli decoder RCE (CVE-2026-111497)
- AWS Lambda: Understanding how Lambda manages runtime version updates
- Heroku Dev Center changelog
- Docker Hub: node tags (API listing)
- Electron releases index
- Electron v44.9.3 release notes
- NVD API query for CVE-2026-111497
- NVD: CVE-2024-22025
- Jinrai: Node.js vulnerabilities, fixed versions and vendor responses (October 2026)
- Cyber Kendra: Node.js patches Brotli RCE flaw, 9 other vulnerabilities
- Cybersecurity News: Node.js releases security updates
Last reviewed: 22 October 2026. This is a developing story; check the linked advisories for the latest status.