رأس القلم

التشريح النهائي لـ CVE-2025-68613: عندما يصبح محرك سير عمل n8n حصان طروادة

في المشهد الأمني الختامي لعام 2025، فإن الكشف عن CVE-2025-68613 (CVSS 10.0) على الصناعة بقوة السلاح الحركي. كأكثر أدوات أتمتة سير العمل مفتوحة المصدر شيوعًا في العالم, ن8 ن يدعم منطق العمل الأساسي لعدد لا يحصى من الشركات. ومع ذلك، فإن هذه الثغرة، التي تسمح للمهاجمين غير المصادق عليهم (أو ذوي الامتيازات المنخفضة) بتنفيذ تعليمات برمجية عشوائية، قد كشفت تمامًا عن نقطة الضعف المعمارية لمنصات "التعليمات البرمجية المنخفضة/غير البرمجية" الحديثة.

بالنسبة لكبار مهندسي الأمن والباحثين في الفريق الأحمر، فإن CVE-2025-68613 أكثر بكثير من مجرد "فشل في التحقق من الصحة". إنها دراسة حالة نموذجية في الاستغلال المشترك لـ وقت تشغيل Node.js الديناميكي, فشل نموذج قدرة الكائن فشلو تلوث النموذج الأولي.

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

CVE-2025-68613

تفكيك سطح الهجوم

يتمثل عرض القيمة الأساسية لـ n8n في "الاتصال". فهو يربط قواعد البيانات وخدمات البرمجيات كخدمة وواجهات برمجة التطبيقات الداخلية معًا عبر آلاف عقد التكامل. لتمكين المعالجة الديناميكية للبيانات، يسمح n8n للمستخدمين بتضمين تعبيرات JavaScript داخل العقد، وعادةً ما يتم تغليفها في {{ }} بناء الجملة.

قبل تفشي CVE-2025-68613، كان n8n يعتمد على Node.js الأصلي vm لعزل هذه الشيفرة التي يوفرها المستخدم.

لماذا Node.js vm?

العقدة.js vm تسمح بتجميع وتشغيل الشيفرة البرمجية ضمن سياق آلة افتراضية V8. وتوفر كائنًا عامًا معزولًا (Contextified Sandbox).

  • بشكل مثالي: لا يمكن للبرمجة الوصول إلى المتغيرات خارج صندوق الحماية.
  • الواقع: إن vm وحدة معترف بها على نطاق واسع في المجتمع الأمني على أنها "مكسور حسب التصميم.”

تحليل سطح الهجوم:

  1. نقاط الدخول: أي عقدة تقبل مدخلات التعبير (على سبيل المثال, مجموعة, الوظيفة, طلب HTTP العقد).
  2. تدفق التنفيذ: مدخلات المستخدم -> تحليل السلاسل -> vm.runInNewContext() -> التنفيذ.
  3. الخلل طالما أن أي كائن داخل صندوق الرمل يشير إلى كائن خارجي (على سبيل المثال، تمرير متغيرات بيئة المضيف عبر هذا السياق)، يمكن للمهاجم الاستفادة من خاصية جافا سكريبت تسلق السلسلة النموذج الأولي آلية للهروب من صندوق الرمل.

التعمّق التقني - من سلسلة النماذج الأولية إلى سلسلة النماذج الأولية إلى RCE

لفهم منطق الاستغلال في CVE-2025-68613، يجب على المرء أن يفهم المُنشئ في JavaScript.

يحتوي كل كائن في JavaScript تقريبًا على المُنشئ خاصية تشير إلى الدالة التي أنشأتها.

  • ({}).المُنشئ === الكائن
  • مُنشئ الكائن === الوظيفة

منطق الهروب الأساسي: هذا.المُنشئ.المُنشئ

في بيئة n8n المقيّدة، لا يمكن للمهاجم أن يستدعي مباشرةً طلب('عملية_فرعية'). ومع ذلك، فإن المهاجم يمتلك سياق التنفيذ الحالي: هذا.

  1. قفزة 1: هذا هو كائن السياق داخل صندوق الرمل.
  2. قفزة 2: هذا المنشئ هو الكائن مُنشئ داخل صندوق الرمل.
  3. قفزة 3 (حرجة): هذا.المُنشئ.المُنشئ يحل إلى المضيف الوظيفة مُنشئ.

