- Why This Release Needs Attention Now
- Why Updating Application Dependencies Is Not Enough
- What the Vulnerabilities Affect
- High-Severity Vulnerabilities
- Medium- and Low-Severity Vulnerabilities
- Node.js by the Numbers: Nine in 10 Installations Are Unpatched or Unsupported
- Fixed Versions and Upgrade Guidance
- What Qualys Customers Can Do
- How Qualys Finds and Closes Node.js Exposure
- Reduce Exposure Before You Patch
- Patch with Confidence
- Connect Your AI Assistant to Qualys in Three Steps
- What This Means for Security Teams
- Reference
- Related
Executive Summary
On October 21, 2026, Node.js released fixes for 10 vulnerabilities across its three supported release lines: 22.x, 24.x, and 26.x. Four are rated High. The most severe, CVE-2026-111497, is an out-of-bounds write in the bundled Brotli decoder that Node.js says permits remote code execution.
These flaws live in the Node.js runtime itself, not in application packages, so dependency checks will not surface them. Qualys customers can find affected runtimes across hosts, containers, and cloud workloads, including copies outside standard install paths, prioritize those exposed to the internet, and confirm each fix after patching.
Why This Release Needs Attention Now
The four high-severity vulnerabilities impact two areas that nearly every Node.js service interacts with: compressed data and outbound connections.
CVE-2026-111497 is a vulnerability found in the code responsible for decompressing Brotli data. Any service that unpacks Brotli content it did not create is affected by this issue. Additionally, there are three other high-severity vulnerabilities: CVE-2026-105482, CVE-2026-105483, and CVE-2026-106069. These vulnerabilities compromise Node.js’s ability to verify hostnames and certificates, which is especially important for services that connect to hosts on behalf of users.
Three additional points apply to every team:
- No workarounds are available. Node.js has not published any for these ten CVEs. Upgrading the runtime is the solution.
- No CVSS scores are available. Currently, the CVE records are reserved and do not have CVSS scores.
- No updates are available for unsupported lines. Only versions 22.x, 24.x, and 26.x have received fixes. All other versions, including 25.x and 20.x, remain vulnerable and must be upgraded to a supported release.
Why Updating Application Dependencies Is Not Enough
Updating application dependencies alone will not resolve these issues. The vulnerable code is included in the Node.js runtime, which encompasses runtimes embedded in container images and single-executable applications (SEAs).
Node.js also often runs from nonstandard locations:
- Version managers such as nvm
- Application folders
- Bundled runtimes
- SEAs
- Container images, running containers, and serverless functions such as AWS Lambda Node.js runtimes
What the Vulnerabilities Affect
The vulnerabilities span zlib, DNS, TLS, HTTP, crypto, and the Permission Model. Three of the four high-severity issues weaken hostname or certificate validation, which matters for any service that makes outbound TLS or DNS calls on behalf of users.
| CVE | Severity | Module | Description | Affected lines |
| CVE-2026-111497 | High | zlib (Brotli) | Brotli decoder out-of-bounds write; potential remote code execution | 22.x, 24.x, 26.x |
| CVE-2026-105482 | High | DNS | DNS resolution truncation involving embedded NUL characters | 22.x, 24.x, 26.x |
| CVE-2026-105483 | High | TLS | TLS hostname validation bypass using fullwidth IP digits | 24.x, 26.x |
| CVE-2026-106069 | High | TLS | TLS hostname validation bypass with noncanonical IP addresses | 22.x, 24.x, 26.x |
| CVE-2026-105481 | Medium | HTTP | HTTP keep-alive response handling issue | 22.x, 24.x, 26.x |
| CVE-2026-106072 | Medium | TLS | Improper certificate validation for unusual IPv4 representations | 22.x, 24.x, 26.x |
| CVE-2026-106074 | Medium | crypto | Repeated random values across startup snapshots | 22.x, 24.x, 26.x |
| CVE-2026-106070 | Low | zlib (ZipFile) | ZIP validation exposes attacker-controlled bytes | 26.x |
| CVE-2026-106071 | Low | Permission Model | Permission Model filesystem over-grant | 26.x |
| CVE-2026-106073 | Low | fs / Permission Model | Permission Model bypass using fs.realpathSync | 22.x, 24.x, 26.x |
High-Severity Vulnerabilities
CVE-2026-111497 (Brotli). A crafted Brotli stream can cause the decoder to write outside its allocated memory bounds. Node.js classifies this outcome as a remote code execution vulnerability. Services that decompress Brotli data from untrusted sources, such as HTTP clients and proxies that accept the Content-Encoding: br, or services that handle uploaded compressed files, are particularly at risk.
CVE-2026-105482 (DNS). The functions dns.resolve*, dns.reverse, and the Resolver class send names to c-ares as C strings. Therefore, if an embedded NUL character is present, it will truncate the name. An application has the ability to validate one hostname against an allowlist while querying a different name. The dns.lookup function remains unaffected by this issue.
CVE-2026-106069 (TLS). The `tls.checkServerIdentity` function can verify a non-canonical IP address, such as one in octal or shortened form, against a certificate for one address while the connection is directed to a different one. This vulnerability allows an attacker to present a certificate that is valid for an endpoint that does not actually belong to them.
CVE-2026-105483 (TLS). Hostnames using Unicode fullwidth digits normalize to an IP address and can match a certificate issued for that IP. This issue only affects the 24.x and 26.x lines.
Medium- and Low-Severity Vulnerabilities
- CVE-2026-105481 (Medium, HTTP): With
http.Agentkeep-alive, a server can send a response through an idle reused socket before the next request, which Node.js will interpret as the response to that request. - CVE-2026-106072 (Medium, TLS): Certificates with DNS names were accepted for non-canonical IPv4 endpoints. This issue has been resolved in the same commit as CVE-2026-106069.
- CVE-2026-106074 (Medium, crypto): Cached values for
crypto.randomUUIDandcrypto.randomIntwere stored in startup snapshots, causing processes that initiated from the same snapshot to produce identical initial values. Only SEAs usinguseSnapshotor user-land snapshots are affected. - CVE-2026-106070 (Low, zlib): In the experimental
zlib.ZipFileAPI (added in 26.8.0), a read after a failed header check could return bytes from the wrong file position. - CVE-2026-106071 (Low, Permission Model): Using Wildcard paths in the
--allow-fs-reador--allow-fs-writeoptions may provide access to more files paths than originally intended. - CVE-2026-106073 (Low, fs):
fs.realpathSyncbypassed the Permission Model check that its sibling functions perform, allowing calls on ungranted paths.
Node.js by the Numbers: Nine in 10 Installations Are Unpatched or Unsupported
The Qualys Threat Research Unit analyzed anonymized data to measure exposure to the October 2026 Node.js vulnerabilities.
We found 3.3 Node.js package installations, and 15% of them are on internet-facing assets, within reach of remote attackers.
Across those installations:
- 1.3 million run supported lines, Node.js 22, 24, and 26. A fixed release is available for these versions, but it has not been applied yet.
- 1.7 million run end-of-life or end-of-support lines, Node.js 25, 23, 20, and older. These lines get no upstream fix, so moving to a supported line is the only remedy.
- Only 42,000 have been patched so far.
The takeaway: More than half of Node.js installations run versions that will never receive these fixes, and nearly all of the rest have not been patched yet.
Fixed Versions and Upgrade Guidance
Each supported line has a fixed release, and any subsequent release in the same line also includes the fixes.
Node.js version 26 will become LTS on October 28, 2026. Teams using version 26.x should upgrade to version 26.12.1 before this transition.
| Node.js branch | Security Update | Priority |
| 22.x LTS | 22.23.4 | High |
| 24.x LTS | 24.22.1 | High |
| 26.x | 26.12.1 | High |
| 25.x, 23.x, 21.x | No Fix | Upgrade to a supported branch |
| 20.x and older | End of Life | Upgrade to a supported branch |
Simply updating application dependencies does not resolve these issues. The vulnerable code is included with the Node.js runtime, which encompasses runtimes found in container-based images and single-executable applications (SEAs).
What Qualys Customers Can Do
Qualys customers can identify every vulnerable Node.js runtime across hosts, containers, and cloud workloads, and track remediation in a single view. Detections for the October 2026 release are detailed below.
| QID | CVE(s) | Fix (22.x / 24.x / 26.x) | Title | Platform |
| 389117 | CVE-2026-105481, 105482, 106069, 106072, 106073, 106074, 111497 | 22.23.4 / 24.22.1 / 26.12.1 | Node.js Multiple Security Vulnerabilities | Windows, Windows DeepScan, Apple MacOS |
| 389119 | CVE-2026-105483 | Not affected / 24.22.1 / 26.12.1 | Node.js TLS Certificate Hostname Bypass Vulnerability | Windows, Windows DeepScan, Apple MacOS |
| 389122 | CVE-2026-106070, 106071 | Not affected / Not affected / 26.12.1 | Node.js Multiple Security Vulnerabilities | Windows, Windows DeepScan, Apple MacOS |
| 106287 | EOL | No patch. Migrate to a supported line | EOL/Obsolete Software: Node.js 18.x Detected | Windows, Unix |
| 106242 | EOL | No patch. Migrate to a supported line | EOL/Obsolete Software: Node.js 16.x Detected | Windows, Unix |
| 106401 | GENERIC-MAP-NOMATCH | 20.x | Node.js 20.x Detected | Microsoft Windows, Unix, Apple MacOS |
How Qualys Finds and Closes Node.js Exposure
The Qualys Enterprise TruRisk Platform takes teams from advisory to verified fix in five stages, using the inventory and telemetry they already have.
- Find every runtime with CSAM and Qualys Deep Scan. Deep Scan identifies vulnerable Node.js binaries in custom application folders, secondary drives, and other configured directories. Findings appear in VMDR with the full binary path, installed version, and recommended fixed version. This information provides security and IT teams with the necessary details to locate and address any overlooked installations.
- Prioritize with Enterprise TruRisk Management (ETM). TruRisk scoring adds asset and exposure context, so teams can start with internet-facing services that decompress untrusted Brotli data (CVE-2026-111497) or open TLS connections to user-supplied hosts (CVE-2026-106069, CVE-2026-105483).
- Confirm the fix. After upgrading, rescan with Cloud Agent or Container Security and confirm the detection QIDs close.
To build the inventory in step 1, run one CSAM or VMDR query per release line, so patched assets on other lines are not counted:
Run the following queries in CSAM > Inventory > Assets.
| Step | Action |
| All assets with Node.js installed | (software: ((name: “Node.js”))) |
| Assets running end-of-life Node.js (21.x and earlier, 23.x, 25.x) | ((software: (((name: “Node.js”) AND (version: (*..22.0.0)))))) |
| Node.js on your most critical assets | ((asset.criticalityScore: [4..*)) AND (software: ((name: “Node.js”)))) |
Reduce Exposure Before You Patch
Upgrading the runtime is the only complete fix. Node.js has not published workarounds, so the interim steps below come from the Qualys Threat Research Unit (TRU). They narrow specific attack paths; they do not make an unpatched runtime safe.
- Avoid Brotli decompression of untrusted input where possible. Limit compressed payload size and decompression ratio at the reverse proxy or WAF.
- Resolve user-supplied names with
dns.lookupinstead ofdns.resolve*, and reject hostnames containing NUL characters. - Convert IP addresses to canonical form before they reach a TLS connection. Reject fullwidth and other non-canonical forms.
- Disable
keepAliveonhttp.Agentfor connections to untrusted servers. - Do not rely on the Permission Model as a security boundary on affected versions.
Patch with Confidence
Node.js has released fixes, and Qualys-published patches are already available in TruRisk Eliminate for the 24.x and 26.x lines. Teams on 22.x should upgrade the runtime manually until a patch is available.
For the 24.x and 26.x patches:
- Patch reliability: High for 24.22.1, Low for 26.12.1. Qualys rates the LTS Upper 24.22.1 patch with a High reliability score, so it’s unlikely to disrupt production. The Node.JS 26.12.1 patch currently carries a Low reliability score, so we recommend staging it with a pilot group before a broad rollout.
- A reboot may be required. Both patches are flagged as “Reboot Maybe Required”, so schedule deployment within a maintenance window.
- Restart every service that runs on Node.js. Long-running processes, containers and SEAs keep the vulnerable runtime in memory until they restart.
Once the relevant patch is successfully applied, the next VM scan marks the vulnerabilities on that host as closed.

