Daily · Article 02 · 9 min read
- Security
- Open source
Node.js ships security releases fixing a remote code execution flaw
October 21 official announcement · October 22 explanation of input routes and damage conditions
Summary
Node.js released versions 22.23.4, 24.22.1 and 26.12.1 on October 21 to fix security flaws. Crafted Brotli data can lead to code execution; damage depends on the affected program’s permissions.
The compressed data your service receives from elsewhere can become an entry point into the machine processing it. Node.js released security fixes on October 21 for a flaw that can allow attacker-chosen code to run during decompression. A fictional weather service makes the route in—and the possible damage—easier to follow.
Key facts
Node.js runs JavaScript programs outside the browser. On October 21 the project published a security notice and fixed releases for its three supported lines: 22.23.4, 24.22.1 and 26.12.1. The flaw that can lead to remote code execution is CVE-2026-111497 (a CVE is the public ID given to a known vulnerability), and it sits in the code that unpacks Brotli-compressed data. The highest severity in this batch is High. Security notice
| Line | Fixed release | Official release notes |
|---|---|---|
| 22.x | 22.23.4 | 22.23.4 release |
| 24.x | 24.22.1 | 24.22.1 release |
| 26.x | 26.12.1 | 26.12.1 release |
The Node.js release schedule lists 20.x as end-of-life since April 30, and lines like it get no fix. The notice says end-of-life versions are always affected when a security release comes out. Security notice
The same releases fix flaws in DNS (looking up a server's IP address from its name) and TLS (the protocol that encrypts HTTPS connections and checks the other server's certificate), and update bundled components such as c-ares, OpenSSL and Undici. Not every flaw hits every line. CVE-2026-105483, for example, lets an IP address written in fullwidth digits slip past a certificate check, and it applies only to 24.x and 26.x.

