Prova de conceito para um path-traversal (CWE-22) no n8n em nós do Databricks: entrada de webhook não autenticada escapa do caminho do Genie para vazar segredos PAT do workspace, com um laboratório 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 e GHSA-rqch-9jrh-cr8w introduziram toPathSegment: encodeURIComponent mais rejeitar '' / . / ... getSpace.operation.ts concatena spaceId em ${host}/api/2.0/genie/spaces/${spaceId}. Vector Search getIndex e Files downloadFile são da mesma classe. LangChain VectorStoreDatabricks já envolve o caminho do índice. O new URL do WHATWG faz o resto. ../ normaliza. O PAT do Databricks do workflow vai junto.
Entrada não confiável de webhook torna-se GET /api/2.0/secrets/get sob o token do workspace. Vazamento de credencial no Databricks, não RCE no host do n8n.
| ID | ainda sem CVE |
| 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 |
| Produto | n8n |
| Afetado | até 2.42.0 (86c23326); irmão de GHSA-89p4 / GHSA-rqch |
| Autenticação | não autenticado no webhook se um workflow vítima vinculou entrada não confiável |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Atingir um webhook público, chat ou gatilho HTTP que flui para o Databricks Genie get-space (ou Vector Search get-index, ou Files download) com um id controlado pelo atacante. O token do workflow então faz GET em /api/2.0/secrets/get. Se esse token puder ler o escopo (PAT típico de admin de workspace), a saída do nó é o JSON value do segredo.
Token sem ACL de secrets ainda retorna 403; isso ainda prova que a requisição saiu de /genie. O download de Files precisa de um ../ mais profundo (prefixo mais longo). Precisa de uma vítima que tenha vinculado entrada não confiável nesse parâmetro. Um nó HTTP Request bloqueado (allowedHttpRequestDomains: none) não substitui a codificação dos ids do Databricks.
Mesmo produto, sobra irmã: hidden Function vm2.
Mesma passagem de sobras do lab do Function: dez caçadas em [email protected] após a onda de GHSA de 16 de setembro de 2026. A caçada de injeção de nó procurava irmãos incompletos de GHSA-89p4 (ids de recurso da Public API) e GHSA-rqch (nome de tabela do Supabase). Elastic, Adalo, Currents, o próprio nó do n8n. O helper existe porque eles já perderam essa luta. O nodes-base do Databricks não o chama.
Não direcionei isso a um workspace real. Mock de lab em :18203 responde GET /api/2.0/secrets/get com N8N-DBX-SECRET-WITNESS. n8n em :18202. Webhook dbx-space vincula spaceId a partir do JSON. Log de acesso do mock: GET /api/2.0/secrets/get?scope=s&key=k. O corpo do webhook contém a testemunha.
Caminhos errados já registrados: requisição permanecendo sob /api/2.0/genie/spaces/ (então .. era codificado - o lab exige que ele saia); tratar RCE no host do n8n como SUCCESS; atingir um workspace real; um reverse shell. Teatro. A testemunha é N8N-DBX-SECRET-WITNESS mais a linha de requisição do mock.
cd lab
./run.sh
Alvo apenas http://127.0.0.1:18202 (n8n) e :18203 (mock). O host da credencial é o mock, não um 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
Envolva todo id de caminho do Databricks com toPathSegment, igual ao VectorStoreDatabricks.
getSpace.operation.ts · toPathSegment · DatabricksVectorStore.tsGNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.