إثبات مفهوم لثغرة اجتياز المسار (CWE-22) في عُقد Databricks الخاصة بـ n8n: مُدخل webhook غير مُصادَق عليه يتجاوز مسار Genie لتسريب أسرار PAT الخاصة بمساحة العمل، مع مختبر loopback.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · n8n-databricks-path-join
المقال: https://abraxaslabs.tech/research/n8n-databricks-path-join
n8n 2.42.0 - n8n GmbH
أدخلت GHSA-89p4-6h98-c7xm وGHSA-rqch-9jrh-cr8w الدالة toPathSegment: encodeURIComponent مع رفض '' / . / ... وتقوم getSpace.operation.ts بدمج spaceId في ${host}/api/2.0/genie/spaces/${spaceId}. وينطبق الأمر نفسه على getIndex في Vector Search وdownloadFile في Files. أما LangChain VectorStoreDatabricks فيغلّف مسار الفهرس مسبقًا. ويتولى new URL وفق WHATWG الباقي. إذ يُطبَّع ../. ويرحل معه رمز PAT الخاص بـ Databricks في سير العمل.
مدخل webhook غير موثوق يتحول إلى GET /api/2.0/secrets/get باستخدام رمز مساحة العمل. تسريب بيانات اعتماد على Databricks، وليس تنفيذًا عن بُعد على مضيف n8n.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-22 |
| CVSS | مرتفع: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| المنتج | n8n |
| المتأثر | حتى 2.42.0 (86c23326)؛ شقيق GHSA-89p4 / GHSA-rqch |
| المصادقة | غير مصادَق عليه عند الـ webhook إذا ربط سير عمل الضحية مدخلًا غير موثوق |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
استهداف webhook عام أو محادثة أو مشغّل HTTP يتدفق إلى Databricks Genie get-space (أو Vector Search get-index، أو Files download) بمعرّف يتحكم فيه المهاجم. عندئذٍ ينفّذ رمز سير العمل GET على /api/2.0/secrets/get. وإذا كان لهذا الرمز صلاحية قراءة النطاق (وهو رمز PAT نموذجي لمسؤول مساحة العمل)، فإن مخرجات العقدة تكون هي JSON الخاص بـ value للسر.
الرمز الذي لا يملك صلاحية ACL على الأسرار سيظل يُرجع 403؛ وهذا لا يزال يثبت أن الطلب غادر /genie. يحتاج تنزيل الملفات إلى ../ أعمق (بادئة أطول). يتطلب الأمر ضحية ربط مدخلًا غير موثوق في تلك المعلمة. عقدة HTTP Request المقيّدة (allowedHttpRequestDomains: none) ليست بديلًا عن ترميز معرّفات Databricks.
المنتج نفسه، بقايا شقيقة: hidden Function vm2.
نفس جولة البقايا التي أجريتها في مختبر Function: عشر عمليات بحث على [email protected] بعد موجة GHSA في 16 سبتمبر 2026. كانت جولة البحث عن حقن العقد تبحث عن أشقاء غير مكتملين لـ GHSA-89p4 (معرّفات موارد Public API) وGHSA-rqch (اسم جدول Supabase). Elastic، وAdalo، وCurrents، وعقدة n8n نفسها. الدالة المساعدة موجودة لأنهم خسروا هذه المعركة سابقًا. أما عقد Databricks في nodes-base فلا تستدعيها.
لم أوجّه هذا نحو مساحة عمل حقيقية. محاكي المختبر على :18203 يرد على GET /api/2.0/secrets/get بـ N8N-DBX-SECRET-WITNESS. وn8n على :18202. الـ webhook dbx-space يربط spaceId من JSON. سجل وصول المحاكي: GET /api/2.0/secrets/get?scope=s&key=k. وجسم الـ webhook يحتوي على الشاهد.
المسارات الخاطئة المسجّلة مسبقًا: طلب البقاء تحت /api/2.0/genie/spaces/ (ثم تم ترميز .. - يتطلب المختبر تركه كما هو)؛ اعتبار RCE على مضيف n8n بمثابة SUCCESS؛ الوصول إلى مساحة عمل حقيقية؛ صدفة عكسية. مسرح. الشاهد هو N8N-DBX-SECRET-WITNESS بالإضافة إلى سطر الطلب الوهمي.
cd lab
./run.sh
استهدف فقط http://127.0.0.1:18202 (n8n) و :18203 (mock). مضيف بيانات الاعتماد هو mock، وليس مساحة عمل حقيقية.
webhook-http=200
mock-request-line=GET /api/2.0/secrets/get?scope=s&key=k
webhook-witness=True
mock-secrets-get=True
witness=N8N-DBX-SECRET-WITNESS
SUCCESS N8N-DBX-PATH-JOIN
غلّف كل معرّف مسار في Databricks باستخدام toPathSegment، تمامًا كما في VectorStoreDatabricks.
getSpace.operation.ts · toPathSegment · DatabricksVectorStore.tsGNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.