Proof-of-concept для path-traversal (CWE-22) в n8n в узлах Databricks: неаутентифицированный ввод через webhook выходит за пределы пути Genie и приводит к утечке секретов PAT рабочего пространства, с лабораторией на loopback.
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, а не RCE на хосте n8n.
| 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, чату или HTTP-триггеру, который передаёт данные в Databricks Genie get-space (или Vector Search get-index, или Files download) с контролируемым атакующим идентификатором. Токен рабочего процесса затем выполняет GET к /api/2.0/secrets/get. Если этот токен может читать область (типичный PAT администратора рабочего пространства), вывод узла — это JSON со значением секрета value.
Токен без ACL на секреты всё равно получит 403; но это всё равно доказывает, что запрос ушёл за пределы /genie. Для скачивания файлов нужен более глубокий ../ (более длинный префикс). Нужна жертва, которая привязала недоверенный ввод к этому параметру. Заблокированный узел HTTP Request (allowedHttpRequestDomains: none) не заменяет кодирование идентификаторов Databricks.
Тот же продукт, родственный остаток: скрытая Function vm2.
Тот же проход по остаткам, что и в лаборатории Function: десять поисков на [email protected] после волны GHSA от 16 сентября 2026 года. Поиск инъекций в узлы искал неполные родственные случаи GHSA-89p4 (идентификаторы ресурсов Public API) и GHSA-rqch (имя таблицы Supabase). Elastic, Adalo, Currents, сам узел n8n. Хелпер существует, потому что они уже проиграли эту битву. Databricks nodes-base его не вызывает.
Я не нацеливал это на реальное рабочее пространство. Мок лаборатории на :18203 отвечает на GET /api/2.0/secrets/get значением N8N-DBX-SECRET-WITNESS. n8n на :18202. Webhook dbx-space привязывает spaceId из JSON. Журнал доступа мока: GET /api/2.0/secrets/get?scope=s&key=k. Тело webhook содержит свидетеля.
Уже зафиксированные неверные повороты: запрос, остающийся под /api/2.0/genie/spaces/ (тогда .. кодировался — лаборатория требует, чтобы он ушёл); трактовка RCE на хосте n8n как SUCCESS; обращение к реальному рабочему пространству; обратная оболочка. Театр. Свидетель — это N8N-DBX-SECRET-WITNESS плюс строка запроса мока.
cd lab
./run.sh
Цель — только http://127.0.0.1:18202 (n8n) и :18203 (мок). Хост учётных данных — это мок, а не реальное рабочее пространство.
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
Оборачивайте каждый идентификатор пути Databricks с помощью toPathSegment, так же как VectorStoreDatabricks.
getSpace.operation.ts · toPathSegment · DatabricksVectorStore.tsGNU Affero GPL v3.0. См. LICENSE. Только лаборатория на loopback. Без гарантий.