Preuve de concept pour un path-traversal (CWE-22) dans n8n au niveau des nœuds Databricks : une entrée de webhook non authentifiée s'échappe du chemin Genie pour exfiltrer les secrets PAT de l'espace de travail, avec un lab en boucle locale.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · n8n-databricks-path-join
n8n 2.42.0 - n8n GmbH
GHSA-89p4-6h98-c7xm et GHSA-rqch-9jrh-cr8w ont introduit toPathSegment : encodeURIComponent plus le rejet de '' / . / ... getSpace.operation.ts concatène spaceId dans ${host}/api/2.0/genie/spaces/${spaceId}. Vector Search getIndex et Files downloadFile relèvent de la même classe. LangChain VectorStoreDatabricks encapsule déjà le chemin de l'index. WHATWG new URL fait le reste. ../ se normalise. Le PAT Databricks du workflow suit le mouvement.
Une entrée webhook non fiable devient GET /api/2.0/secrets/get sous le token du workspace. Fuite d'identifiants sur Databricks, pas de RCE sur l'hôte n8n.
| ID | pas encore de CVE |
| CWE | CWE-22 |
| CVSS | Élevé : 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Produit | n8n |
| Affecté | jusqu'à 2.42.0 (86c23326) ; frère de GHSA-89p4 / GHSA-rqch |
| Auth | non authentifié au niveau du webhook si un workflow victime a lié une entrée non fiable |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Atteindre un webhook public, un chat ou un déclencheur HTTP qui alimente Databricks Genie get-space (ou Vector Search get-index, ou Files download) avec un id contrôlé par l'attaquant. Le token du workflow exécute alors un GET sur /api/2.0/secrets/get. Si ce token peut lire le scope (PAT d'admin de workspace typique), la sortie du nœud est le JSON value du secret.
Un token sans ACL sur les secrets renvoie toujours 403 ; cela prouve tout de même que la requête a quitté /genie. Le téléchargement de fichiers nécessite un ../ plus profond (préfixe plus long). Nécessite une victime ayant lié une entrée non fiable à ce paramètre. Un nœud HTTP Request verrouillé (allowedHttpRequestDomains: none) ne remplace pas l'encodage des ids Databricks.
Même produit, reste frère : hidden Function vm2.
Même passe sur les restes que le lab Function : dix chasses sur [email protected] après la vague de GHSA du 16 septembre 2026. La chasse à l'injection de nœuds cherchait des frères incomplets de GHSA-89p4 (ids de ressources de l'API publique) et GHSA-rqch (nom de table Supabase). Elastic, Adalo, Currents, le nœud n8n lui-même. Le helper existe parce qu'ils ont déjà perdu ce combat. Les nœuds Databricks de nodes-base ne l'appellent pas.
Je n'ai pas visé un vrai workspace. Le mock du lab sur :18203 répond à GET /api/2.0/secrets/get avec N8N-DBX-SECRET-WITNESS. n8n sur :18202. Le webhook dbx-space lie spaceId depuis le JSON. Journal d'accès du mock : GET /api/2.0/secrets/get?scope=s&key=k. Le corps du webhook contient le témoin.
Fausses pistes déjà consignées : requête restant sous /api/2.0/genie/spaces/ (alors .. était encodé - le lab exige qu'il en sorte) ; traiter un RCE sur l'hôte n8n comme un SUCCESS ; frapper un vrai workspace ; un reverse shell. Du théâtre. Le témoin est N8N-DBX-SECRET-WITNESS plus la ligne de requête du mock.
cd lab
./run.sh
Cibler uniquement http://127.0.0.1:18202 (n8n) et :18203 (mock). L'hôte des identifiants est le mock, pas un vrai 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
Encapsuler chaque id de chemin Databricks avec toPathSegment, comme VectorStoreDatabricks.
getSpace.operation.ts · toPathSegment · DatabricksVectorStore.tsGNU Affero GPL v3.0. Voir LICENSE. Lab en loopback uniquement. Aucune garantie.