إرسال السجلات والتنبيهات وبيانات القياس عن بُعد عبر صمام ثنائي البيانات

اكتشف كيف
نستخدمُ الذكاء الاصطناعي في ترجمات الموقع، ومع أننا نسعى جاهدين لبلوغ الدقة قد لا تكون هذه الترجمات دقيقةً بنسبة 100% دائمًا. تفهّمك لهذا الأمر هو موضع تقدير لدينا.

CVE-2026-25049: Sandbox للتعبيرات مما يؤدي إلى تنفيذ التعليمات البرمجية عن بُعد في n8n

By لوك نجوين، قائد فريق اختبار الاختراق
شارك هذا المنشور

في فبراير 2026، تم الكشف علنًا عن ثغرة أمنية خطيرة تتعلق بالهروب من بيئة الحماية (sandbox) في n8n، وهي منصة مفتوحة المصدر شائعة الاستخدام لأتمتة سير العمل. تتيح هذه الثغرة، التي تم تسجيلها تحت الرمز CVE-2026-25049، للمستخدمين المصادق عليهم تجاوز بيئة الحماية الخاصة بتقييم التعبيرات وتنفيذ أوامر نظامية عشوائية على الخادم المضيف، مما يتيح تنفيذ كامل للرموز عن بُعد، مع درجة CVSS v3.1 تبلغ 9.9.

في إطار برنامج زمالةOPSWAT ، أجرى زملاؤنا تحليلاً تقنياً شاملاً للثغرة الأمنية CVE-2026-25049، حيث درسوا أسبابها الجذرية وآلية استغلالها وتأثيرها على المؤسسات.

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

CVE-2026-25049 هي ثغرة أمنية خطيرة تسمح بالهروب من بيئة الحماية (sandbox escape) في n8n، وهي مصنفة تحت CWE-913: التحكم غير السليم في موارد الكود المدارة ديناميكيًا. يؤثر هذا الخلل على جميع إصدارات n8n السابقة للإصدار 1.123.17، بالإضافة إلى الإصدارات من 2.0.0 إلى 2.5.1، وقد تم إصلاحه في الإصدارين 1.123.17 و2.5.2. وهو يتيح للمستخدمين المعتمدين الذين يمتلكون أذونات إنشاء سير العمل صياغة تعبيرات JavaScript ضارة تتجاوز صندوق الحماية الخاص بالتعبيرات في المنصة، مما يؤدي في النهاية إلى تنفيذ أوامر تعسفية على الخادم المضيف.

الشكل 1: CVE-2026-25049 (المصدر: NVD)

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

لا يُعد CVE-2026-25049 اكتشافًا قائمًا بذاته، بل هو تجاوز للتصحيح الخاص بـ CVE-2025-68613، وهي ثغرة سابقة للخروج من بيئة الحماية (sandbox escape) في مُقيِّم التعبيرات في n8n. على الرغم من تنفيذ دفاعات متعددة الطبقات بعد الثغرة الأولية، فإن ثغرة أساسية في كيفية معالجة أداة التنقية لأنواع عقد شجرة الصياغة المجردة (AST) لـ JavaScript سمحت للفئة الأصلية من الهجمات بالظهور مرة أخرى من خلال ناقل صياغي مختلف. هذا النمط - حيث يعالج التصحيح تقنية الاستغلال المحددة بدلاً من نقطة الضعف التصميمية الأساسية - يسلط الضوء على التحدي المستمر المتمثل في تأمين بيئات تقييم الكود الديناميكي.

تم الكشف عن هذه الثغرة الأمنية في 4 فبراير 2026، إلى جانب عشرة تنبيهات أمنية أخرى تتعلق ببرنامج n8n، وقد خضعت لتحليل مستقل من قِبل عدة فرق بحثية متخصصة في مجال الأمن.

نبذة عن n8n

