
إثبات مفهوم ومختبر لهروب من صندوق الحماية في n8n 2.42.0: عُقد Function/FunctionItem المخفية تنفّذ JavaScript في العملية الرئيسية، مما يمنح الأعضاء المُصادَق عليهم تنفيذ أوامر عن بُعد على المضيف.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · n8n-function-vm2
المقال: https://abraxaslabs.tech/research/n8n-function-vm2
n8n 2.42.0 - n8n GmbH
GHSA-j4p8-h8mh-rh8q نقل n8n-nodes-base.code إلى العملية الفرعية JS task-runner. إطلاق الإنتاج يضيف --disallow-code-generation-from-strings و --disable-proto=delete. ما تبقّى هو العُقد التي أخفوها بدلاً من نقلها. Function.node.ts هو hidden: true. وكذلك FunctionItem. وكذلك LangChain Code. إخفاء لوحة العُقد هو مجرد علامة في واجهة المستخدم. حفظ/استيراد JSON سير العمل لا يزال يحل النوع. القيمة الافتراضية لـ NODES_EXCLUDE هي فقط Execute Command و Local File Trigger. مسار التنفيذ هو vm2 NodeVM 3.12.2 داخل العملية في العملية الرئيسية لـ n8n.
عضو افتراضي يستطيع إنشاء سير عمل يمكنه تشغيل JS في العملية الرئيسية لـ n8n. الإخفاء ليس ACL.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-94، CWE-269 |
| CVSS | عالٍ: 8.8 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H |
| المنتج | n8n |
| المتأثر | حتى 2.42.0 (86c23326)؛ بقايا GHSA-j4p8 |
| المصادقة | عضو مصادَق لديه صلاحية إنشاء/استيراد/تنفيذ سير العمل |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
بصفته عضواً افتراضياً، استيراد أو إنشاء سير عمل نوع عقدته n8n-nodes-base.function (أو functionItem، أو @n8n/n8n-nodes-langchain.code) وتنفيذه. يعمل JS داخل العملية الرئيسية لـ n8n.
هذا تنفيذ أوامر على المضيف بصلاحيات مستخدم n8n: أسرار النسخة، ونص اعتماد المستخدمين الآخرين المشفّر على القرص، وقاعدة البيانات. من عضو متعدد المستأجرين إلى الاستيلاء على النسخة. ليس LPE على مستوى نظام التشغيل. وليس بدون مصادقة. Code v2 على نفس النسخة لا يرى process بهذه الطريقة.
نفس المنتج، بقايا شقيقة: Databricks path join.
قرأت موجة GHSA في 16 سبتمبر 2026 أولاً، ثم عشر عمليات بحث على الوسم [email protected]. صندوق رمل التعبيرات، Code/Function/vm2، الاعتمادات، webhooks، HTTP/SSRF، عقدة Git، حزم المجتمع، المصادقة/SSO، حقن العُقد، واجهة API العامة. معظم الثغرات العالية في تلك الموجة مغلقة على هذه النسخة. لم يكن Code منتهياً.
قواعد التغييرات الجذرية في v3 تصنّف Function / FunctionItem بالفعل على أنها محذوفة. على 2.42.0 هي بقايا، وليست صندوق رمل مقصوداً طويل الأمد. كما أن Function يحقن this.helpers، بما في ذلك مساعدات يسردها مشغّل JS على أنها غير مدعومة. لم أحتج إلى أداة استغلال vm2 عامة لإثبات حدود العملية.
أقمت نسخة أصلية من n8nio/n8n:2.42.0، وسجّلت عضواً (وليس مالك النسخة)، واستوردت n8n-nodes-base.function، ونفّذته. pid=7 الخاص بـ Function هو PID الرئيسي لـ n8n. نفس JS في Code v2: hasProcess: false. العملية الفرعية task-runner هي pid 26. الشاهد N8N-FUNCTION-VM2-WITNESS.
المسارات الخاطئة المسجّلة مسبقاً: رفض نوع Function باعتباره مخفياً/غير معروف (حينها تكون العقدة مستبعدة فعلاً)؛ تساوي pid الخاص بـ Function مع العملية الفرعية task-runner (حينها يكون قد انتقل بالفعل)؛ رؤية Code v2 لـ process (حينها لا يكون المشغّل هو المتحكم)؛ أداة استغلال vm2، أو reverse shell، أو LPE على مستوى نظام التشغيل. مسرح. الشاهد هو PID الرئيسي مقابل hasProcess: false.
cd lab
./run.sh
استهدف فقط http://127.0.0.1:18201. القيمة الافتراضية NODES_EXCLUDE. المهاجم عضو.
authenticated-as=member
function-fields pid=7 witness=N8N-FUNCTION-VM2-WITNESS
code-fields hasProcess=False pid=None
compare function_pid=7 code_pid=None main_pid=7 runner_pid=26 who=member
SUCCESS N8N-FUNCTION-VM2 who=member function_pid=7 code_pid=None main_pid=7 runner_pid=26 N8N-FUNCTION-VM2-WITNESS
أضف n8n-nodes-base.function وn8n-nodes-base.functionItem و@n8n/n8n-nodes-langchain.code إلى NODES_EXCLUDE الافتراضي، أو وجّهها عبر JsTaskRunnerSandbox بالطريقة التي يفعلها Code v2 بالفعل. إخفاء لوحة العقد hidden ليس كافيًا.
Function.node.ts · Code.node.ts · nodes.config.ts · task-runner-process-js.tsGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.