abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 输入在工作区令牌下变成 GET /api/2.0/secrets/get。这是 Databricks 上的凭据泄露,而非 n8n 主机的 RCE。
| ID | 暂无 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 |
| 产品 | n8n |
| 受影响版本 | 至 2.42.0(86c23326);GHSA-89p4 / GHSA-rqch 的同类问题 |
| 认证 | 若受害工作流绑定了不受信任的输入,则 webhook 处无需认证 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1 |
访问一个公开的 webhook、chat 或 HTTP 触发器,其数据流会进入 Databricks Genie get-space(或 Vector Search get-index,或 Files download),并携带攻击者可控的 id。工作流令牌随后会 GET /api/2.0/secrets/get。如果该令牌可以读取该 scope(典型的工作区管理员 PAT),节点输出就是密钥的 value JSON。
没有 secrets ACL 的令牌仍会返回 403;但这仍能证明请求已离开 /genie。Files download 需要更深的 ../(更长的前缀)。需要有一个受害者将不受信任的输入绑定到该参数。锁定过的 HTTP Request 节点(allowedHttpRequestDomains: none)并不能替代对 Databricks id 进行编码。
同一产品,同类遗留问题:hidden 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 响应体包含该 witness。
已记录的弯路:请求停留在 /api/2.0/genie/spaces/ 之下(此时 .. 被编码——实验要求它离开);将 n8n 主机 RCE 视为 SUCCESS;攻击真实工作区;反弹 shell。都是做戏。witness 是 N8N-DBX-SECRET-WITNESS 加上 mock 请求行。
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。仅限回环实验环境。无任何担保。