n8n هي منصة مفتوحة المصدر لأتمتة سير العمل تتيح للمؤسسات ربط الأنظمة وأتمتة العمليات وإنشاء عمليات تكامل عبر مئات الخدمات. وبفضل انتشارها الواسع وتوفر أكثر من 1,300 عملية تكامل، أصبحت n8n واحدة من أكثر أدوات شيوعًا أدوات فئتها، حيث تستخدمها فرق التطوير والمؤسسات لأتمتة كل شيء بدءًا من الأدوات الداخلية وصولاً إلى مسارات البيانات الحيوية للأعمال.

الشكل 2: مثال على مسار عمل n8n.

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

الخلفية التقنية

أشجار بناء الجملة المجردة

شجرة الصياغة المجردة (AST) هي تمثيل هرمي للكود المصدري ينتجه محلل لغوي. فبدلاً من التعامل مع الكود كسلسلة نصية مسطحة، تقوم شجرة الصياغة المجردة بتفكيكه إلى عقد منظمة تمثل عناصره النحوية — إعلانات المتغيرات، وتعبيرات الدوال، وتعبيرات العناصر، والمعرفات، والقيم الثابتة.

الشكل 3: مراحل المُترجم.

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

الشكل 4: بعض عقد AST في لغة جافا سكريبت.

على سبيل المثال، ينتج التعبير obj.constructor عقدة MemberExpression، بينما ينتج const { constructor } = obj إعلان متغير (VariableDeclaration) يحتوي على نمط كائن (ObjectPattern) مع عقدة خاصية (Property). وكلاهما يستخرج نفس الخاصية، لكن هياكل شجرة التحليل البنيوي (AST) تختلف اختلافًا جوهريًا - ولا تقوم أدوات التنقية في n8n بفحص سوى النمط الأول.

تقييم تعبيرات n8n وبنيتها الأمنية

تنقسم بنية n8n إلى خمس طبقات: الواجهة الأمامية، وواجهة سطر الأوامر (CLI)، Core وسير العمل، والعقد. تتولى طبقة سير العمل تقييم التعبيرات، وهي المكون ذو الصلة بهذه الثغرة الأمنية.

الشكل 5: نظرة عامة على مسار n8n.

يتيح n8n للمستخدمين تضمين تعبيرات JavaScript ضمن معلمات عقد سير العمل لمعالجة البيانات ديناميكيًا. يتم تقييم هذه التعبيرات من جانب الخادم باستخدام مكتبة تُسمى Tournament، والتي تقوم بتحليل التعبيرات إلى شجرة تركيبية (AST) قبل التنفيذ. يتم إدراج خطافات التنقية مباشرةً في عملية إنشاء Tournament، حيث تُجرى عمليات الفحص أثناء بناء شجرة التركيب (AST) لاعتراض الأنماط الخطرة قبل تنفيذ أي كود.

الشكل 6: إنشاء البطولة في البداية.

ونظرًا لأن هذه التعبيرات تُنفَّذ ضمن نفس عملية Node.js التي يعمل بها خادم n8n، فإن المنصة تطبق خمس طبقات أمان متميزة مصممة لمنع أي شفرة غير موثوق بها من الخروج من بيئة الحماية.

الطبقة 1 - استبدال السياق العام

قبل تقييم أي تعبير، يقوم n8n بإنشاء سياق تنفيذ مقيد عن طريق استبدال الكائنات والوظائف العالمية الخطرة. ويتم استبدال الخصائص مثل document وwindow وglobalThis وeval وsetTimeout وsetInterval وFunction بكائنات فارغة، مما يمنع الوصول المباشر إلى هذه الإمكانيات.

الشكل 7: بدء السياق العام.
الشكل 8: استبدال جميع الوظائف الخطرة.

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

الطبقة الثانية - التحقق من صحة التعبيرات النمطية

قبل أن يصل التعبير إلى المُقيِّم، يقوم n8n بإجراء فحص للتعبيرات النمطية على سلسلة التعبير الأولية لمنع الوصول إلى خاصية المُنشئ — وهي وسيلة شائعة للحصول على مُنشئ الدالة وتنفيذ التعليمات البرمجية.

