
n8n 경로 순회(CWE-22) 취약점에 대한 개념 증명으로, Databricks 노드에서 인증되지 않은 웹훅 입력이 Genie 경로를 벗어나 워크스페이스 PAT 비밀을 유출하며, 루프백 랩을 포함합니다.
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도 함께 따라간다.
신뢰할 수 없는 웹훅 입력이 워크스페이스 토큰으로 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이다.
시크릿 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 (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와 마찬가지로 모든 Databricks 경로 id를 toPathSegment로 감쌉니다.
getSpace.operation.ts · toPathSegment · DatabricksVectorStore.tsGNU Affero GPL v3.0. LICENSE를 참조하십시오. 루프백 실험실 전용입니다. 보증은 제공되지 않습니다.