
دراسة تقنية لثغرة CVE-2025-68613 في n8n، تغطي الإصدارات المتأثرة، وسيناريو الاستكشاف المختبري، والتحليل الهجومي والدفاعي، واستراتيجيات التخفيف.
n8n هي منصة أتمتة سير عمل تُستخدم لربط الأنظمة والخدمات من خلال التدفقات المرئية وتعبيرات JavaScript.
CVE-2025-68613 هي ثغرة تنفيذ أوامر عن بُعد (RCE) حرجة، بتقييم CVSS 9.9، تؤثر على إصدارات متعددة من n8n. يحدث الخلل في معالجة تعبيرات JavaScript في سير العمل في الإصدارات المعرضة للخطر وغير المعزولة بشكل صحيح. وهذا يسمح للمستخدمين الموثوقين الذين لديهم صلاحيات التحرير بتنفيذ كود خارج السلوك المتوقع للتطبيق.
عمليًا، يمكن استغلال هذا الخلل لتنفيذ أوامر على الخادم حيث يعمل n8n، باستخدام صلاحيات التطبيق نفسه. تتراوح الإصدارات المتأثرة من 0.211.0 حتى الإصدارات السابقة للإصلاحات المطبقة في 1.120.4 و1.121.1 و1.122.0.
يوثق هذا المستودع CVE-2025-68613 تقنيًا، ويغطي سياق الثغرة والإصدارات المتأثرة والاستغلال وتدابير التخفيف الموصى بها.

يُنصح بتحديث الإصدار فورًا إلى 1.122.0 أو أحدث.
لإظهار الثغرة، يجب توفر الشروط التالية:
يحدث الخلل أثناء إنشاء وتنفيذ سير العمل، وليس قبل المصادقة.
الخطوة الأولى هي تسجيل الدخول إلى واجهة الويب الخاصة بـ n8n باستخدام مستخدم صالح.

تؤكد هذه الخطوة أن الهجوم ليس مجهولًا. تتطلب الثغرة مستخدمًا موثقًا.
بعد تسجيل الدخول، تحقق من أن المستخدم لديه صلاحيات لإنشاء سير العمل وتعديله.

هذا مهم لأن المستخدمين الذين يملكون هذا المستوى من الوصول فقط يمكنهم إدراج تعبيرات ديناميكية في سير العمل.
باستخدام المستخدم الموثق، أنشئ سير عمل جديدًا من البداية.

هنا يبدأ الاستخدام المشروع لوظائف n8n التي يمكن استغلالها في الإصدارات المعرضة للثغرة.
العقدة الأولى المضافة إلى سير العمل هي المشغل اليدوي (Manual Trigger).

ماذا تفعل هذه العقدة: تسمح بالتنفيذ اليدوي لسير العمل، وتُستخدم كنقطة بداية للتدفق.
في هذا السيناريو، تعمل فقط كنقطة دخول لتنفيذ سير العمل.
العقدة الثانية المضافة هي Edit Fields (Set).

ماذا تفعل هذه العقدة: تتيح هذه العقدة إنشاء أو تعديل أو الكتابة فوق حقول البيانات داخل سير العمل. وهي تقبل قيمًا ثابتة أو تعبيرات JavaScript يتم تقييمها وقت التنفيذ.
في هذه النقطة تحديدًا تظهر الثغرة.
داخل حقل القيمة في عقدة Edit Fields (Set)، أدخل تعبير JavaScript محاطًا بـ {{ }}، وهو التنسيق الذي يستخدمه n8n لتقييم التعبيرات الديناميكية.

مثال على الحمولة:
{{ (function(){
return this.process.mainModule
.require('child_process')
.execSync('id')
.toString()
})() }}
(function(){ ... })(): تعرّف دالة ذاتية الاستدعاء، مما يسمح بتغليف كل المنطق وإرجاع قيمة مباشرة إلى تعبير سير العمل.this.process: يصل إلى كائن process الداخلي في Node.js، الذي يكشف معلومات وموارد وقت التشغيل.process.mainModule: يسمح بالوصول إلى الوحدة الرئيسية للتطبيق، مما يتيح تحميل وحدات Node.js الداخلية الأخرى.require('child_process'): وحدة Node.js أصلية تسمح بإنشاء عمليات جديدة على نظام التشغيل وتنفيذ أوامر خارجية.execSync('id'): ينفذ أمرًا مباشرة على نظام التشغيل حيث يعمل n8n، باستخدام صلاحيات عملية التطبيق..toString(): يحول مخرجات الأمر المنفذ إلى نص، مما يسمح بعرض النتيجة في واجهة n8n.النتيجة المعروضة تؤكد أن الأمر تم تنفيذه على نظام التشغيل باستخدام صلاحيات عملية n8n، مما يمثل تنفيذ أوامر عن بُعد (RCE).
| الحالة | إصدار n8n | ملاحظة |
|---|
| ❌ متأثر | >= 0.211.0 | إدخال الآلية القابلة للاستغلال |
| ❌ متأثر | < 1.120.4 | عرضة للثغرة حتى التصحيح في فرع 1.120 |
| ❌ متأثر | < 1.121.1 | عرضة للثغرة حتى التصحيح في فرع 1.121 |
| ❌ متأثر | < 1.122.0 | عرضة للثغرة حتى التصحيح في فرع 1.122 |
| ✅ ثابت | 1.120.4 | تم تطبيق الإصلاح الرسمي |
| ✅ ثابت | 1.121.1 | تم تطبيق الإصلاح الرسمي |
| ✅ ثابت | >= 1.122.0 | تم تضمين الإصلاح افتراضيًا |