الشكل 9: التحقق من صحة التعبير النمطي.

يكتشف التعبير النمطي /\.\s*constructor/gm الوصول إلى .constructor باستخدام صيغة النقطة. ومع ذلك، فإن هذا الفحص محدود بشكل أساسي لأن لغة جافا سكريبت توفر مسارات نحوية متعددة للوصول إلى نفس الخاصية، ولا تتضمن جميعها صيغة النقطة.

الطبقة 3 - أداة تنقية وقت التشغيل AST – PrototypeSanitizer

يتم تفعيل آلية الحماية الأكثر تطوراً أثناء إنشاء AST. حيث يتنقل خطاف PrototypeSanitizer عبر AST ويفحص عقد MemberExpression لتحديد ما إذا كانت الخاصية التي تم الوصول إليها مدرجة في قائمة حظر خصائص الكائنات غير الآمنة — بما في ذلك constructor و__proto__ وprototype وmainModule وbinding.

الشكل 10: نموذج أولي لمطهر.

يعالج المُعقِّم ثلاث حالات: الترميز بالنقطة (obj.prop) حيث يتحقق من اسم المُعرِّف، والترميز بالأقواس الثابتة (obj['prop']) حيث يتحقق من قيمة السلسلة الحرفية، والتعبيرات الديناميكية التي يتم تغليفها في دالة مُعقِّم وقت التشغيل. وكما هو موضَّح في الشكل 10، لا يتم فحص سوى عقد MemberExpression - ولا يتم استعراض أنماط تفكيك البنية.

الطبقة 4 - وظيفة "Sanitizer" في بيئة تشغيل AST: ThisSanitizer

تمت إضافة FunctionThisSanitizer كرقعة مباشرة لمعالجة الثغرة CVE-2025-68613، حيث تعمل على اعتراض تعبيرات الدالة التي يتم استدعاؤها فورًا (IIFEs) وإعادة كتابتها لربط المتغير this بكائن فارغ. ويمنع ذلك التقنية المستخدمة في الاستغلال الأصلي، حيث كان التعبير (function(){ return this })() يتسبب في تسريب كائن العملية العام من خلال مرجع this غير المربوط.

الشكل 11: دالة GlobalThisSanitizer

والأهم من ذلك، أن هذا المُعقم لا يتعامل إلا مع عقد FunctionExpression. وهو يعود بشكل صريح مبكرًا عند أي دالة مُستدعاة ليست من نوع FunctionExpression، بما في ذلك الدوال السهمية.

يتم إزالة الخصائص الخطرة مثل eval و Function و process.mainModule من سياق التنفيذ أو استبدالها فيه، مما يمنع الوصول المباشر إلى عناصر تنفيذ التعليمات البرمجية الأساسية حتى في حالة تجاوز الطبقات السابقة.

تحليل نقاط الضعف

السبب الجذري

يكمن السبب الجذري لثغرة CVE-2026-25049 في افتراض مشترك بين جميع الطبقات الأمنية الخمس: فقد افترضت كل طبقة أن الوصول إلى الخصائص سيتم إما عبر صيغة النقطة (obj.constructor) أو صيغة الأقواس (obj['constructor']). ولم تأخذ أي منها في الحسبان صيغة تفكيك العناصر في لغة جافا سكريبت.

تتيح عملية تفكيك JavaScript استخراج الخصائص من الكائنات باستخدام بنية شجرة تحليل جملة (AST) مختلفة جذريًا:

// Traditional access - produces MemberExpression node
obj.constructor; // Blocked by regex, AST sanitizer, and runtime checks

// Destructuring - produces ObjectPattern → Property node
const { constructor } = obj; // Not checked by any layer

على الرغم من أن كلا النمطين يحققان النتيجة نفسها، إلا أنهما ينتجان تمثيلات AST مختلفة تمامًا. لا يقوم PrototypeSanitizer بفحص سوى عقد MemberExpression، بينما لا يطابق التعبير النمطي سوى أنماط .constructor. وتؤدي عمليات التعيين التفكيكية إلى إنشاء عقد VariableDeclaration → ObjectPattern → Property، والتي لا يتتبعها أي من أدوات التنقية.