1. Where does your Node.js run?
In a web service, Node.js usually shows up in two places: on a server answering API requests, or in the build tools that produce the site's files before deployment. Take a fictional information site. The developer uses Node.js to render pages into HTML ahead of time, and the hosting server just sends the finished files. No Node.js runs when a visitor opens a page, but the build environment that made those files still has it.
| Where it is | What this release means for it |
|---|---|
| A visitor's browser | Nothing. Browsers run JavaScript with their own engines |
| A Node.js server answering requests | Replace Node.js on the server, container or managed host |
| The environment that builds the site | Replace the Node.js the build tools use |
The cat asks Q&A
- The researcher
Our site only serves static files. Can we skip this update?
Pocket NotebookNot for the build environment. Visitors never hit Node.js, but the build server that makes those files does run it.
2. Compressed data can arrive without an upload form
Imagine a fictional weather service. Our Node.js server requests readings from an outside weather server, decompresses the response, then displays the temperature. Brotli is a format used to send web data in a smaller form, and Node.js includes code to unpack it again. Its official documentation shows receiving an external HTTP response and decompressing it with Brotli. Official compressed-response example
Usually, the response contains weather readings. If an attacker can influence its contents and crafted data reaches the vulnerable Brotli decoder in an unpatched Node.js, that processing becomes an entry point. The attacker is supplying data the app meant to read, rather than a program the operator knowingly asked it to execute.
Which services have such a route depends on their implementation. Look for features that unpack uploaded Brotli data, read compressed responses from outside servers, or fetch and unpack external data during builds. Not every upload or HTTP request automatically invokes this vulnerable operation.
The cat asks Q&A
- The researcher
If visitors have no input box, where does an attacker’s data come in?
Pocket NotebookIn this example, through the response our server fetches from another server. An attacker must be able to influence that content and the app must unpack it through the vulnerable Brotli code; the presence of a form cannot answer that.
- The researcher
How could an attacker change a weather provider’s data?
Pocket NotebookThis scenario assumes the data provider is compromised or the app reads a response from a server the attacker operates. That is a condition to investigate, not a claim that every external API is attacker-controlled.
3. Why can reading data turn into running code?
Memory is the temporary space where a running program puts its working information. Decompression code must write its results inside the area reserved for them. This flaw writes outside that area—an out-of-bounds write—and Node.js identifies CVE-2026-111497 as allowing remote code execution, or RCE. Official security notice
Picture a workbench with a space for incoming data and other notes needed to do the work. Writing inside the data space leaves those notes alone; writing past its boundary can overwrite information the program relies on. Real memory contains data and information used to continue execution, and corruption of the latter can, under particular conditions, let an attacker redirect execution. MITRE’s out-of-bounds write explanation
The risk can therefore go beyond displaying the wrong temperature. A task meant to read data may be made to do something else chosen by an attacker. Not every large input or shortage of memory produces RCE, and this article does not reproduce an attack input or its success conditions.
The cat asks Q&A
- The researcher
Does writing “send me the password” inside the data make it obey?
Pocket NotebookIt is not reading a sentence and treating it as an instruction. A bug in the decompression code can overwrite internal program information, which can change how execution proceeds.
- The researcher
Does crossing the boundary always mean an attacker takes over?
Pocket NotebookNo. The process may crash instead, and code execution depends on conditions such as memory state and the execution environment.
4. What a successful attack could do to a service
If RCE succeeds, the malicious code generally operates with the compromised program’s permissions. Files and secrets Node.js can read, files it can write, and databases it can access shape the damage. RCE does not automatically grant the machine’s administrator privileges or access to other company servers.
The following are possible damage scenarios, not reported incidents or test results establishing that this flaw caused them at a particular service.
| What the operator might experience | Conditions that make it possible |
|---|---|
| Service interruption | Memory corruption can terminate the Node.js process, causing failed requests or requiring a restart |
| Data or secret theft | Code can read accessible configuration files or API keys and send them out; reading customer records also requires database access and read permissions |
| Site tampering | Permission to change content, page files or database records can allow altered pages or malicious material to be inserted |
| File encryption or ransomware | Malicious code execution plus write access to target files can allow them to be encrypted and made unusable |
The cat asks Q&A
- The researcher
Could it lock files and demand money, like ransomware?
Pocket NotebookThat is one possible consequence if malicious code runs and can write the target files. The term RCE alone does not establish that every file can be locked or that a ransomware incident has occurred.
- The researcher
If it reads a database key, have I only lost one secret file?
Pocket NotebookThe impact may extend to services accessible with that key. If compromise is suspected, patching should accompany secret rotation, access-log review and checks for changed data.
5. Same 24.x, different last digit
Say fictional server A runs v24.22.0. It's on the 24.x line, but the fix for that line is 24.22.1, so server A isn't patched yet.
Linux distributions and managed hosts sometimes copy fixes into their own packages, which is called a backport. In that case the version number alone won't tell you much, so read the supplier's package revision and security fix history as well.
The cat asks Q&A
- The researcher
So should every service jump to 26, the newest line?
Pocket NotebookMoving to the fixed release on your current line is enough. 22, 24 and 26 all got one, and a major-version move needs compatibility testing first, so plan that separately.
6. Is the new version actually running?
npm manages the packages an app pulls in. This fix lives in Node.js itself and the components bundled inside it, so running npm update on your app won't apply it. You need to replace the Node.js executable, or the container image that carries it.
| What you changed | What that alone doesn't tell you |
|---|---|
| The app's npm packages | Whether the server's Node.js executable changed |
| Node.js on a developer laptop | Whether production servers and containers changed |
| A container configuration file | Whether a new image was built and actually deployed |
| A line selected in a hosting dashboard | Whether the running service picked up the fixed package |
- List the servers, containers and build environments running Node.js.
- Obtain a fixed package for each and test app compatibility.
- Replace executables or images, then restart or redeploy as required.
- Check the running version and real application functions again.
For that last check, run through the features this release touches, such as login, API responses, outbound HTTPS calls and handling compressed responses.
The cat asks Q&A
- The researcher
How do I find out which version is actually running on the server?
Pocket NotebookAsk in the place where the service runs. For a container, run
node --versioninside it; for a managed host, look at the provider's dashboard or deploy log. The number in your laptop terminal is just the Node.js that terminal picked. - The researcher
If the notice says RCE, does that mean our server has already been broken into?
Pocket NotebookNo. The notice announces a flaw and its fix; whether anyone actually got in is something you find out from logs and access records. Installing the fix won't tell you what happened before.
To close
Before you update
These releases only help where Node.js actually runs. Go through your servers, containers and build environments one by one, and move each to the fixed release on the line it already uses. If you're on an end-of-life line like 20.x, there's no fixed version this time, so start planning the move to a supported line.
The PHP security fix article covers the same split between application and runtime updates.
Sources
- Official security noticenodejs.org
- 22.23.4 releasenodejs.org
- 24.22.1 releasenodejs.org
- 26.12.1 releasenodejs.org
- release schedulegithub.com
- Official compressed-response examplenodejs.org
- MITRE’s out-of-bounds write explanationcwe.mitre.org