لماذا يخرق ذلك صندوق الرمل؟ لأن محرك V8، عند التعامل مع تفاعلات الكائنات عبر السياق، يحل سلسلة المُنشئ إلى التعريف الخارجي إذا كان الكائن الجذر قد نشأ من الخارج.

بمجرد أن يحصل المهاجم على ملف المضيف الوظيفة مُنشئ، يمكنهم توليد دالة مجهولة ديناميكيًا تُنفَّذ في سياق المضيف. هذه الدالة المجهولة غير مقيدة بقيود صندوق الحماية ويمكنها الوصول إلى العملية الكائن.

بدائية الاستغلال الكامل

إن الحمولة التي أنشأها المهاجم ليست سلسلة بسيطة، بل هي جزء دقيق من كود JavaScript مصمم لإعادة بناء نظام تحميل وحدات Node.js.

جافا سكريبت

'//المرحلة الأولى: الحصول على مُنشئ دالة البيئة المضيفة Constructor's Function Constructor = this.constructor.constructor;

// المرحلة 2: إنشاء دالة ديناميكيًا تُرجع كائن "العملية" // يتم تنفيذ هذا الرمز في سياق المضيف، متجاوزًا صندوق الرمل const getProcess = ForeignFunction("إرجاع العملية");

// المرحلة 3: تنفيذ الدالة للحصول على مقبض العملية const proc = getProcess();

// المرحلة 4: الوصول إلى الوحدة الرئيسية للحصول على مقبض "الطلب" const require = proc.mainModule.require;

// المرحلة 5: تحميل 'child_process' وتنفيذ أوامر النظام تشكل النتيجة = require('child_process').execSync('id').toString()؛'

في ن8 ن {{ }} التعبير، يتم ضغط هذا المنطق في حقنة قاتلة من سطر واحد.

القتال والتعتيم - تجاوز الفلاتر الثابتة

في محاولات الدفاع المبكرة ضد CVE-2025-68613، حاولت بعض التصحيحات المؤقتة تصفية كلمات مفتاحية مثل عملية أو مُنشئ أو تتطلب استخدام regex.

ومع ذلك، بالنسبة للغة ديناميكية للغاية مثل JavaScript، فإن التصفية الثابتة غير مجدية.

متغير التعتيم أ: تسلسل السلاسل وترميزها

يستفيد المهاجمون من مرونة JavaScript في تقسيم أو ترميز الكلمات المفتاحية وتشفيرها، متجاوزين بذلك اكتشاف التوقيعات.

جافا سكريبت

