abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · n8n-databricks-path-join
技术分析文章:https://abraxaslabs.tech/research/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 输入在 workspace token 下变成了 GET /api/2.0/secrets/get。这是 Databricks 上的凭据泄露,而非 n8n 主机的 RCE。
| ID | 暂无 CVE |
| CWE | CWE-22 |
| CVSS | 高危:8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| 产品 | n8n |
| 受影响版本 | 至 2.42.0(86c23326);GHSA-89p4 / GHSA-rqch 的同类遗留问题 |
| 认证 | 若受害工作流绑定了不可信输入,则 webhook 处无需认证 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
攻击者向一个公开的 webhook、chat 或 HTTP 触发器发起请求,该触发器会将攻击者可控的 id 传入 Databricks Genie get-space(或 Vector Search get-index,或 Files download)。随后工作流 token 会 GET /api/2.0/secrets/get。如果该 token 有权读取该 scope(典型的工作区管理员 PAT),节点输出就是包含 secret value 的 JSON。
没有 secrets ACL 的 token 仍会返回 403;但这仍能证明请求已离开 /genie。Files download 需要更深的 ../(更长的前缀)。这需要受害者将不可信输入绑定到该参数。锁定配置的 HTTP Request 节点(allowedHttpRequestDomains: none)并不能替代对 Databricks id 进行编码。
同一产品,同类遗留问题:隐藏的 Function vm2。
与 Function 实验相同的遗留问题排查:在 2026 年 9 月 16 日 GHSA 浪潮之后,针对 [email protected] 进行了十次排查。节点注入排查旨在寻找 GHSA-89p4(Public API 资源 id)和 GHSA-rqch(Supabase 表名)的不完整同类问题。Elastic、Adalo、Currents,以及 n8n 节点本身。该辅助函数之所以存在,是因为他们此前已经在这类问题上吃过亏。Databricks nodes-base 并未调用它。
我并未将此针对真实工作区。:18203 上的实验 mock 对 GET /api/2.0/secrets/get 返回 N8N-DBX-SECRET-WITNESS。n8n 运行在 :18202。Webhook dbx-space 从 JSON 绑定 spaceId。Mock 访问日志:GET /api/2.0/secrets/get?scope=s&key=k。Webhook 响应体包含该见证值。
已记录的失误:请求停留在 /api/2.0/genie/spaces/ 下(随后 .. 被编码——实验要求保持原样);将 n8n 主机 RCE 视为 SUCCESS;访问了真实工作区;使用了反向 shell。这些都是表演。真正的见证是 N8N-DBX-SECRET-WITNESS 加上模拟请求行。
cd lab
./run.sh
仅针对 http://127.0.0.1:18202(n8n)和 :18203(mock)。凭据主机是 mock,而非真实工作区。
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
与 VectorStoreDatabricks 一样,用 toPathSegment 包裹每个 Databricks 路径 id。
getSpace.operation.ts · toPathSegment · DatabricksVectorStore.tsGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。