The Node.js security releases of October 21, 2026, land squarely on AI agent tooling. Node.js 22.23.4, 24.22.1 and 26.12.1 fix ten CVEs. The four High ones are a Brotli decoder out-of-bounds write that can permit remote code execution (CVE-2026-111497), dns.resolve cutting host names at a NUL byte (CVE-2026-105482), and two TLS hostname bypasses for numeric hosts (CVE-2026-106069 and CVE-2026-105483). Most MCP servers, many coding-agent CLIs and plugins, and a lot of agent backends run on Node.js. They spend their day fetching URLs, resolving hosts someone else chose and calling internal services by IP, which are the code paths these bugs live in.
This post maps each bug to agent workloads. For the full list and general upgrade steps, see explainx.ai's Node.js October 2026 security release breakdown. Every CVE also has an entry in the AgentBeam CVE database.
TL;DR
| Question | Answer |
|---|---|
| Fixed versions | 22.23.4, 24.22.1, 26.12.1 |
| Most relevant for agents | Brotli RCE (fetching), DNS NUL truncation (host allowlists), TLS IP bypasses (internal endpoints) |
| Agent tools shipped as one binary? | Rebuild SEAs; repeated UUIDs are baked in (CVE-2026-106074) |
Using --permission as a sandbox? | Two Permission Model fixes; do not rely on it alone |
| eMudhra | Releases block the eight compromised CA keys in every Node.js TLS context |
| Exploited? | No exploitation reported |
Bug-by-bug: where agents are exposed
| CVE | Severity | Agent workload at risk |
|---|---|---|
| CVE-2026-111497 | High | Fetch, browse and scrape tools that decode br responses from arbitrary URLs; servers that accept br uploads |
| CVE-2026-105482 | High | Tools that check a host against an allowlist, then resolve it with dns.resolve |
| CVE-2026-106069 | High | Clients connecting to user-supplied or loosely written numeric hosts, such as local model servers |
| CVE-2026-105483 | High | Same, with fullwidth Unicode digits (24.x and 26.x) |
| CVE-2026-106072 | Medium | Internal PKI and mutual TLS between agent services |
| CVE-2026-105481 | Medium | Gateways and proxies that reuse keep-alive sockets to third-party APIs |
| CVE-2026-106074 | Medium | Agent CLIs or servers shipped as single executables with a snapshot |
| CVE-2026-106073, CVE-2026-106071 | Low | Tools sandboxed with the Node.js Permission Model |
| CVE-2026-106070 | Low | Code using the new ZIP reader in 26.x on untrusted archives |
Fetch tools and the Brotli bug
A "fetch" or "browse" tool is the most common MCP tool there is. It takes a URL, often chosen by the model from untrusted content, and downloads it. If the HTTP client accepts Content-Encoding: br, the response body goes through the bundled Brotli decoder. CVE-2026-111497 is an out-of-bounds write in that decoder on malformed streams. A prompt injection that gets the agent to fetch an attacker's URL becomes a path for crafted bytes to reach native code in the process that also holds your API keys. No exploit is public, and the advisory gives no detail beyond the fix, but the path is real enough to patch today.
Host allowlists and the DNS NUL bug
Well-built fetch tools check the host against an allowlist before connecting. CVE-2026-105482 breaks checks done on raw strings: dns.resolve truncated a name at an embedded \0, so a value that ends in a trusted suffix in JavaScript could resolve as a different, attacker-chosen name. If your tool validates hosts as strings and then resolves them, upgrade and also reject control characters before the check.
Local model servers, internal services and the TLS bugs
Agent stacks often talk to model servers, vector databases and tool backends by IP address inside a network or a cluster. CVE-2026-106069, CVE-2026-105483 and CVE-2026-106072 all concern numeric hosts in unusual forms (127.1, hex, fullwidth digits). Node.js checked the certificate against one reading of the host while the OS connected to another, or matched DNS names instead of IP entries. With private PKI in the picture, that can turn a verified TLS connection into one an attacker in the network controls. Write IP endpoints in canonical form and restrict which services trust each internal CA.
Single executable agents and repeated "random" IDs
Shipping an agent CLI as a Node.js single executable application (SEA) with a startup snapshot is attractive: one file, fast start. CVE-2026-106074 means that if the snapshot setup code called crypto.randomUUID() or crypto.randomInt(), every copy of the binary replays the same first values. Session IDs, run IDs or temporary tokens can collide across users or be predicted. Upgrading the runtime does not help an SEA you already shipped; rebuild it with the fixed toolchain and rotate anything security-relevant it generated.
The Permission Model is a seatbelt, not a sandbox
Some teams run agent tools under node --permission with --allow-fs-read and --allow-fs-write limits. This release fixes a bypass through fs.realpathSync (all lines) and a wildcard over-grant in the permission tree (26.x). Both are Low severity, and both are a reminder that the Permission Model is meant for trusted code. For tools that execute model-chosen actions, use containers, VMs or a sandbox built for it; we covered one option in Capsem, a VM sandbox for coding agents.
The eMudhra blocklist reaches agent runtimes
The releases also close the gap we described in the eMudhra CA compromise post. Node.js has no CRLSet or OneCRL and no default online revocation, so a chain through a compromised intermediate kept verifying. The new code adds a compiled-in blocklist of the eight eMudhra public key hashes, checked on every verified chain for TLS, QUIC and DTLS, and reported as a revoked certificate. Agent backends and MCP servers on Node.js pick it up only after you upgrade and restart them.
Upgrade checklist for agent stacks
- Find every Node.js an agent uses. MCP servers launched with
npxuse thenodeon the PATH of whatever starts them: your editor, desktop app or agent CLI. Check that environment, not just your terminal. - Upgrade with your version manager (
nvm install 22.23.4) or system packages. - Rebuild Docker-based MCP servers and agent images from
node:22.23.4,node:24.22.1ornode:26.12.1with--pull. - Rebuild SEAs and snapshot blobs, then rotate tokens they generated.
- Restart long-running agent services and MCP hosts so child processes start on the new binary.
- Check Electron-based agent apps; they embed their own Node.js and need a vendor update.
- Do not "fix" new certificate errors by disabling verification. If a tool starts failing TLS after the upgrade, it may have been talking to something it should not.
Where Beam fits
Beam does not patch runtimes. It records the shell commands, file access and MCP tool calls that coding agents such as Claude Code and Codex make on your machine, redacts recognized secrets, and flags risky patterns. That helps with two parts of this release: seeing which MCP servers and tools your agents actually launch, and catching an agent that "fixes" a TLS error by setting NODE_TLS_REJECT_UNAUTHORIZED=0 or rejectUnauthorized: false during an upgrade. See MCP server security review for how to audit the servers you run.
What people ask
"The release says no exploitation. Why rush?"
Because agent tools put the vulnerable paths in front of untrusted input by design. A model that reads a malicious page can be steered to fetch a URL; that is all the Brotli path needs.
"Our MCP server is written in Python. Are we fine?"
For these CVEs, yes. Python has its own equivalents to watch, such as certifi for the eMudhra keys.
"We pinned Node 20 for an old MCP server."
Node.js 20 is end of life and is affected without a fix. Move the server to 22 or 24.
Related reading
- MCP TypeScript SDK: four advisories in SDK 1.32.0
- eMudhra CA keys compromised: what to update
- PHP2Shell and AI agents: why the attack window just collapsed
- npm supply chain worms and AI tooling
- Node.js October 2026 security release breakdown on explainx.ai
Primary sources: Node.js October 2026 security releases · v22.23.4 · v24.22.1 · v26.12.1
Details are accurate as of October 21, 2026. The Node.js advisory lists titles and affected lines; mechanism details come from the public fix commits.
