
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
n8n 2.42.0 - n8n GmbH
GHSA-j4p8-h8mh-rh8q hat n8n-nodes-base.code auf den JS-Task-Runner-Child verschoben. Der Produktions-Spawn fügt --disallow-code-generation-from-strings und --disable-proto=delete hinzu. Übrig bleibt der Rest der Nodes, die 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. Workflow-JSON-Speichern/-Import löst den Typ weiterhin auf. Das Standard-NODES_EXCLUDE umfasst nur Execute Command und Local File Trigger. Der Ausführungspfad ist ein In-Process-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 | High: 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. Multi-Tenant-Mitglied zu Instanz-Übernahme. Keine 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 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 in dieser Welle sind auf diesem Pin geschlossen. Code war nicht fertig.
Die Breaking-Change-Regeln von v3 markieren Function / FunctionItem bereits als entfernt. Auf 2.42.0 sind sie Überbleibsel, keine beabsichtigte Langzeit-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 Instanz-Eigentümer), n8n-nodes-base.function importiert, 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 hidden/unknown 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
n8n-nodes-base.function, n8n-nodes-base.functionItem und @n8n/n8n-nodes-langchain.code zum Standard-NODES_EXCLUDE hinzufügen oder sie durch JsTaskRunnerSandbox leiten, so wie Code v2 es bereits tut. Palette-hidden reicht nicht.
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.