إثبات مفهوم لثغرة اجتياز المسار (CWE-22) في عُقد Databricks الخاصة بـ n8n: مُدخل webhook غير مُصادَق عليه يتجاوز مسار Genie لتسريب أسرار PAT الخاصة بمساحة العمل، مع مختبر loopback.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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}. إن Vector Search getIndex و Files downloadFile من نفس الفئة. إن LangChain VectorStoreDatabricks يغلّف مسار الفهرس بالفعل. يقوم WHATWG new URL بالباقي. يتم تطبيع ../. ويذهب معه Databricks PAT الخاص بسير العمل.
مدخل webhook غير موثوق يتحول إلى GET /api/2.0/secrets/get تحت رمز مساحة العمل. تسريب بيانات اعتماد على Databricks، وليس RCE على مضيف n8n.
| ID | لا يوجد CVE بعد |
| CWE | CWE-22 |
| CVSS | High: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Product | n8n |
| Affected | حتى 2.42.0 (86c23326)؛ شقيق GHSA-89p4 / GHSA-rqch |
| Auth | غير مصادق عليه عند الـ webhook إذا ربط سير عمل الضحية مدخلًا غير موثوق |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 فقط |
استهداف webhook عام، أو chat، أو HTTP trigger يتدفق إلى 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 نجاحًا؛ استهداف مساحة عمل حقيقية؛ reverse shell. مسرح. الشاهد هو N8N-DBX-SECRET-WITNESS بالإضافة إلى سطر طلب الوهمي.
cd lab
./run.sh
استهدف فقط http://127.0.0.1:18202 (n8n) و :18203 (الوهمي). مضيف بيانات الاعتماد هو الوهمي، وليس مساحة عمل حقيقية.
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 فقط. بدون ضمان.