{{ {{ // تجاوز اكتشاف "المُنشئ" هذا ['con'+'structor'] ['con'+'structor']( // تجاوز اكتشاف "عملية الإرجاع" 'إرجاع p'+'rocess'))() .mainModule.require('ch'+'ild_pr'+'ocess') .execSync('cat /etc/passwd') }}}

متغير التعتيم ب: الانعكاس والتوكيل

يستخدم المهاجمون المتقدمون Reflect.get للوصول ديناميكيًا إلى الخصائص، مما يجعل تحليل شجرة بناء الجملة المجردة (AST) صعبًا لتتبع سلسلة الاستدعاء.

جافا سكريبت

{{ {{ // استخدام Reflect للعثور على مفتاح المُنشئ ديناميكيًا const c = Reflect.get(هذا، Reflect.ownKeys(this).find(k => k.toString() === 'constructor'))؛ // تابع التنفيذ... }}

هذا يوضح أن مطابقة الرجعيات البسيطة لا يمكنها إصلاح CVE-2025-68613؛ يجب أن يعالج الإصلاح المشكلة الأساسية قيود قدرة الكائنات.

ما بعد الاستغلال-لماذا n8n هو الشاطئ المثالي

اختراق خادم n8n (الحصول على شل) هو مجرد البداية. في سلسلة قتل التهديدات المستمرة المتقدمة المتقدمة (APT)، يحمل n8n قيمة استراتيجية فريدة من نوعها.

حصاد بيانات الاعتماد

تقوم قاعدة بيانات n8n (عادةً SQLite أو PostgreSQL) بتخزين بيانات الاعتماد لجميع الخدمات المتصلة. أثناء تشفيرها، يمكن للمهاجم الذي يستخدم RCE قراءة مفتاح التشفير (عادةً في متغيرات البيئة أو ملفات التكوين)، وبالتالي فك التشفير:

  • مفاتيح مستخدم AWS IAM
  • مفاتيح واجهة برمجة تطبيقات Stripe / PayPal
  • سلاسل اتصال قاعدة بيانات الشركات
  • رموز سلاك/روبوتات سلاك/ديسكورد بوت

الحركة الجانبية

عادةً ما يتم نشر خوادم n8n في عمق الشبكة الداخلية ويُسمح لها بالوصول إلى واجهات برمجة التطبيقات الداخلية المختلفة. يمكن للمهاجمين استخدام خوادم n8n كـ وكيل SOCKS، أو تعديل عقد طلب HTTP الحالية مباشرةً لإرسال طلبات استقصائية إلى خدمات داخلية أخرى (مثل Jenkins و GitLab)، مما يؤدي إلى مسح الأصول الداخلية بشكل فعال.

المثابرة

يتم فحص ثنائيات البرمجيات الخبيثة التقليدية بواسطة حلول EDR. لكن إذا أنشأ أحد المهاجمين سير عمل "Cron" في n8n يعمل كل 5 دقائق وينفذ جافا سكريبت خبيثة، فإن هذا الباب الخلفي بدون ملفات. إنه يمتزج تمامًا بمنطق العمل العادي، مما يجعل من الصعب للغاية اكتشافه.

كتيب الفريق الأزرق-الكشف والدفاع

بالنسبة لفرق أمن المؤسسات (الفرق الزرقاء)، تتطلب مواجهة CVE-2025-68613 أكثر من مجرد تطبيق التصحيح الرسمي.

كشف توقيعات حركة المرور (SIEM/IDS)

مراقبة أجسام طلبات HTTP التي تحتوي على {{ التي تتضمن أيضًا كلمات رئيسية مثل المُنشئ, العملية, التنفيذأو تفرخ.

مثال على قاعدة YARA:

القاعدة DETECTECT_N8N_RCE_ATEMPT { التعريف: الوصف = "يكتشف محاولات حقن تعبيرات تستهدف n8n (CVE-2025-68613)" الخطورة = "حرجة" السلاسل: $expr_start = "{{" $expr_start = "{{" $keyword1 = "مُنشئ" $expr_start = "process.mainModule" $keyword3 = "child_process" $expr_start = "String.fromCharCode" شرط: $expr_start و(2 من ($keyword*) }

تدقيق السجل

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

التصلب المعماري

  • عزل Docker Isolation: تشغيل حاويات n8n مع -كاب-الإسقاط = الكل لإزالة جميع قدرات لينكس غير الضرورية.
  • مراقبة حركة المرور عند الخروج: قم بتكوين نُهج الشبكة لمنع حاوية n8n من بدء اتصالات إلى عناوين IP عامة غير مدرجة في القائمة البيضاء، مما يحظر اتصال الأصداف العكسية بخوادم C2.

الخاتمة: نقطة تحول لأمن التعليمات البرمجية المنخفضة

يمثل CVE-2025-68613 نقطة تحول في التاريخ الأمني لمنصات التعليمات البرمجية المنخفضة/غير البرمجية. إنه يذكرنا بما يلي غالبًا ما تكون المرونة والأمان لعبة محصلتها صفرية.

عندما نمنح القوة الكاملة للغة البرمجة (مثل تعبيرات جافا سكريبت) للمستخدمين العاديين، فإننا ندعو المهاجمين بشكل فعال إلى بيئة وقت التشغيل لدينا. لم يعد بإمكان الدفاعات الأمنية المستقبلية الاعتماد على صناديق الحماية الهشة على مستوى التطبيق، بل يجب أن تتحول نحو تأمين حسب التصميم البنى، مثل استخدام WebAssembly (Wasm) لعزل آمن للذاكرة الحقيقي لتنفيذ التعليمات البرمجية للمستخدم.

مراجع موثوقة

شارك المنشور:
منشورات ذات صلة
arArabic