
n8n 경로 순회(CWE-22) 취약점에 대한 개념 증명으로, Databricks 노드에서 인증되지 않은 웹훅 입력이 Genie 경로를 벗어나 워크스페이스 PAT 비밀을 유출하며, 루프백 랩을 포함합니다.
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도 함께 따라간다.
신뢰할 수 없는 웹훅 입력이 워크스페이스 토큰으로 GET /api/2.0/secrets/get이 된다. n8n 호스트 RCE가 아니라 Databricks에서의 자격 증명 유출이다.
| 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의 형제 취약점 |
| 인증 | 피해자 워크플로가 신뢰할 수 없는 입력을 바인딩한 경우 웹훅에서 인증 불필요 |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
공격자가 제어하는 id를 사용해 Databricks Genie get-space(또는 Vector Search get-index, 또는 Files download)로 흘러 들어가는 공개 웹훅, 채팅, 또는 HTTP 트리거를 때린다. 그러면 워크플로 토큰이 /api/2.0/secrets/get을 GET한다. 해당 토큰이 스코프를 읽을 수 있다면(일반적인 워크스페이스 관리자 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의 랩 목은 GET /api/2.0/secrets/get에 N8N-DBX-SECRET-WITNESS로 응답한다. n8n은 :18202에 있다. 웹훅 dbx-space는 JSON에서 spaceId를 바인딩한다. 목 접근 로그: GET /api/2.0/secrets/get?scope=s&key=k. 웹훅 본문에 위트니스가 들어 있다.
이미 기록된 잘못된 길: 요청이 /api/2.0/genie/spaces/ 아래에 머무는 것(그러면 ..가 인코딩됨 - 랩은 그것이 벗어나기를 요구한다); n8n 호스트 RCE를 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
VectorStoreDatabricks와 마찬가지로 모든 Databricks 경로 id를 toPathSegment로 감싼다.
getSpace.operation.ts · toPathSegment · DatabricksVectorStore.tsGNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.