
n8n의 CVE-2025-68613 취약점에 대한 기술 연구로, 영향을 받는 버전, 실험실 탐색 시나리오, 공격 및 방어 분석, 그리고 완화 전략을 다룹니다.
n8n은 시각적 흐름과 JavaScript 표현식을 통해 시스템과 서비스를 통합하는 데 사용되는 워크플로 자동화 플랫폼입니다.
CVE-2025-68613은 치명적인 원격 코드 실행(RCE) 취약점으로, CVSS 9.9 점수를 가지며 여러 n8n 버전에 영향을 미칩니다. 이 결함은 취약한 버전의 워크플로에서 JavaScript 표현식 처리 시 제대로 격리되지 않아 발생합니다. 이로 인해 편집 권한이 있는 인증된 사용자가 애플리케이션의 예상 동작 범위를 벗어나 코드를 실행할 수 있습니다.
실제로 이 결함은 n8n이 실행 중인 서버에서 애플리케이션 자체 권한을 사용하여 명령을 실행하도록 악용될 수 있습니다. 영향을 받는 버전은 0.211.0부터 1.120.4, 1.121.1, 1.122.0에 적용된 수정 사항 이전 버전까지입니다.
이 저장소는 CVE-2025-68613을 기술적으로 문서화하며, 결함의 맥락, 영향을 받는 버전, 악용 및 권장 완화 조치를 다룹니다.

| 상태 | n8n 버전 | 참고 |
|---|---|---|
| ❌ 영향 받음 | >= 0.211.0 | 취약 메커니즘 도입 |
| ❌ 영향 받음 | < 1.120.4 | 1.120 브랜치 패치 전까지 취약 |
| ❌ 영향 받음 | < 1.121.1 | 1.121 브랜치 패치 전까지 취약 |
| ❌ 영향 받음 | < 1.122.0 | 1.122 브랜치 패치 전까지 취약 |
| ✅ 수정됨 | 1.120.4 | 공식 수정 적용 |
| ✅ 수정됨 | 1.121.1 | 공식 수정 적용 |
| ✅ 수정됨 | >= 1.122.0 | 기본적으로 수정 사항 포함 |
즉시 1.122.0 이상 버전으로 업데이트할 것을 권장합니다.
취약점을 시연하려면 다음 조건이 필요합니다:
이 결함은 인증 전이 아니라 워크플로 생성 및 실행 중에 발생합니다.
첫 번째 단계는 유효한 사용자로 n8n 웹 인터페이스에 로그인하는 것입니다.

이 단계는 공격이 익명이 아님을 확인합니다. 이 취약점은 인증된 사용자가 필요합니다.
로그인 후 사용자에게 워크플로를 생성하고 편집할 수 있는 권한이 있는지 확인합니다.

이는 이 액세스 수준을 가진 사용자만 워크플로에 동적 표현식을 삽입할 수 있기 때문에 중요합니다.
인증된 사용자로 처음부터 새 워크플로를 생성합니다.

여기서부터 취약한 버전에서 악용될 수 있는 n8n 기능의 정상적인 사용이 시작됩니다.
워크플로에 추가되는 첫 번째 노드는 수동 트리거입니다.

이 노드의 역할: 워크플로를 수동으로 실행할 수 있게 하며, 흐름의 시작점으로 사용됩니다.
이 시나리오에서는 워크플로 실행을 위한 진입점 역할만 합니다.
두 번째로 추가되는 노드는 Edit Fields (Set)입니다.

이 노드의 역할: 이 노드는 워크플로 내에서 데이터 필드를 생성, 수정 또는 덮어쓸 수 있게 합니다. 정적 값 또는 실행 시 평가되는 JavaScript 표현식을 허용합니다.
취약점이 나타나는 지점은 정확히 이 부분입니다.
Edit Fields (Set) 노드의 값 필드 안에 {{ }}로 감싼 JavaScript 표현식을 삽입합니다. 이 형식은 n8n이 동적 표현식을 평가하는 데 사용하는 형식입니다.

예시 페이로드:
{{ (function(){
return this.process.mainModule
.require('child_process')
.execSync('id')
.toString()
})() }}
(function(){ ... })(): 자체 호출 함수를 정의하여 모든 로직을 캡슐화하고 값을 워크플로 표현식에 직접 반환할 수 있게 합니다.this.process: 런타임 정보와 리소스를 노출하는 Node.js 내부 process 객체에 접근합니다.process.mainModule: 애플리케이션의 메인 모듈에 접근할 수 있게 하여 다른 내부 Node.js 모듈을 로드할 수 있게 합니다.require('child_process'): 운영 체제에서 새 프로세스를 생성하고 외부 명령을 실행할 수 있게 하는 Node.js 네이티브 모듈입니다.execSync('id'): n8n이 실행 중인 운영 체제에서 애플리케이션 프로세스 권한을 사용하여 명령을 직접 실행합니다..toString(): 실행된 명령의 출력을 텍스트로 변환하여 결과를 n8n 인터페이스에 표시할 수 있게 합니다.표시된 결과는 명령이 n8n 프로세스 권한을 사용하여 운영 체제에서 실행되었음을 확인하며, 이는 원격 코드 실행(RCE)에 해당합니다.