
Proof-of-Concept und Lab für einen Sandbox-Escape in n8n 2.42.0: Versteckte Function/FunctionItem-Knoten führen JS im Hauptprozess aus und ermöglichen authentifizierten Mitgliedern Host-RCE.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · n8n-function-vm2
Write-up: https://abraxaslabs.tech/research/n8n-function-vm2
n8n 2.42.0 - n8n GmbH
GHSA-j4p8-h8mh-rh8q hat n8n-nodes-base.code auf den JS-Task-Runner-Child-Prozess verschoben. Der Produktions-Spawn fügt --disallow-code-generation-from-strings und --disable-proto=delete hinzu. Übrig bleibt das, was sie versteckt statt verschoben haben. Function.node.ts ist hidden: true. FunctionItem ebenfalls. LangChain Code ebenfalls. Das Ausblenden in der Palette ist nur ein UI-Flag. Beim Speichern/Importieren von Workflow-JSON wird der Typ weiterhin aufgelöst. Das Standard-NODES_EXCLUDE umfasst nur Execute Command und Local File Trigger. Der Ausführungspfad ist ein prozessinternes vm2 NodeVM 3.12.2 im n8n-Hauptprozess.
Ein Standard-Mitglied, das einen Workflow erstellen kann, kann JS im n8n-Hauptprozess ausführen. Versteckt ist keine ACL.
| ID | noch keine CVE |
| CWE | CWE-94, CWE-269 |
| CVSS | Hoch: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| Produkt | n8n |
| Betroffen | bis 2.42.0 (86c23326); Überbleibsel von GHSA-j4p8 |
| Auth | authentifiziertes Mitglied mit Workflow-Erstellen/Importieren/Ausführen |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Als Standard-Mitglied einen Workflow importieren oder erstellen, dessen Node-type n8n-nodes-base.function (oder functionItem oder @n8n/n8n-nodes-langchain.code) ist, und ihn ausführen. Das JS läuft im n8n-Hauptprozess.
Das ist Host-RCE unter der n8n-UID: Instanz-Geheimnisse, der Credential-Ciphertext anderer Benutzer auf der Festplatte, die DB. Von Multi-Tenant-Mitglied zu Instanz-Übernahme. Kein OS-LPE. Nicht unauthentifiziert. Code v2 auf derselben Instanz sieht process nicht auf diese Weise.
Gleiches Produkt, verwandtes Überbleibsel: Databricks path join.
Ich habe zuerst die GHSA-Welle vom 16. September 2026 gelesen, dann zehn Jagden auf dem Tag [email protected]. Expression-Sandbox, Code/Function/vm2, Credentials, Webhooks, HTTP/SSRF, Git-Node, Community-Pakete, Auth/SSO, Node-Injection, öffentliche API. Die meisten Highs dieser Welle sind auf diesem Pin geschlossen. Code war nicht abgeschlossen.
Die Breaking-Change-Regeln von v3 markieren Function / FunctionItem bereits als entfernt. Auf 2.42.0 sind sie ein Überbleibsel, keine beabsichtigte langfristige Sandbox. Function injiziert außerdem this.helpers, einschließlich Helper, die der JS-Runner als nicht unterstützt auflistet. Ich brauchte kein öffentliches vm2-Gadget, um die Prozessgrenze zu beweisen.
Ich habe ein unverändertes n8nio/n8n:2.42.0 aufgesetzt, ein Mitglied registriert (nicht den Instanz-Eigentümer), n8n-nodes-base.function importiert und ausgeführt. Function pid=7 ist die n8n-Haupt-PID. Dasselbe JS in Code v2: hasProcess: false. Task-Runner-Child ist PID 26. Witness N8N-FUNCTION-VM2-WITNESS.
Bereits dokumentierte Irrwege: Function-Typ als versteckt/unbekannt abgelehnt (dann ist der Node tatsächlich ausgeschlossen); Function-PID gleich dem Task-Runner-Child (dann ist er bereits verschoben); Code v2 sieht process (dann ist der Runner nicht die Kontrolle); ein vm2-Exploit-Gadget, eine Reverse Shell, OS-LPE. Theater. Der Witness ist Haupt-PID vs. hasProcess: false.
cd lab
./run.sh
Ziel nur http://127.0.0.1:18201. Standard NODES_EXCLUDE. Angreifer ist ein Mitglied.
authenticated-as=member
function-fields pid=7 witness=N8N-FUNCTION-VM2-WITNESS
code-fields hasProcess=False pid=None
compare function_pid=7 code_pid=None main_pid=7 runner_pid=26 who=member
SUCCESS N8N-FUNCTION-VM2 who=member function_pid=7 code_pid=None main_pid=7 runner_pid=26 N8N-FUNCTION-VM2-WITNESS
Fügen Sie n8n-nodes-base.function, n8n-nodes-base.functionItem und @n8n/n8n-nodes-langchain.code zum Standard-NODES_EXCLUDE hinzu oder leiten Sie sie durch JsTaskRunnerSandbox um, so wie es Code v2 bereits tut. Die Palette-Einstellung hidden reicht nicht aus.
Function.node.ts · Code.node.ts · nodes.config.ts · task-runner-process-js.tsGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.