Proof-of-Concept für einen n8n-Path-Traversal (CWE-22) in Databricks-Nodes: Nicht authentifizierte Webhook-Eingaben entkommen dem Genie-Pfad, um Workspace-PAT-Secrets preiszugeben, mit einem Loopback-Lab.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · n8n-databricks-path-join
n8n 2.42.0 - n8n GmbH
GHSA-89p4-6h98-c7xm und GHSA-rqch-9jrh-cr8w führten toPathSegment ein: encodeURIComponent plus Ablehnung von '' / . / ... getSpace.operation.ts konkateniert spaceId in ${host}/api/2.0/genie/spaces/${spaceId}. Vector Search getIndex und Files downloadFile gehören zur selben Klasse. LangChain VectorStoreDatabricks umschließt den Index-Pfad bereits. WHATWG new URL erledigt den Rest. ../ wird normalisiert. Das Databricks-PAT des Workflows geht mit.
Nicht vertrauenswürdige Webhook-Eingaben werden zu GET /api/2.0/secrets/get unter dem Workspace-Token. Credential-Leak auf Databricks, kein RCE auf dem n8n-Host.
| ID | noch keine 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 |
| Produkt | n8n |
| Betroffen | bis 2.42.0 (86c23326); Geschwister von GHSA-89p4 / GHSA-rqch |
| Auth | unauthentifiziert am Webhook, wenn ein Opfer-Workflow nicht vertrauenswürdige Eingaben gebunden hat |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Trifft einen öffentlichen Webhook, Chat- oder HTTP-Trigger, der in Databricks Genie get-space (oder Vector Search get-index oder Files download) mit einer angreiferkontrollierten ID fließt. Das Workflow-Token führt dann GET auf /api/2.0/secrets/get aus. Wenn dieses Token den Scope lesen darf (typisches Workspace-Admin-PAT), ist die Node-Ausgabe das Secret-value-JSON.
Ein Token ohne Secrets-ACL liefert weiterhin 403; das beweist trotzdem, dass die Anfrage /genie verlassen hat. Files download benötigt ein tieferes ../ (längerer Präfix). Erfordert ein Opfer, das nicht vertrauenswürdige Eingaben in diesen Parameter gebunden hat. Ein abgeriegelter HTTP Request Node (allowedHttpRequestDomains: none) ist kein Ersatz für die Kodierung der Databricks-IDs.
Gleiches Produkt, verwandtes Überbleibsel: verstecktes Function vm2.
Derselbe Überbleibsel-Durchgang wie beim Function-Lab: zehn Jagden auf [email protected] nach der GHSA-Welle vom 16. September 2026. Die Node-Injection-Jagd suchte nach unvollständigen Geschwistern von GHSA-89p4 (Public-API-Ressourcen-IDs) und GHSA-rqch (Supabase-Tabellenname). Elastic, Adalo, Currents, der n8n-Node selbst. Der Helper existiert, weil sie diesen Kampf bereits verloren haben. Databricks nodes-base ruft ihn nicht auf.
Ich habe das nicht auf einen echten Workspace gerichtet. Lab-Mock auf :18203 antwortet auf GET /api/2.0/secrets/get mit N8N-DBX-SECRET-WITNESS. n8n auf :18202. Webhook dbx-space bindet spaceId aus JSON. Mock-Zugriffslog: GET /api/2.0/secrets/get?scope=s&key=k. Webhook-Body enthält den Witness.
Bereits dokumentierte Irrwege: Anfrage bleibt unter /api/2.0/genie/spaces/ (dann wurde .. kodiert - das Lab erfordert, dass sie verlassen wird); n8n-Host-RCE als SUCCESS behandeln; einen echten Workspace treffen; eine Reverse Shell. Theater. Der Witness ist N8N-DBX-SECRET-WITNESS plus die Mock-Request-Zeile.
cd lab
./run.sh
Ziel nur http://127.0.0.1:18202 (n8n) und :18203 (Mock). Der Credential-Host ist der Mock, kein echter Workspace.
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
Jede Databricks-Pfad-ID mit toPathSegment umschließen, genau wie bei VectorStoreDatabricks.
getSpace.operation.ts · toPathSegment · DatabricksVectorStore.tsGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.