Node.js End of Life: Node 20 Is EOL, and the October 2026 Security Release
Node.js release lines and their end-of-life dates, what the October 21, 2026 security release fixed, and how to find every place an old Node version is still running.

Node.js 20 reached end of life on April 30, 2026. Six months later, on October 21, 2026, the Node.js project shipped security releases for the 26.x, 24.x and 22.x lines fixing ten vulnerabilities, four of them rated high. Node 20 was not patched, and it never will be.
Node.js end-of-life dates
Even-numbered releases become Long Term Support (LTS) and are maintained for about 30 months in total. Odd-numbered releases are short-lived.
| Version | Status (Oct 2026) | End of life |
|---|---|---|
| Node.js 26 | Current → Active LTS from October 2026 | April 30, 2029 |
| Node.js 24 | Active / Maintenance LTS | April 30, 2028 |
| Node.js 22 | Maintenance LTS | April 30, 2027 |
| Node.js 20 | End of life | April 30, 2026 |
| Node.js 18 | End of life | April 30, 2025 |
| Node.js 16 and older | End of life |
Check the current schedule at nodejs.org/en/about/previous-releases before you plan an upgrade.
What the October 21, 2026 release fixed
- CVE-2026-111497: Brotli decoder out-of-bounds write. Node's advisory says it permits remote code execution. Any server that decompresses attacker-controlled Brotli data (an HTTP client fetching untrusted URLs, a proxy, an upload endpoint) is exposed.
- TLS hostname verification bypasses. Several issues could let a certificate for the wrong host be accepted, which undermines HTTPS calls your server makes to other services.
- DNS lookup issues, plus dependency updates to c-ares, OpenSSL (22.x and 24.x), SQLite (22.x) and Undici.
Patched versions reported for this release: 26.12.1, 24.22.1 and 22.23.4. Confirm against the official advisory before you pin a version.
Where old Node versions hide
The node -v on your laptop is rarely the one serving traffic. After a security release, check each of these:
- Docker images.
FROM node:20-alpinein a Dockerfile keeps shipping Node 20 until someone edits it. Rebuild images even on the same major version, because tags likenode:22-alpineonly pick up the fix when you pull and rebuild. - Platform runtime settings. Vercel, Netlify, Render, Railway, AWS Lambda and similar platforms each have a Node version setting per project. Some patch minor versions automatically; few move you off an EOL major on their own.
enginesand.nvmrc/.node-versionfiles that pin CI and deploys to an old major.- Process managers and system packages. PM2, systemd units and
/usr/local/bin/nodeinstalled by a pkg installer years ago. - Background jobs on a separate server that nobody remembers until they break.
Node.js does not announce its version over HTTP, so an external scan cannot tell you the version directly. The website vulnerability scanner does flag framework fingerprints such as X-Powered-By: Express, which are worth removing anyway.
Upgrading from Node 20
- Move to Node 22 at minimum, preferably 24, which is supported until 2028.
- Update native modules (
bcrypt,sharp,better-sqlite3and similar) since they compile against a specific Node ABI. - Run tests on the new version in CI before switching production; most apps move from 20 to 22 or 24 without code changes.
- Update the Dockerfile base image, the platform setting and
enginesin the same pull request so the three cannot drift apart. - Deploy, then confirm the running version from inside the process (log
process.versionat startup).
If your fleet has many small services, that last step matters most: the project that broke last time is usually the one where only two of the three places were updated. If you want this handled for you, managed patching applies Node.js security releases within 72 hours.