ويزداد الأمر تعقيدًا بسبب طريقة تعامل n8n مع الدوال السهمية. لا يعترض FunctionThisSanitizer سوى عقد FunctionExpression ويعيد كتابتها لربط this بسياق آمن. تنتج الدوال السهمية عقد AST من نوع ArrowFunctionExpression، والتي لا يعالجها المُعقِّم. ونظرًا لأن الدوال السهمية ترث this من نطاقها المحيط (this اللغوي)، فإنها تتيح الوصول إلى السياق العام غير المُعقَّم.

يؤدي هذان الإغفالان معًا إلى تجاوز كامل: حيث تعمل عملية تفكيك البنية على استخراج مُنشئ الدالة دون تشغيل أي فحوصات للوصول إلى الخصائص، بينما توفر الدوال السهمية سياقًا للتنفيذ لا يعترضه مُعقِّم FunctionThisSanitizer.

الاستغلال

يستغل هذا الثغرة الأمنية كلا الثغرتين لاختراق كل طبقات الحماية في آن واحد. وقد تمكن زملاؤنا من تتبع مسار الاستغلال التالي:

الخطوة 1 - إدخال دالة السهم. تبدأ الحمولة بدالة سهم محاطة بتعبير دالة يتم استدعاؤها فورًا (IIFE):

={{(() => {
// دالة السهم - تتجاوز FunctionThisSanitizer
...
})()}}

تتحقق دالة FunctionThisSanitizer مما إذا كان العنصر الذي يتم استدعاؤه هو تعبير دالة (FunctionExpression)؛ ونظرًا لأن هذا تعبير دالة سهمية (ArrowFunctionExpression)، فإن أداة التنقية تعود مبكرًا دون إعادة كتابة الاستدعاء. وتُنفَّذ الدالة السهمية مع وصول كامل إلى السياق العام الحقيقي.

الخطوة 2 - تجاوز عملية تفكيك البنية. داخل الدالة السهمية، تعمل عملية تفكيك البنية على استخراج مُنشئ الدالة من مثيل الدالة السهمية:

const { constructor } = () => {};

نظرًا لأن هذه عملية تعيين تفكيك، فإن شجرة التحليل البنيوي (AST) تحتوي على عقدة ObjectPattern بدلاً من MemberExpression. ولا يكتشف فحص التعبير النمطي أي نمط .constructor، كما أن أداة PrototypeSanitizer لا تتحقق أبدًا من اسم الخاصية. وبذلك يصبح المهاجم حاملًا لمُشير إلى مُنشئ الدالة.

الخطوة 3 - تنفيذ التعليمات البرمجية الديناميكية. بعد الحصول على مُنشئ الدالة، يقوم المهاجم بإنشاء وتنفيذ تعليمات برمجية عشوائية:

return constructor(
'return process.mainModule.require("child_process").execSync("whoami").toString()',
)();

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

الشكل 12: حمولة الهجوم النهائية

إثبات المفهوم

ولإثبات التأثير الفعلي لهذه الثغرة الأمنية، قام زملاؤنا بإعادة إنتاج الاستغلال في بيئة مختبرية خاضعة للرقابة. ويتضمن سيناريو الهجوم استضافة مثيل n8n معرض للخطر واستيراد سير عمل يحتوي على حمولة ضارة ضمن معلمة العقدة - مستهدفًا على وجه التحديد عقدة "تحرير الحقول" (Edit Fields Node)، التي تسمح بتقييم التعبيرات.

الشكل 13: يقوم المسؤول باستيراد سير عمل ضار.

بمجرد تشغيل سير العمل، تتجاوز الحمولة جميع طبقات التعقيم الخمس وتُنفِّذ قذيفة عكسية على الخادم المضيف، مما يمنح المهاجم القدرة الكاملة على تنفيذ الأوامر.

