Skip to main content
Each scenario below is a self-contained E2E test that demonstrates an attack against Node-RED and verifies that Sentinel blocks it. All 33 automated tests pass on Node-RED 4.1.7. Demo 21 is browser-only and requires manual verification.

E2E test results

#DemoResultNode-RED
01Monkey Patching4.1.7
02Hook Injection4.1.7
03Credential Theft4.1.7
04Wire Manipulation4.1.7
05Direct Receive Injection4.1.7
06Express Middleware4.1.7
07EventEmitter Hijack4.1.7
08Node Enumeration4.1.7
09Prototype Pollution4.1.7
10Flow File Tampering4.1.7
11Message Provenance4.1.7
12Settings.js Tampering4.1.7
13Sentinel Source Tampering4.1.7
14Express Route Backdoor4.1.7
15Config Node Z-Forgery4.1.7
16Symbol Property Bypass4.1.7
17EventEmitter Enumeration4.1.7
18Deep Stack Bypass4.1.7
19HTTP Route Deletion4.1.7
20Child Process Exec4.1.7
21SW Fetch Interception
22FS Read4.1.7
23Process Env Exfiltration4.1.7
24Process Exit DoS4.1.7
25VM Sandbox Escape4.1.7
26Worker Thread Escape4.1.7
27Network Socket Exfiltration4.1.7
28Registry Type Hijack4.1.7
29Settings Mutation4.1.7
30Comms Publish Spoofing4.1.7
31Context Permissions4.1.7
32Flows Inject4.1.7
33Node Event Hijack4.1.7
34Config Node Credentials4.1.7
Demo 21 (SW Fetch Interception) is browser-only — it requires manual verification via the interactive start script and cannot be verified in automated CI.

Scenarios by category

Attacks that modify the Node-RED runtime itself — patching functions, injecting hooks, or polluting shared prototypes.
#DemoAttack vector
01Monkey PatchingOverwrites Node-RED core functions at runtime
02Hook InjectionRegisters malicious onSend/onReceive hooks
09Prototype PollutionPollutes Object.prototype to affect all objects
12Settings.js TamperingModifies settings.js at runtime to inject capability grants
13Sentinel Source TamperingPatches Sentinel’s preload.js on disk to disable protection
28Registry Type HijackCalls registerType('inject', ...) to silently replace a built-in node type
29Settings MutationReads or writes RED.settings to extract the credential secret or add backdoors
Attacks that read decrypted credentials, environment variables, or other secrets from the running process.
#DemoAttack vector
03Credential TheftReads decrypted credentials from live node instances
22FS ReadReads settings.js via require('fs') to extract the credential secret
23Process Env ExfiltrationReads process.env to harvest injected secrets and API keys
34Config Node CredentialsExplores open, restricted, and locked config-node credential access
Attacks that send data out of the process over network channels.
#DemoAttack vector
21SW Fetch InterceptionBrowser-only: editor script uses fetch() to exfiltrate data; Service Worker blocks it
27Network Socket ExfiltrationCreates a raw TCP socket to bypass the HTTP URL allowlist
30Comms Publish SpoofingPushes fake notifications to the editor via RED.comms.publish()
Attacks that run arbitrary code outside Sentinel’s guarded context.
#DemoAttack vector
20Child Process ExecSpawns a shell command via child_process to execute arbitrary OS commands
24Process Exit DoSCalls process.exit() from a message handler to kill the runtime
25VM Sandbox EscapeUses require('vm') to run code outside Sentinel’s Module._load hooks
26Worker Thread EscapeSpawns a worker thread whose module loader is invisible to Sentinel
Attacks that manipulate the flow graph, the HTTP server structure, or the identity of nodes.
#DemoAttack vector
04Wire ManipulationRewires flow connections to exfiltrate data
05Direct Receive InjectionBypasses the auth chain via node.receive()
06Express MiddlewareInstalls rogue HTTP middleware on the admin API
10Flow File TamperingModifies the flows file on disk
11Message ProvenanceDetects and blocks injected messages via HMAC tagging
14Express Route BackdoorRegisters a hidden admin API route via httpAdmin.get()
15Config Node Z-ForgeryFakes config-node identity to bypass credential access rules
19HTTP Route DeletionDeletes existing Express routes to disable authentication endpoints
31Context PermissionsReads or writes another node’s context store without a grant
32Flows InjectInjects a malicious node into the running flow via the flows API
Attacks that exploit Node-RED’s internal event bus or per-node EventEmitter to spy on or silence other components.
#DemoAttack vector
07EventEmitter HijackIntercepts internal Node-RED events
08Node EnumerationMaps every node in the runtime via eachNode()
16Symbol Property BypassUses Symbol-keyed properties to evade proxy guard interception
17EventEmitter EnumerationEnumerates all RED.events listeners to map internal runtime wiring
18Deep Stack BypassChains anonymous wrappers to push the malicious frame outside the guard window
33Node Event HijackSpies on or silences another node’s input handler via EventEmitter APIs

Build docs developers (and LLMs) love