Prueba de concepto para un path-traversal (CWE-22) en n8n en nodos de Databricks: la entrada de webhook no autenticada escapa de la ruta de Genie para filtrar secretos PAT del workspace, con un laboratorio de loopback.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · n8n-databricks-path-join
n8n 2.42.0 - n8n GmbH
GHSA-89p4-6h98-c7xm y GHSA-rqch-9jrh-cr8w introdujeron toPathSegment: encodeURIComponent más rechazar '' / . / ... getSpace.operation.ts concatena spaceId en ${host}/api/2.0/genie/spaces/${spaceId}. Vector Search getIndex y Files downloadFile son de la misma clase. LangChain VectorStoreDatabricks ya envuelve la ruta del índice. WHATWG new URL hace el resto. ../ se normaliza. El PAT de Databricks del workflow se va con ello.
La entrada no confiable de un webhook se convierte en GET /api/2.0/secrets/get bajo el token del workspace. Fuga de credenciales en Databricks, no RCE en el host de n8n.
| ID | sin CVE todavía |
| CWE | CWE-22 |
| CVSS | Alto: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| Producto | n8n |
| Afectado | hasta 2.42.0 (86c23326); hermano de GHSA-89p4 / GHSA-rqch |
| Auth | no autenticado en el webhook si un workflow víctima vinculó entrada no confiable |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Golpear un webhook público, chat o trigger HTTP que fluya hacia Databricks Genie get-space (o Vector Search get-index, o Files download) con un id controlado por el atacante. El token del workflow entonces hace GET a /api/2.0/secrets/get. Si ese token puede leer el scope (típico PAT de admin de workspace), la salida del nodo es el JSON del value del secreto.
Un token sin ACL de secrets igual devuelve 403; eso igual prueba que la petición salió de /genie. Files download necesita un ../ más profundo (prefijo más largo). Necesita una víctima que haya vinculado entrada no confiable en ese parámetro. Un nodo HTTP Request bloqueado (allowedHttpRequestDomains: none) no sustituye codificar los ids de Databricks.
Mismo producto, sobrante hermano: hidden Function vm2.
Misma pasada de sobrantes que el lab de Function: diez cacerías sobre [email protected] tras la oleada de GHSA del 16 de septiembre de 2026. La cacería de inyección de nodos buscaba hermanos incompletos de GHSA-89p4 (ids de recursos de la API pública) y GHSA-rqch (nombre de tabla de Supabase). Elastic, Adalo, Currents, el propio nodo de n8n. El helper existe porque ya perdieron esta pelea. Databricks nodes-base no lo llama.
No apunté esto a un workspace real. El mock del lab en :18203 responde a GET /api/2.0/secrets/get con N8N-DBX-SECRET-WITNESS. n8n en :18202. El webhook dbx-space vincula spaceId desde JSON. Log de acceso del mock: GET /api/2.0/secrets/get?scope=s&key=k. El cuerpo del webhook contiene el witness.
Caminos equivocados ya registrados: que la petición se quedara bajo /api/2.0/genie/spaces/ (entonces .. se codificaba - el lab requiere que salga); tratar RCE en el host de n8n como SUCCESS; golpear un workspace real; una reverse shell. Teatro. El witness es N8N-DBX-SECRET-WITNESS más la línea de petición del mock.
cd lab
./run.sh
Objetivo solo http://127.0.0.1:18202 (n8n) y :18203 (mock). El host de credenciales es el mock, no un workspace real.
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
Envolver cada id de ruta de Databricks con toPathSegment, igual que VectorStoreDatabricks.
getSpace.operation.ts · toPathSegment · DatabricksVectorStore.tsGNU Affero GPL v3.0. Ver LICENSE. Solo lab en loopback. Sin garantía.