- Upgrade every copy. Move each supported line to 22.23.4, 24.22.1, or 26.12.1, and migrate end-of-life lines to a supported release.
- Rebuild what embeds the runtime. Rebuild container images and SEAs on the fixed version, then redeploy them.
- Restart long-running services, so they load the new runtime.
- Rescan and verify. Rescan with Cloud Agent or Container Security and confirm the detection QIDs are closed.
Connect Your AI Assistant to Qualys in Three Steps
You can now bring Qualys data into your AI workflows with qualys-cli-mcp, a Model Context Protocol (MCP) server for the Qualys Cloud Platform. Claude, Cursor, VS Code, and other MCP-capable assistants can use it to query your Qualys environment in plain language. For example, you can ask “Can you check in Qualys if I’m vulnerable to CVE-2026-111497 or any of the October 2026 Node.js vulnerabilities?″ without writing API calls or switching consoles.
| Step | Action |
| Install (requires Python 3.11 or later) | pip install qualys-cli-mcp |
| Configure your credentials | qualys-cli configure It asks for your Qualys username and password, automatically detects your platform, and securely stores the credentials in your OS keyring. Your credentials never go into the AI client’s config file. |
| Connect your AI client | For Claude Desktop, add this to claude_desktop_config.json (VS Code and Cursor use the same entry): { “mcpServers”: { “qualys”: { “command”: “qualys-cli-mcp” } } } |
That’s it. Your assistant can now work across Qualys.
What This Means for Security Teams
The key question we should focus on in this release is not “Are we using Node.js?” but rather, “Where are all the copies, and which ones could an attacker access?” Runtime vulnerabilities can extend across version managers, containers, serverless functions, and various environments, far beyond what standard dependency checks can detect.
With Qualys, teams can identify affected runtimes as soon as advisories are published. They can locate copies that exist outside standard paths, prioritize services exposed to untrusted input, and verify that fixes have been implemented. Detection, prioritization, and verification are all managed on a single platform, eliminating the need to integrate multiple tools.
Reference
Node.js Project: Wednesday, October 21, 2026 Security Releases