الشكل 14: تنفيذ الحمولة من خلال مشغل سير العمل.

تصعيد Webhook إلى تنفيذ التعليمات عن بُعد (RCE) دون مصادقة

تزداد خطورة هذه الثغرة الأمنية بشكل كبير عند اقترانها بوظيفة "webhook" في n8n. يتيح n8n لسير العمل عرض نقاط نهاية HTTP كـ"webhooks" مع خيارات مصادقة قابلة للتكوين، بما في ذلك الرموز المميزة (bearer tokens) والمصادقة الأساسية، والأهم من ذلك - عدم وجود مصادقة على الإطلاق. يمكن للمهاجم الذي لديه حق الوصول لإنشاء سير العمل تكوين webhook عام مع المصادقة: "none"، وتضمين حمولة RCE في عقدة متصلة، وتفعيل سير العمل. عند هذه النقطة، يؤدي أي طلب HTTP إلى عنوان URL الخاص بـ webhook - من أي مكان على الإنترنت - إلى تشغيل أوامر عشوائية على الخادم المضيف.

يؤدي مسار التصعيد هذا إلى تحويل الثغرة الأمنية CVE-2026-25049 من ثغرة داخلية تتطلب مصادقة إلى وسيلة هجوم لا تتطلب مصادقة فعليًا وتتعرض لمخاطر على نطاق شبكة الإنترنت بأكملها.

التخفيف

عالج فريق n8n الثغرة الأمنية CVE-2026-25049 في الإصدارين 1.123.17 و2.5.2 من خلال تطبيق فحص أنواع البيانات أثناء التشغيل بشكل سليم في وظائف التنقية، وتوسيع نطاق تغطية شجرة التركيب الآلي (AST) لمعالجة أنماط تفكيك المتغيرات. وينبغي على المؤسسات التي تستخدم الإصدارات المتأثرة الترقية على الفور.

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

نظرًا لخطورة هذه الثغرة وسهولة استغلالها - لا سيما عند اقترانها بـ"webhooks" العامة - ينبغي على المؤسسات أيضًا مراجعة سير العمل الحالي بحثًا عن أي تعبيرات مشبوهة، ومراقبة تنفيذ أوامر النظام غير العادية الصادرة عن عملية n8n، ومراجعة إعدادات "webhooks" للتحقق من عدم وجود أي نقاط نهاية مكشوفة دون مصادقة.

التخفيف من المخاطر باستخدام OPSWAT

من خلال الاستفادة OPSWAT يمكن للمؤسسات تحديد مكونات n8n المعرضة للخطر داخل بنيتها التحتية بسرعة واتخاذ الإجراءات اللازمة قبل وقوع أي استغلال. وتُعد OPSWAT باعتبارها تقنية أساسية ضمن منصة MetaDefender®، بمثابة قائمة شاملة بجميع مكونات البرامج والمكتبات والتبعيات المستخدمة في بيئة المؤسسة.

الشكل 15: اكتشاف الثغرة الأمنية CVE-2026-25049 في قائمة مكونات البرمجيات OPSWAT

كما هو موضح في الشكل 15، قام MetaDefender بفحص ملف package.json الذي يحتوي على التبعية n8n، وقام تلقائيًا بتصنيف الثغرة الأمنية CVE-2026-25049 على أنها "حرجة"، مع عرض نطاق الإصدارات المتأثرة والإصدارات المُصححة الموصى بها لإصلاح المشكلة. وهذا يمكّن فرق الأمن من تحديد الثغرة الأمنية وترتيب أولوياتها بسرعة عبر بيئة النشر الخاصة بهم.

يتوفر OPSWAT في كل من MetaDefender MetaDefender Software Chain™، مما يتيح لفرق الأمن القيام بما يلي:

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

مراجع

ابق على اطلاع دائم OPSWAT!

اشترك اليوم لتلقي آخر تحديثات الشركة, والقصص ومعلومات عن الفعاليات والمزيد.