Running Node-RED and unsure whether the instance can be reached without a login? WZ-IT checks Node-RED instances for reachability and configuration, sets up adminAuth and access through a VPN, and operates Node-RED with monitoring and maintenance, see Node-RED, IoT and CVE monitoring. Book a meeting
On 11 August 2026, Siemens published the advisory SSA-834709 on missing authentication in Node-RED on SIMATIC IoT2050 devices, with the identifier CVE-2026-58115 and CVSS 10.0. On 2 November 2026, VulnCheck reported that a honeypot had recorded a complete attack on 30 October: a single request to the admin API submitted a flow meant to download and start a Linux bot. Media such as The Register reported from 2 November.
The reports blur two things. The identifier belongs to a Siemens product. The observed attack, however, hits Node-RED instances without adminAuth, according to VulnCheck. This article separates the two using the primary sources, gives versions, ratings and exploitation status in tables, and provides check commands and a configuration example for administrators. All information reflects 9 November 2026.
Table of Contents
- The vulnerability at a glance
- Core flaw or product flaw: what the sources say
- Affected devices and fixed version
- What VulnCheck observed
- Exploit status and KEV
- Which Node-RED installations are at risk
- Check commands for administrators
- Setting up adminAuth in settings.js
- Keeping the editor off the public internet
- Signs of compromise
- Checklist: hardening Node-RED
- Our approach at WZ-IT
- Further guides
The vulnerability at a glance
| Attribute | Value |
|---|---|
| Identifier | CVE-2026-58115 |
| Assigned by | Siemens ProductCERT |
| Advisory | SSA-834709, title: Missing Authentication Vulnerability in Node-RED on SIMATIC IoT2050 with Industrial OS |
| Published | 11 August 2026; revision V1.1 of 4 November 2026 (affected products list, title and summary clarified) |
| Severity | critical, CVSS 3.1 10.0 and CVSS 4.0 10.0 (rated by Siemens) |
| CVSS 3.1 vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H |
| CWE | CWE-306, Missing Authentication for Critical Function |
| Precondition | network access to the Node-RED HTTP interface, no login required |
| Impact | creating own flows and code execution on the device with the highest privileges |
| Affected | four SIMATIC IoT2050 models running Industrial OS with Node-RED installed, versions below V4.3.4-1 |
| Fixed | V4.3.4-1 or later |
| NVD status | Awaiting Analysis (the CVSS scores come from Siemens) |
| Exploitation | observed by VulnCheck since 30 October 2026 |
| CISA KEV | not listed (catalog version 2026.11.06) |
Sources: Siemens SSA-834709, NVD CVE-2026-58115, VulnCheck.
The vector describes a flaw that can be exploited over the network without privileges and without user interaction. S:C (Scope Changed) means, per the CVSS 3.1 specification, that the vulnerability can affect resources in components beyond its own security scope. Siemens rated the flaw this way.
Core flaw or product flaw: what the sources say
Whether CVE-2026-58115 is a flaw in Node-RED itself is answered differently by the sources on three levels.
| Level | Finding | Evidence |
|---|---|---|
| CVE record | Product CVE from Siemens. Only four SIMATIC IoT2050 models "running Industrial OS with Node-RED installed" are named, with versions below V4.3.4-1. There is no version range for Node-RED itself. | Siemens, NVD |
| Node-RED project | We found no CVE and no security advisory from the project for this case; the repository list holds only two entries from 19 February 2021. Releases 5.0.9 and 4.1.17 of 21 October 2026 contain no change that enables a login by default. The documentation states: "By default, the Node-RED editor is not secured". | GitHub advisories, changelog, release 4.1.17, docs |
| Observed attacks | VulnCheck: "Node-RED instances without adminAuth are being found and exploited automatically". The attack runs through the admin API (POST /flows). VulnCheck has not observed exploitation against Siemens products. |
VulnCheck |
Assessment. According to the sources, CVE-2026-58115 is a product flaw of Siemens: on the affected devices, authentication is not enforced on the Node-RED HTTP interface ("do not enforce authentication"). For the Node-RED core we found neither a fix nor an advisory, and the project documents the open state without configuration as the default. In our assessment this is not a weakness in the Node-RED code but an operating state: the attack works against instances whose admin API is reachable without a login, such as the delivery state without adminAuth, as soon as the attacker reaches the port. That VulnCheck uses the Siemens identifier for all such instances is VulnCheck's attribution and does not appear that way in the Siemens advisory. VulnCheck itself notes that its description rests on the canary signature and the observed traffic. We found no statement by the Node-RED project on the case.
The class of error is not new. For the Pilz IndustrialPI 4 industrial PC, the same pattern has applied since 2025: VDE-2025-045 states that authentication is not configured by default for the Node-RED server, likewise with CVSS 10.0. The following table separates the cases; FUXA is a different product that only embeds Node-RED as a plugin.
| Identifier | Product | Cause | Fix |
|---|---|---|---|
| CVE-2026-58115 | SIMATIC IoT2050 with Industrial OS | no authentication on the Node-RED HTTP interface | V4.3.4-1 or later |
| CVE-2025-41656 | Pilz IndustrialPI 4, firmware Bullseye up to 2024-08 | authentication on the Node-RED server not configured by default | vendor document from Pilz, see VDE-2025-045 |
| CVE-2026-25938 | FUXA 1.2.8 to 1.2.10 (SCADA/HMI) | authentication bypass with the Node-RED plugin enabled | FUXA 1.2.11 per the vendor advisory; Talos describes a follow-up flaw on the same path, CVE-2026-42922, fixed in FUXA 1.3.3 according to the vendor note in the Talos report |
Affected devices and fixed version
| Device | Order number | Affected | Fixed |
|---|---|---|---|
| SIMATIC IoT2050 Advanced | 6ES7647-0BA00-1YA2 | all versions below V4.3.4-1 with Industrial OS and Node-RED installed | V4.3.4-1 or later |
| SIMATIC IoT2050 Basic | 6ES7647-0BA00-0YA2 | as above | V4.3.4-1 or later |
| SIMATIC IoT2050 M.2 | 6ES7647-0BB00-1YA2 | as above | V4.3.4-1 or later |
| SIMATIC IoT2050 SM | 6ES7647-0CA00-1AA2 | as above | V4.3.4-1 or later |
Source: Siemens SSA-834709, revision V1.1 of 4 November 2026.
Five notes for classification:
- Only with Node-RED installed. The advisory applies to devices running Industrial OS with Node-RED. Without Node-RED installed, this attack surface does not exist.
- Product list. According to the revision history, revision V1.1 of 4 November clarified the list of affected products and adjusted the title and summary. The CISA notice ICSA-26-237-03, in contrast, lists only the IoT2050 Advanced. The current Siemens version with four models is authoritative.
- Version notation. Siemens writes V4.3.4-1; the machine-readable version (CSAF) and some databases use
4.3.4.1. The same release is meant. - Mitigations without an update. Siemens names two: uninstall Node-RED, or harden the installation per the Node-RED guide. Devices should also run only in a protected network, following the Siemens Industrial Security guidelines.
- What the advisory does not say. It gives no command to read the installed version and does not describe which login the fixed image presets. Determine the version from the Siemens product documentation; whether access is protected after the update is shown by the check commands below.
What VulnCheck observed
VulnCheck describes the observation in the report Exploitation Targeting Node-RED (2 November 2026, updated 1 November). The data comes from VulnCheck's canary telemetry, a honeypot infrastructure.
| Date | Event |
|---|---|
| 11 Aug 2026 | Siemens publishes SSA-834709 |
| 27 Oct 2026 | VulnCheck releases detection artifacts for customers (exploit PoC, version scanner, detection rules) |
| 30 Oct 2026 | A canary records a complete attack, 80 days after the advisory; it is the first observation VulnCheck describes |
| 30 Oct to 1 Nov 2026 | 16 events against this CVE from the same address 4.201.105.116 (AS8075, Microsoft, geolocated to Brazil) |
| 1 Nov 2026 | VulnCheck adds further payloads |
| 2 Nov 2026 | VulnCheck publishes the report |
How the attack works. A single POST /flows (user agent curl/8.5.0) delivers a flow in three parts: an empty tab, an inject node that fires once after one second, and an exec node. The exec node runs whatever a base64-encoded string contains, so simple filters for wget or curl in the request body find nothing. The canary answered like a vulnerable instance, with HTTP 200 and a new revision hash; that is why the VulnCheck signature records the event as a successful exploit. The sequence follows from the decoded command; the report does not show a download or an execution on the canary.
| Payload | Command according to VulnCheck | Traces |
|---|---|---|
| Bot | downloads bot-linux-amd64 from 85.215.73.250:8080, saves it as /dev/shm/.b, makes it executable and starts it with setsid, falling back to nohup |
/dev/shm/.b (memory file system, gone after a host reboot) |
| Script | downloads wget.sh from the same address to /tmp/.s and runs it |
/tmp/.s |
| Second server | downloads /.sys_update from 45.194.90.57:38472, saves it as /tmp/.kworker (mimics a kernel thread) and starts it with nohup |
/tmp/.kworker |
| Backdoor | no download; a flow with an HTTP In endpoint (such as /cmd or a random path), a function node and an exec node with addpay, which later runs commands passed as a query parameter |
flow in the flow configuration, survives restarts |
What is unknown. VulnCheck retrieved neither the bot file nor wget.sh or .kworker. Whether they are a cryptominer, a DDoS bot, a reverse shell or something else is open. The report gives no hashes. According to VulnCheck, the same address produced 125 hits over recent days against eight CVEs in Apache Solr, Camunda, Gitea, MLflow, Traefik, Joomla and Node-RED; VulnCheck reads this as opportunistic mass scanning rather than a targeted attack, and stresses that an address in the Microsoft cloud says little about the operator.
Exploit status and KEV
| Question | Status 9 November 2026 | Source |
|---|---|---|
| Exploitation observed | yes, by VulnCheck canaries since 30 October 2026 | VulnCheck |
| Exploitation against Siemens devices observed | no, not observed according to VulnCheck | VulnCheck |
| VulnCheck KEV | listed | VulnCheck |
| CISA KEV | not listed; catalog version 2026.11.06 of 6 November 2026, checked on 9 November | CISA KEV |
| Public exploit | yes: a public proof-of-concept script for this CVE is on GitHub (as of 4 November 2026); we have not tested whether it works against a real Siemens image. The attack itself is a single standard call to the documented admin API | GitHub, admin API |
| CISA rating in the NVD record | SSVC of 12 August 2026: exploitation none, automatable yes, technical impact total (before the observations) | NVD |
| Siemens note on exploitation | none in the advisory | Siemens |
None of the sources checked gives figures for openly reachable instances, and we have no scan data of our own. A statement such as "thousands of exposed instances" is therefore not substantiated.
Which Node-RED installations are at risk
| Situation | Affected per CVE record | Attackable via the observed route | Action |
|---|---|---|---|
| IoT2050 with Industrial OS and Node-RED, version below V4.3.4-1 | yes | yes, if the port is reachable and no login applies | update to V4.3.4-1 or later, restrict network access, harden or uninstall Node-RED |
| IoT2050 with V4.3.4-1 or later | no | verify with the check commands | check login and reachability |
| Own installation (Linux, Docker, Raspberry Pi, Windows) without adminAuth, port reachable from the network | no, not in the CVE | yes, unless another access control sits in front | set adminAuth, restrict reachability |
| Installation with adminAuth | no | no, as long as the configuration grants no anonymous permissions: the admin API requires a token; a configured anonymous default user (default) gets the permissions set there, read access with read, write access as well with * |
check the default user and its permissions, still check httpNodeAuth and network access |
| Installation without adminAuth, on 127.0.0.1 only | no | not directly from outside, but for every process on the host and via any proxy or tunnel that forwards to the port | set adminAuth |
Installation without adminAuth, but admin API disabled (httpAdminRoot: false) or protected by an upstream access control |
no | not via the observed route, as long as that control holds | test the control from outside, set adminAuth as well |
| Node-RED as part of a third-party product (SCADA, HMI, gateway) | depends on the vendor | depends on configuration | read vendor notes, check the product for login |
Three assumptions that do not hold:
- "It is a Node-RED bug, so an update helps." Releases 5.0.9 and 4.1.17 do not change the default; the login has to be configured.
- "The instance is behind a firewall." That narrows the field to hosts with network access but does not protect against every machine on the same network. With Docker, published ports also bypass ufw firewall rules (see below).
- "A changed editor path protects."
httpAdminRootmoves the paths but is not access control.
Check commands for administrators
Run all commands only against your own systems. The output shows how the instance stands on the network.
1. Which address does Node-RED listen on?
sudo ss -tlnp | grep 1880
If the output shows 0.0.0.0:1880, *:1880 or [::]:1880, the process listens on all interfaces. With 127.0.0.1:1880 it is directly reachable locally only; a proxy or tunnel on the host can still pass it on. Port 1880 is the default (uiPort); if it was changed, use your own number.
2. Docker: how is the port published?
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}'
Under Ports, 0.0.0.0:1880->1880/tcp or [::]:1880->1880/tcp means the port is published on all host interfaces. 127.0.0.1:1880->1880/tcp is reachable from the host only from Docker 28.0.0 onwards (for older versions see below). Docker calls published ports "insecure by default" (Docker, port publishing) and diverts the traffic before the ufw rules, so a ufw block does not protect published ports (Docker, packet filtering).
3. Is the login active?
curl -s --max-time 5 http://127.0.0.1:1880/auth/login; echo
curl -s -o /dev/null -w '%{http_code}\n' --max-time 5 http://127.0.0.1:1880/flows
According to the admin API, /auth/login returns {} when no login is active. With an active login you get an object with "type":"credentials", or "type":"strategy" when signing in through Passport strategies (source code). GET /flows answers HTTP 200 without a token if the instance is open or an anonymous default user with read permission is set up (documentation), and HTTP 401 if a token is required. The status code alone does not show which component is answering: an upstream proxy can return 401 as well. The combination of /auth/login and /flows is what counts. The check deliberately contains no deploy attempt (POST /flows). If the instance sets httpAdminRoot, the path follows it, for example /admin/flows.
4. The same check from another machine on the network. Replace 127.0.0.1 with the server's address. If /auth/login returns {} from there, the admin API is reachable without a Node-RED login at least from that machine; whether the same applies to other source addresses depends on upstream controls such as a firewall or proxy. If /flows returns HTTP 200 and the response is a JSON array of node objects, at least read access is possible; a 200 status alone can also come from a proxy or fallback page. A small script checks several instances in turn:
#!/usr/bin/env bash
# Checks one of your own Node-RED instances: is the admin API reachable without a login?
# Usage: ./check-nodered.sh http://192.0.2.10:1880
BASE="${1:-http://127.0.0.1:1880}"
login=$(curl -s --max-time 5 "$BASE/auth/login")
echo "Login scheme (GET /auth/login): ${login:-no response}"
code=$(curl -s -o /dev/null -w '%{http_code}' --max-time 5 "$BASE/flows")
echo "GET /flows without token: HTTP $code"
case "$code" in
200)
if [ "$login" = "{}" ]; then
echo "-> OPEN: no login active, flows readable, deploy without login to be expected"
else
echo "-> flows readable without token, login active: check the anonymous default user and its permissions"
fi ;;
401) echo "-> token required (adminAuth or an upstream access control)" ;;
000) echo "-> not reachable" ;;
*) echo "-> unexpected, check the path prefix (httpAdminRoot) and proxy" ;;
esac
We tested the script against a local test server that reproduces the responses the admin API documentation describes: open instance, active login, anonymous read access, status 401 without a login scheme, unexpected status and unreachable server. A real Node-RED instance was not part of the test.
Setting up adminAuth in settings.js
The adminAuth setting protects the editor and the admin API. In the bundled settings.js it is commented out (template in the repository). With the script-based installation the file is in the user directory ~/.node-red/settings.js, in the official Docker image at /data/settings.js. Which file Node-RED loads is shown at startup in the log line "Settings file".
Step 1: generate a password hash.
node-red admin hash-pw
The command exists from Node-RED 1.1.0 and asks for the password. In a Docker container it runs as the Docker image describes:
docker exec -it mynodered npx node-red admin hash-pw
The value printed is a bcrypt hash and starts with $2a$ or $2b$. The example hashes in the documentation belong to known passwords and must not be reused.
Step 2: add the block to settings.js. The following configuration follows the official guide; hashes are placeholders:
module.exports = {
uiPort: process.env.PORT || 1880,
// Accept the whole HTTP listener (editor, admin API, HTTP In, dashboard) only on the local host
// or a VPN address (omit in a Docker container, see below)
uiHost: "127.0.0.1",
// Editor and admin API: enforce login
adminAuth: {
type: "credentials",
users: [
{
username: "admin",
password: "$2b$08$HASH-FROM-hash-pw-GOES-HERE",
permissions: "*"
},
{
username: "readonly",
password: "$2b$08$OTHER-HASH-FROM-hash-pw",
permissions: "read"
}
],
sessionExpiryTime: 86400
},
// HTTP In routes and node-red-dashboard: separate user, separate hash
httpNodeAuth: { user: "dashboard", pass: "$2b$08$THIRD-HASH-FROM-hash-pw" }
};
In an existing settings.js, only add or uncomment the uiHost, adminAuth and httpNodeAuth lines; the rest stays. In a Docker container uiHost is omitted (see below). We loaded the example's syntax with Node.js and checked it; we did not test it with a running Node-RED instance.
Step 3: restart Node-RED.
| Deployment | Restart |
|---|---|
| Installation via Raspberry Pi script | node-red-restart or sudo systemctl restart nodered |
| Docker | docker restart mynodered |
| Other systemd service | sudo systemctl restart <service-name> |
Step 4: verify the result. GET /auth/login shows "type":"credentials", and GET /flows returns HTTP 401 without a token (check command 3) as long as no anonymous default user is set up. If no login dialog appears when opening the editor, usually a different file was edited from the one Node-RED loads, or the service was not restarted.
| Setting | Protects | Does not protect |
|---|---|---|
adminAuth |
editor and admin API (/flows, /settings, /nodes and more) |
HTTP In routes, dashboard |
httpNodeAuth |
HTTP In routes and, per the template, node-red-dashboard via Basic Auth | editor and admin API |
httpStaticAuth |
static content from httpStatic |
editor and admin API |
uiHost |
limits the address of the whole HTTP listener (editor, admin API, HTTP In routes, dashboard) | the login itself |
https |
encrypts the transmission of the login | access as such |
httpAdminRoot: false |
disables the HTTP endpoints of the admin API and the editor | the flow file and programmatic access to the runtime (embedded applications) |
disableEditor: true |
disables only the editor UI | the admin API stays active |
Source: Node-RED, Securing Node-RED and configuration. With permissions: "read" you can create users with read-only access; with default: { permissions: "read" } in adminAuth, everyone without a login additionally gets this read access, which the guide describes as an option. The permissions of the default user are freely configurable; with permissions: "*", everyone without a login would also have write access. Upstream access controls such as a reverse proxy or httpAdminMiddleware can protect the admin API as well; adminAuth is the standard solution the guide describes. Anyone who wants to sign in to the editor through OAuth or OpenID will find the variant with Passport strategies in the guide.
Keeping the editor off the public internet
adminAuth is the first layer. The second is that the editor cannot be reached from the internet at all. Usually only a small group of administrators needs the admin interface.
-
Bind to localhost or a VPN address only. With
uiHost: "127.0.0.1", Node-RED listens locally only, and that applies to the whole HTTP listener: HTTP In routes and dashboards are then reachable locally only as well. If the editor should be reachable over a private network,uiHostcan point to the host's VPN address. The default is0.0.0.0, that is, all IPv4 interfaces (configuration documentation). In a Docker containeruiHoststays unchanged (see the next point). -
Publish the Docker port on localhost only. Docker forwards published ports to the container's address in the default bridge network; a process that listens only on
127.0.0.1inside the container does not accept these connections. Node-RED therefore stays on0.0.0.0inside the container, and the restriction lies solely in the host address of the-pflag. Instead of-p 1880:1880, give the port with an address:docker run -d -p 127.0.0.1:1880:1880 -v node_red_data:/data --name mynodered nodered/node-redIn Compose the entry is
"127.0.0.1:1880:1880"underports. In Docker versions before 28.0.0, machines in the same layer 2 segment could also reach ports published to localhost (Docker, port publishing); on older Docker hosts an update is advisable. -
Access through a mesh VPN or WireGuard. Administrators then reach the editor only with a device signed in to the private network. The pattern is described on the pages for VPN and secure access and NetBird and in the article Replacing Your VPN: From Classic VPN to Zero Trust and Mesh VPN.
-
Reverse proxy for HTTP In paths only. If webhooks or a dashboard have to be public, only the paths meant for that (
httpNodeRoot, such as/ui) belong behind the proxy, withhttpNodeAuthor a token in the flow. The admin API paths (/flows,/auth,/settings,/nodes) stay outside. The editor keeps a WebSocket connection to the runtime open (source code comms.js); behind a proxy, it must pass that through. -
Firewall at the perimeter. Block port 1880 at the network edge and test the result from outside rather than just reading the rule.
-
No unnecessary privileges. Run Node-RED as its own user rather than root. The same applies to the container: where not needed, no
-u rootand no mounted Docker socket.
These layers do not replace adminAuth but complement it. If the VPN and adminAuth are configured independently of each other, a fault in one of the two layers alone is usually not enough for access; this is not a guarantee.
Signs of compromise
The checks follow the traces in the VulnCheck report. Not finding them proves nothing: attackers can change file names and addresses, and VulnCheck does not know what the malware does.
| Indicator | Check |
|---|---|
| exec nodes or HTTP In endpoints nobody created | search the flows file (command below) |
exec node whose command passes base64-encoded content to the shell, or uses wget and curl |
flows file, editor |
HTTP In endpoint /cmd or a random path, connected to a function node and an exec node with addpay |
flows file, editor |
Files /dev/shm/.b, /tmp/.s, /tmp/.kworker |
ls -la /dev/shm/.b /tmp/.s /tmp/.kworker 2>/dev/null |
Processes from /dev/shm or named .kworker (.sys_update is, per the report, the file name on the download server) |
ps -eo pid,user,args and filter for the names (command below) |
Connections to 85.215.73.250 (port 8080) and 45.194.90.57 (port 38472) |
connection logs of firewall and proxy, ss -tnp; the downloads use IP addresses, so DNS logs do not show them |
Requests from 4.201.105.116 |
reverse proxy, firewall or host logs |
| Unexpected modification time of the flows file | ls -l --time-style=long-iso ~/.node-red/flows.json (with Docker /data/flows.json) |
# List flows with command execution or incoming HTTP routes
jq -r '.[] | select(.type=="exec" or .type=="http in") | [.type, .id, (.command // .url // "")] | @tsv' ~/.node-red/flows.json
# Without jq
grep -n -E '"type": ?"(exec|http in)"' ~/.node-red/flows.json
# Traces from the VulnCheck report on the host
ls -la /dev/shm/.b /tmp/.s /tmp/.kworker 2>/dev/null
ps -eo pid,user,args | grep -E '/dev/shm|\.kworker|\.sys_update' | grep -v grep
sudo ss -tnp | grep -E '85\.215\.73\.250|45\.194\.90\.57'
With Docker the file sits in the volume; its content can be evaluated with docker exec mynodered cat /data/flows.json | jq .... The paths apply to the default settings; flowFile and userDir in settings.js and Node-RED projects can move them. An exec node is not suspicious in itself, and many flows use it legitimately. Exec nodes without a known purpose, with encoded commands, or behind an HTTP In endpoint stand out.
If traces exist or misuse cannot be ruled out:
- Disconnect the instance from the network and secure the flows file, logs and process list before changing anything.
- Treat all credentials readable on the host as compromised and rotate them: access from flows (MQTT, databases, APIs), SSH keys, cloud tokens. This is our assessment; the sources give no list.
- Rebuild the host or container from a clean state and check the flows node by node before reusing them. An update alone does not remove injected flows.
- Set adminAuth and the network restriction before the instance goes back online.
- Check reporting duties. Under Art. 33 GDPR, the controller must report a personal data breach to the supervisory authority without undue delay and, where feasible, within 72 hours of becoming aware of it, unless it is unlikely to result in a risk to the rights and freedoms of natural persons; a processor notifies the controller of a breach without undue delay. Where a high risk is likely, the controller must also notify the data subjects without undue delay under Art. 34 GDPR, subject to the exceptions in Art. 34(3) (EDPB). Entities within the scope of the NIS 2 Directive submit for significant incidents under Art. 23(4) an early warning without undue delay and within 24 hours of becoming aware of the incident, an incident notification within 72 hours of becoming aware of it (trust service providers: 24 hours), an intermediate report on request, and a final report not later than one month after the incident notification; if the incident is still ongoing at that point, a progress report follows, and the final report within one month of handling the incident. Scope and details depend on national implementing law. Which duty applies depends on the role (controller or processor), on whether personal data was affected, whether the entity is covered and how significant the incident is. The assessment in the individual case should be made with the data protection officer or legal counsel; responsibility stays with the party under the obligation.
Checklist: hardening Node-RED
| Area | Action | Relation to the flaw |
|---|---|---|
| Inventory | record all Node-RED instances, including edge devices, containers and instances inside third-party products | precondition of any check |
| Siemens | bring IoT2050 with Industrial OS and Node-RED to V4.3.4-1 or later, otherwise uninstall or harden Node-RED | direct: CVE-2026-58115 |
| Login | set adminAuth with a bcrypt hash, at least one admin account, read accounts with permissions: "read" |
observed attack route |
| Login | httpNodeAuth for HTTP In routes and node-red-dashboard |
separate attack surface |
| Network | uiHost to 127.0.0.1 or a VPN address (not in a container), Docker port as 127.0.0.1:1880:1880 |
narrows the circle of possible attackers |
| Network | block port 1880 at the perimeter and test from outside | protection against internet scans |
| Access | editor only over VPN; reverse proxy for HTTP In paths only | admin API not public |
| Transport | https or TLS at the proxy so logins do not travel in clear text |
protects the login |
| Operation | do not run Node-RED as root, no Docker socket in the container | limits the impact of an execution |
| Flows | document the exec and HTTP In nodes and compare regularly | can make injected flows visible |
| Credentials | limit credentials in flows to what is needed, do not reuse them | limits the damage |
| Monitoring | follow vendor advisories and Node-RED releases | CVE monitoring |
| Backups | back up the user directory regularly (Docker: the /data volume), at least flows, settings.js, flows_cred.json and its key (credentialSecret; a system-generated key belongs in the backup too), test restoration |
rebuild after an incident |
Our approach at WZ-IT
WZ-IT installs, hosts and operates Node-RED with monitoring, backups and maintenance and, within the IoT services, connects PLC and HMI systems. For a report like CVE-2026-58115 the work runs in five steps:
- Take inventory. Record Node-RED instances, versions, ports, container mappings and devices such as the IoT2050, including those another team set up.
- Check reachability. Use the commands above to establish whether admin API and editor are reachable without a login, from inside and from outside.
- Secure. Set
adminAuthandhttpNodeAuth, restrict binding and port mapping, and route access through a mesh VPN or WireGuard. For IoT2050 devices the procedure follows the Siemens advisory. - Check for traces. Review flows and host for the indicators; if suspicious, rotate credentials in a controlled way and rebuild the instance cleanly.
- Monitor continuously. Add instances to CVE monitoring, which evaluates vendor advisories alongside the NVD. A broader review of a server's configuration and access is provided by the server audit.
Support, consulting and implementation by WZ-IT.
Further guides
- Node-RED MQTT dashboard for sensor data, how Node-RED ingests and displays measurements.
- n8n Alternative: n8n, Activepieces and Node-RED Compared, licences, operations and security advisories of the three tools.
- ThingsBoard, Grafana & ChirpStack in the Modern IoT Stack, where Node-RED sits in IoT operations.
- CVE Monitoring for Self-Hosted Software, how vulnerabilities are tracked in a structured way.
- Replacing Your VPN: From Classic VPN to Zero Trust and Mesh VPN, access to internal services without public ports.
- LiteLLM Vulnerability: Check Versions and Harden the Gateway, another case in which a management interface has to be secured.
- IoT services from WZ-IT and Node-RED operations, the hubs for this topic.
- SSHole (CVE-2026-123158): check OpenSSH on Alpine - another current security case (as of November 2026)
- Linux kernel TCP flaw CVE-2026-98432: patch Proxmox, Debian, Ubuntu - another current security case (as of November 2026)
- APT vulnerability CVE-2026-109518 in Debian and Ubuntu - another current security case (as of November 2026)
- CWPdoor: check for the Control Web Panel backdoor - another current security case (as of November 2026)
Have your Node-RED instances checked? We establish which instances can be reached without a login, implement adminAuth and access over VPN, and add Node-RED to CVE monitoring. Book a meeting
Sources
- Siemens ProductCERT, SSA-834709 (CVE-2026-58115)
- NVD, CVE-2026-58115
- CISA, ICSA-26-237-03 Siemens SIMATIC IoT2050 Advanced
- CISA, Known Exploited Vulnerabilities Catalog
- VulnCheck, Exploitation Targeting Node-RED, a Tool Embedded in ICS Products
- The Register, Node-RED flaw exploited (2 November 2026)
- Node-RED Docs, Securing Node-RED
- Node-RED Docs, Runtime configuration
- Node-RED Docs, Admin API: GET /auth/login
- Node-RED Docs, Admin API: GET /flows
- Node-RED Docs, Admin API: POST /flows
- Node-RED Docs, Docker
- Node-RED Docs, Raspberry Pi
- node-red-docker, README
- Node-RED, settings.js (template)
- Node-RED, Security Advisories
- Node-RED, Changelog
- Node-RED, Release 4.1.17
- Node-RED, source code editor-api comms.js
- Node-RED, source code editor-api auth/index.js
- Docker Docs, Port publishing and mapping
- Docker Docs, Packet filtering and firewalls
- CERT@VDE, VDE-2025-045 Pilz IndustrialPI
- NVD, CVE-2025-41656
- NVD, CVE-2026-25938
- FUXA, Security Advisory GHSA-v4p5-w6r3-2x4f
- Cisco Talos, TALOS-2026-2419 (FUXA)
- NVD, CVE-2026-42922
- FIRST, CVSS v3.1 Specification Document
- EDPB, Data breaches
- EUR-Lex, Directive (EU) 2022/2555 (NIS 2)
- Siemens, Operational Guidelines for Industrial Security













