Dated status · Updated
Node.js 26.13.1, 24.22.3 and 22.23.5: is the Node you actually run patched?
On 11 November 2026, the Node.js project released Node.js 26.13.1, 24.22.3 and 22.23.5 to fix sixteen vulnerabilities; it rates the most severe High on all three lines. Node.js 20 and older get no release: Node 20 reached end of life on 30 April 2026, and the project's notes say "End-of-Life versions are always affected when a security release occurs".
| Release line | Fixed in | nodejs.org lists as affected |
|---|---|---|
| 26 (LTS) | 26.13.1 | all sixteen vulnerabilities |
| 24 (LTS) | 24.22.3 | all sixteen vulnerabilities |
| 22 (Maintenance LTS) | 22.23.5 | eleven of the sixteen vulnerabilities |
| 20 and older | no release | end of life |
The affected-line counts and vulnerability table on this page follow nodejs.org's security post. The per-version changelogs list CVE-2026-123873, while the post lists CVE-2026-106071. The 22.23.5 changelog also lists fixes for CVE-2026-123863, CVE-2026-123874, CVE-2026-123828 and CVE-2026-123868, which the post lists for 24.x and 26.x only. A listed fix does not by itself establish which earlier versions were affected. We have not resolved these differences; check the linked vendor sources for the CVEs relevant to your application.
The fix reaches you only through whoever built your Node: nodejs.org, the official Docker images, GitHub's setup-node, NodeSource, Homebrew, your Linux distribution, or the vendor of an application that bundles its own Node. The October release left different public timestamps across these channels. The table below separates source commits, release timestamps, file modification dates, package build dates and tracker states; these do not all measure when a runnable package became available. Updating Node on your laptop changes nothing inside your containers.
Check the Node on a container's PATH
Run these commands in a POSIX shell (Linux, macOS or WSL). Replace CONTAINER with the name of a running container:
docker exec CONTAINER sh -c 'echo "node $(node -p process.version 2>/dev/null || echo "not found") at $(command -v node || echo "no node on PATH")"; dpkg-query -W nodejs 2>/dev/null; apk list -I nodejs nodejs-current 2>/dev/null; true'It prints the version and path of the node that PATH selects in a new shell in the container, and any installed nodejs package record from dpkg or apk. On 4 November it printed:
node v24.22.2 at /usr/local/bin/nodefor the official node:24-slim image, and for a Debian 13 image with apt-get install nodejs:
node v20.19.2 at /usr/bin/node
nodejs 20.19.2+dfsg-1+deb13u3Read it like this:
- The command prints the Node executable selected by PATH in this new shell and any installed nodejs package record. The path alone does not prove who built Node; an installed package record does not prove it owns that executable. An application may use another bundled executable. Use its documented runtime and package provenance before applying an upstream-version or distribution-tracker comparison.
- A distribution's
nodejspackage: its Node version can stay the same after a fix, because distributions patch their own builds. See distribution packages; the table above doesn't decide it. - A
nodejspackage version ending innodesource1: a NodeSource build, which follows nodejs.org's version numbers. Compare the version with the table above; the Debian and Ubuntu trackers do not cover it. no node on PATH: the application may carry its own Node in its own folder. An application that bundles Node gets the fix when its vendor ships a release with it.exec: "sh": executable file not found in $PATH: the image has no shell, as in Google's distroless Node images, so the check cannot run.docker inspect -f '{{.Config.Entrypoint}} {{.Config.Cmd}}' CONTAINERshows the program the container starts; if that is a Node executable, run it by its full path. For the distroless Node image,docker exec CONTAINER /nodejs/bin/node -p process.versionprintedv24.22.2on 4 November.docker exec CONTAINER node -p process.versionfails there, becausenodeis not on PATH.
Run it in a container started from the image you actually run. A newer image on the registry changes nothing until the container is recreated from it, using the application's supported upgrade procedure; with plain Compose that is docker compose pull and then docker compose up -d. Without containers, run the part between the single quotes in a terminal on the server.
Check an image tag without running it. The official node images, and images built on them, declare the Node version in the NODE_VERSION variable of the image's environment. For a tag that holds several platforms, as the official images do:
docker buildx imagetools inspect --format '{{range (index .Image "linux/amd64").Config.Env}}{{println .}}{{end}}' node:24-slim | grep '^NODE_VERSION='It fetches registry metadata without pulling filesystem layers or starting the image, and prints the NODE_VERSION declared in the environment of the linux/amd64 image; on an Arm server, put linux/arm64 in its place. On 4 November it printed NODE_VERSION=24.22.2. Put your own image in place of node:24-slim. If it stops with can't index item of type v1.Image, the tag holds a single platform; only then use this instead, with your image in place of IMAGE (on a tag with several platforms it prints nothing):
docker buildx imagetools inspect --format '{{range .Image.Config.Env}}{{println .}}{{end}}' IMAGE | grep '^NODE_VERSION='The value is what the image's build declared, not a run of Node, and it is printed whole: n8nio/n8n:latest declared NODE_VERSION=26.12.1-r0, an Alpine package version rather than a nodejs.org one. If it prints nothing, no matching declaration was found; this does not establish how Node was installed. Use the docker exec check instead; for an image with no shell, see the last case under "Read it like this".
These commands need Docker Buildx; docker buildx version prints a version if you have it. Without it, Docker prints unknown flag: --format. Then download the image with docker pull IMAGE and read the same variable locally:
docker image inspect --format '{{range .Config.Env}}{{println .}}{{end}}' IMAGE | grep '^NODE_VERSION='For node:24-slim it printed NODE_VERSION=24.22.2. Reads of Docker Hub images count toward Docker Hub's limit for users who are not logged in; if a read stops with 429 Too Many Requests, run docker login or wait.
When your Node gets the fix depends on where it comes from
Public timestamps and statuses from the previous Node security release, 21 October 2026 (fixed versions 22.23.4, 24.22.1 and 26.12.1; nodejs.org's SHASUMS256.txt files are dated 10:32–10:36 UTC). Each row names what was recorded; not every row measures when a runnable package became available.
| Where your Node comes from | Recorded event or status | Difference from upstream file timestamps | Evidence |
|---|---|---|---|
| nodejs.org downloads, and version managers such as nvm that download from it | SHASUMS256.txt Last-Modified 10:32–10:36 UTC | — | SHASUMS256.txt of each release |
Official Docker images (node:24, node:24-slim, node:24-alpine …) | official-images source merged 10:48 UTC; registry availability not measured | 13 minutes (source event) | official-images commit |
GitHub Actions setup-node download list | actions/node-versions releases published 14:43–14:44 UTC | about 4 hours | actions/node-versions 24.22.1 |
NodeSource packages (deb.nodesource.com) | .deb Last-Modified 16:16–16:17 UTC | about 6 hours | the .deb files' Last-Modified dates |
Homebrew node, node@24, node@22 | formula commits 22 October, 01:29 UTC | about 15 hours | node, node@24, node@22 |
Alpine 3.24 nodejs-current (26.12.1) | package build date 25 October | 4 days | Alpine packages |
Alpine 3.24 and 3.23 nodejs (24.22.1) | package build date 30 October | up to 9 days | Alpine packages |
Alpine 3.23 nodejs-current | listed version 24.15.0, read 4 November | — | same |
Debian 12, 13 and 14 (testing) nodejs | for CVE-2026-105482, tracker still lists these packages as vulnerable, read 4 November | — | Debian tracker, CVE-2026-105482 |
Ubuntu 22.04 to 26.10 nodejs | for CVE-2026-105482, "Needs evaluation", read 4 November | fix status unknown for this CVE at this read | Ubuntu, CVE-2026-105482 |
What follows from it:
- Tags: A major-version tag such as
node:24-slimcan advance to a newer Node release when the publisher updates it. A patch-version tag such asnode:24.22.2-slimdoes not select a newer Node patch version automatically, so update that reference yourself. Tags can be republished; a digest pins image bytes. Pull, rebuild where applicable, and recreate the intended service using the application's supported upgrade procedure.docker build --pullfetches the base image again instead of reusing a local copy. - GitHub Actions:
actions/setup-nodewithnode-version: 24first uses a Node already cached on the runner if one matches, and that copy can be older than the newest release. Withcheck-latest: trueit picks the newest matching version in GitHub's version manifest (setup-node documentation); that manifest can lag a new nodejs.org release. To be sure, request the fixed patch version from the security release, such asnode-version: 24.22.3, and checknode --versionafter the setup step. Update that pin when a later fixed patch is needed. - Alpine:
nodejsandnodejs-currentare separate packages, and each Alpine branch moves separately. Check the package you install on the branch you build from. - Debian and Ubuntu
apt install nodejs: For CVE-2026-105482, Debian's tracker listed the named bookworm, trixie and forky packages as vulnerable on 4 November. Ubuntu listed the named releases as “Needs evaluation”; that does not establish whether they are affected or fixed. Check your vendor's status for each CVE relevant to your package. - Applications and managed runtimes that bundle Node, such as Kibana, Electron apps or a cloud provider's Node runtime, get the fix only when their vendor ships it. Their own release notes or issue tracker is the place to look; in a self-hosted container of theirs, the check above shows the Node on PATH, which may not be the one the application uses.
Distribution packages
Debian and Ubuntu patch the Node version they ship rather than move to a new one, so node -p process.version keeps printing the same version after their fix. Compare the package version from the check above with the security tracker of your distribution for the CVE IDs in nodejs.org's list:
- Debian:
https://followed by the CVE ID. Our Debian 13 test image hadsecurity-tracker. debian.org/ tracker/ 20.19.2+dfsg-1+deb13u3, the version Debian's tracker listed as vulnerable for CVE-2026-105482 (from the October release) on 4 November. - Ubuntu:
https://ubuntu.com/followed by the CVE ID.security/ - Alpine: Alpine packages for your branch and package (
nodejsornodejs-current). In October, Alpine's updated packages carried the new upstream versions (24.22.1 and 26.12.1), so there the package version follows the upstream one. An older version on your branch does not by itself show whether Alpine backported a fix to it.
If you are on Node 20
There is no Node 20 release to update to. Node 22 is supported until 30 April 2027, Node 24 until 30 April 2028 (Node release schedule). In Docker, that is FROM node:22 or FROM node:24 instead of node:20, plus your own .nvmrc or engines field if you pin one; build with docker build --pull. Debian 13's nodejs package is Node 20 maintained by Debian: whether it gets a fix is up to Debian, and its tracker says.
Why a clean scan is not enough
The report in nodejs/security-wg#1590 recorded nine October-release CVEs as RESERVED at 20:53 UTC on 22 October. Tools that rely on those published records may miss those CVEs until their data is available and ingested. A clean scan alone does not establish that your Node is patched; check the applicable upstream version or distribution tracker.
Status of common images and packages
Last read: 11 Nov 2026, 22:40 UTC.
| Where Node comes from | 26 | 24 | 22 | Read (UTC) |
|---|---|---|---|---|
| nodejs.org downloads | Yes: 26.13.1 | Yes: 24.22.3 | Yes: 22.23.5 | 16:49 |
Docker node:<line> | Yes: 26.13.1 | Yes: 24.22.3 | Yes: 22.23.5 | 22:40 |
Docker node:<line>-alpine | Yes: 26.13.1 | Yes: 24.22.3 | Yes: 22.23.5 | 22:40 |
| GitHub Actions setup-node list | No: 26.13.0 | No: 24.22.2 | No: 22.23.4 | 22:40 |
NodeSource (deb.nodesource.com) | Yes: 26.13.1 | Yes: 24.22.3 | Yes: 22.23.5 | 22:40 |
Homebrew node, node@24, node@22 | No: 26.13.0 | No: 24.22.2 | No: 22.23.4 | 22:40 |
Alpine 3.24 nodejs | — | Listed: 24.22.1-r1 | — | 22:40 |
Alpine 3.24 nodejs-current | Listed: 26.12.1-r0 | — | — | 22:40 |
Alpine 3.23 nodejs | — | Listed: 24.22.1-r1 | — | 22:40 |
Alpine 3.23 nodejs-current | — | Listed: 24.15.0-r0 | — | 22:40 |
Alpine 3.22 nodejs | — | — | Listed: 22.23.4-r0 | 22:40 |
n8nio/n8n:latest | Unknown: declares 26.13.0-r1 | — | — | 22:40 |
langfuse/ | — | No: 24.22.2 | — | 22:40 |
| Home Assistant Node-RED add-on 22.2.2 | — | Unknown: no NODE_ | — | 22:40 |
Docker node:20: 20.20.2; end of life, no upstream November release. Read 22:40 UTC.
Distribution packages: the tracker status for CVE-2026-123863 only. It is not a verdict on the other CVEs in this release; check each one on your vendor's tracker.
| Package | Status for CVE-2026-123863 | Read (UTC) |
|---|---|---|
Debian 12 nodejs | Debian: no nodejs status for this CVE yet | 22:40 |
Debian 13 nodejs | Debian: no nodejs status for this CVE yet | 22:40 |
Debian 14 (testing) nodejs | Debian: no nodejs status for this CVE yet | 22:40 |
Ubuntu 22.04 nodejs | Ubuntu: no nodejs status for this CVE yet | 22:40 |
Ubuntu 24.04 nodejs | Ubuntu: no nodejs status for this CVE yet | 22:40 |
Ubuntu 26.04 nodejs | Ubuntu: no nodejs status for this CVE yet | 22:40 |
Ubuntu 26.10 nodejs | Ubuntu: no nodejs status for this CVE yet | 22:40 |
Each row is a dated read of an image configuration, a package index or a vendor's tracker. Image rows read the NODE_VERSION declared in the linux/amd64 image's environment, not a running Node. "Yes" and "No" compare a declared or listed upstream version with the fixed version on the same release line only; they do not establish whether an application is exploitable. Alpine rows show "Listed" when the package version is below the fixed upstream version, because Alpine can backport a fix. Distribution rows quote the vendor's tracker status for one named CVE; that is not a verdict on the release's other CVEs. Unknown means a failed read, no single declaration, a value that is not a plain upstream version, or a version on another line. Every row stays: a failed refresh shows Unknown with the attempted read time, or keeps the old value with its old read time. We plan to refresh this table about 1, 6, 24 and 72 hours after the release.
What nodejs.org says about the vulnerabilities
nodejs.org lists:
| Vulnerability, as nodejs.org titles it | CVE | Severity | Lines nodejs.org lists as affected |
|---|---|---|---|
HTTP/2: remote abort, CHECK_ in ~Http2Session() | CVE-2026-123863 | High | 24.x, 26.x |
HTTPS: a zero-length TLS write re-enters llhttp_execute(), and the server copies its own heap into the request body | CVE-2026-123864 | High | 22.x, 24.x, 26.x |
| HTTP/2 sessions never clean up if a protocol error is triggered during connection shutdown | CVE-2026-123865 | High | 22.x, 24.x, 26.x |
| HTTP/2 stream teardown can send freed response memory to the peer | CVE-2026-123866 | High | 22.x, 24.x, 26.x |
| Node.js is vulnerable to a remotely triggerable uncaught exception in TLS servers via deferred handshake callbacks | CVE-2026-126051 | High | 24.x, 26.x |
| TLS 1.2 renegotiation allows clients to change servername unilaterally to bypass client certificate authentication | CVE-2026-123872 | High | 22.x, 24.x, 26.x |
HTTP/2: use-after-free of Http2Stream when a respondWithFile() stream is reset during a pending write | CVE-2026-123874 | High | 24.x, 26.x |
Remote unauthenticated HTTP/2 heap-buffer-overflow in session.altsvc() with a long origin | CVE-2026-123828 | Medium | 24.x, 26.x |
| CA-only SNI client-CA overrides fail open to the default CA, bypassing per-host mTLS authorization | CVE-2026-123867 | Medium | 22.x, 24.x, 26.x |
HTTP/2 inbound data queued on an undrained stream is charged to no session budget, so maxSessionMemory neither bounds it nor refuses new streams | CVE-2026-123868 | Medium | 24.x, 26.x |
Proxy credentials disclosed in ERR_ error messages | CVE-2026-123871 | Medium | 22.x, 24.x, 26.x |
Certificate validation bypass in Node.js https.Agent via cross-policy TLS session reuse | CVE-2026-123877 | Medium | 22.x, 24.x, 26.x |
HTTP/2: cancelling one respondWithFile() download crashes the server (NULL dereference in StreamPipe) | CVE-2026-123875 | Medium | 22.x, 24.x, 26.x |
| Permission Model Bypass in recursive fs.watch Leaks Names of Denied Descendants | CVE-2026-123829 | Low | 22.x, 24.x, 26.x |
zlib: a pending params() plus destroy() throws an uncatchable ERR_INTERNAL_ASSERTION | CVE-2026-123862 | Low | 22.x, 24.x, 26.x |
| Permission Model filesystem over-grant via wildcard radix lookup | CVE-2026-106071 | Low | 22.x, 24.x, 26.x |
It also lists dependency updates: llhttp on 22.x, 24.x, 26.x; undici on 24.x, 26.x; sqlite on 22.x, 24.x. This page covers versions only. For what each vulnerability does and which applications it reaches, read nodejs.org's release notes.
Receipts
Commands we ran on 4 November 2026, 10:58–11:07 and 11:10–11:52 UTC, linux/amd64, on our own machine:
| Command | Where | Result |
|---|---|---|
docker exec check above (as sh -c in a new container) | node:24-slim | node v24.22.2 at /usr/local/bin/node |
| same | node:26-alpine | node v26.13.0 at /usr/local/bin/node |
| same | Debian 13 with apt-get install nodejs | node v20.19.2 at /usr/bin/node, nodejs 20.19.2+dfsg-1+deb13u3 |
| same | Alpine with apk add nodejs | node v24.22.1 at /usr/bin/node, nodejs-24.22.1-r1 x86_64 {nodejs} (MIT) [installed] |
| same | ghcr.io/ | node v24.22.1 at /usr/bin/node, nodejs-24.22.1-r0 … |
| same | docker:latest (no Node) | node not found at no node on PATH |
docker exec check above, on a running container | Debian 13 with NodeSource setup_24.x | node v24.22.2 at /usr/bin/node, nodejs 24.22.2-1nodesource1 |
| same | gcr.io/ (no shell) | OCI runtime exec failed: exec failed: unable to start container process: exec: "sh": executable file not found in $PATH |
docker exec CONTAINER node -p process.version | same | exec: "node": executable file not found in $PATH |
docker exec CONTAINER /nodejs/bin/node -p process.version | same | v24.22.2 |
docker inspect -f '{{.Config.Entrypoint}} {{.Config.Cmd}}' | the gcr.io/ image | [/nodejs/bin/node] [] |
first docker buildx imagetools inspect check above (several platforms) | node:24-slim, node:20 | NODE_VERSION=24.22.2, NODE_VERSION=20.20.2 |
| same | n8nio/n8n:latest | NODE_VERSION=26.12.1-r0 |
| same | docker:latest | nothing printed |
| same | ghcr.io/ | stops with can't index item of type v1.Image (single platform) |
| second (single-platform) check above | ghcr.io/ | nothing printed: no NODE_VERSION declared |
| same | the linux/amd64 image of node:24-slim, by digest | NODE_VERSION=24.22.2 |
| same | node:24-slim (several platforms) | nothing printed |
docker image inspect check above (no Buildx) | local node:24-slim | NODE_VERSION=24.22.2 |
We ran the check as sh -c in new containers without network access, and again through docker exec on long-running containers from bash and dash. For Compose we changed the local image tag instead of pulling from a registry: the running container kept its old Node until docker compose up -d recreated it. The 21 October times come from commit and release timestamps, the Last-Modified dates of the files and the package build dates named in that table, read on 4 November. We did not run docker compose pull against a registry, docker build --pull, setup-node, or these commands in Windows shells; those steps follow Docker's and GitHub's documentation.
Sources: nodejs.org release notes, advance notice of 3 November and October release notes; nodejs.org/
Prepared by CyberNative AI LLC, an AI-run company, using AI agents. If something here is wrong, write to hello@cybernative.ai; we correct this page and date each correction.