n8n 주요 보안 취약점 분석 및 대응 방안


1. 개요

최근 오픈소스 워크플로우 자동화 플랫폼 n8n에서 CVSS 만점(10.0)의 치명적인 보안 취약점(CVE-2026-21858, Ni8mare)이 발견되었습니다. 해당 취약점은 인증 없이 원격에서 서버의 제어권을 완전히 탈취할 수 있는 매우 심각한 보안 위험입니다.

 

현재 n8n은 기업과 개인 개발자들 사이에서 업무 자동화를 위해 널리 사용되고 있으나, 범용 OS나 웹 서버(Apache/Nginx 등)에 비해 사용자 기반은 상대적으로 제한적입니다. 따라서 이번 취약점이 대규모 인터넷 장애를 일으키거나 일반 대중에게 즉각적인 사회적 파급력을 미칠 가능성은 낮을 것으로 판단됩니다. 그러나 n8n을 도입해 민감한 데이터 처리나 내부 시스템 연동을 자동화하고 있는 조직의 경우, 표적형 공격(Targeted Attack) 발생 시 치명적인 피해를 입을 수 있습니다. 따라서 해당 솔루션을 운영 중인 조직은 신속히 현황을 파악하고 보안 조치를 취해야 합니다.


2. 취약점

  • CVE-2026-21858 (Ni8mare)

본 취약점은 n8n의 웹훅(Webhook) 처리 모듈에서 수신 데이터의 형식(Content-Type)을 검증하는 과정에서 발생합니다. 정상적인 JSON 요청과 파일 업로드 요청을 구분하는 로직에 결함이 있어, 공격자가 헤더를 조작하여 전송할 경우 서버가 이를 잘못 해석하여 처리하게 됩니다. 이로 인해 외부 입력값이 내부 시스템 객체에 직접적인 영향을 미칠 수 있습니다.

  • CVE-2026-21877

본 취약점은 n8n이 사용자로부터 파일을 업로드 받을 때, 파일 형식(확장자 및 MIME Type)에 대한 검증이 미흡하여 발생합니다. 정상적인 문서나 이미지 파일 외에, 시스템에서 실행 가능한 위험한 형식의 파일(스크립트 등)까지 별다른 제한 없이 서버에 저장되는 결함이 존재합니다.

  • CVE-2025-68613 (Expression Injection)

본 취약점은 n8n 워크플로우에서 데이터 처리를 위해 사용되는 표현식(Expression) 엔진의 샌드박스 격리 조치가 불충분하여 발생합니다. 사용자 정의 자바스크립트 코드는 제한된 가상 환경에서 실행되어야 하지만, 특정 우회 기법을 통해 Node.js의 핵심 시스템 객체(process, require 등)에 직접 접근할 수 있습니다.

  • CVE-2025-68668 (N8scape)

본 취약점은 n8n이 Python 코드를 실행하기 위해 사용하는 Pyodide(WebAssembly 기반 런타임) 환경에서의 샌드박스 격리 실패로 인해 발생합니다. 설계상 외부 시스템과 분리된 가상공간에서 코드가 실행되어야 하지만, 구현상의 결함으로 인해 내부의 Python 코드가 논리적 경계를 넘어 호스트 운영체제(Host OS) 영역에 접근할 수 있습니다.

  • CVE-2025-65964

본 취약점은 n8n의 Git 노드(Git integration node)가 사용자 입력값(저장소 URL, 커밋 메시지 등)을 처리하는 과정에서 발생합니다. 운영체제의 시스템 쉘을 통해 Git 명령어를 호출할 때, 입력값에 대한 특수 문자 필터링(Sanitization)이 미흡하여, 공격자가 의도한 시스템 명령어가 함께 실행될 수 있는 결함입니다.


3. 분석

3-1. CVE-2026-21858: Ni8mare

  • 기본 정보

- 취약점 유형: 인증 비필요 원격 코드 실행 Unauthenticated RCE)

- 심각도: Critical (CVSS 10.0)

- 영향 버전: v1.65.0 ~ v1.120.4

- 패치 버전: v1.121.0 이상

  • 발생 원인

n8n의 웹훅(Webhook) 핸들러, 특히 parseRequestBody() 미들웨어에서 Content-Type 헤더에 대한 검증 로직이 미흡(Content-Type Confusion)하여 발생합니다. 시스템은 수신된 요청이 단순 데이터(application/json)인지 파일 업로드(multipart/form-data)인지 명확히 구분해야 하나, 공격자가 헤더를 조작할 경우 서버가 이를 오인하여 처리하는 결함이 존재합니다.

  • 공격 흐름

- 컨텍스트 혼란 유도 (Context Confusion): 공격자는 Content-Type을 조작하여, 일반적인 JSON 데이터 요청을 마치 파일 업로드 요청인 것처럼 서버가 처리하도록 유도합니다.

- 내부 파일 조회 (LFI): 요청 본문 객체(req.body.files)를 덮어씌우는 기법을 통해, n8n 내부의 설정 파일(config)이나 데이터베이스(SQLite) 파일을 강제로 읽어 들입니다.

- 자격 증명 탈취 (Credential Theft): 조회된 파일에서 관리자 계정 정보 또는 세션 서명에 필수적인 비밀 키(Secret Key)를 추출합니다.

- 권한 우회 및 원격 코드 실행 (Auth Bypass & RCE): 탈취한 키를 이용해 관리자 세션 쿠키를 위조하여 로그인 없이 관리자 권한을 획득합니다. 이후 Execute Command 노드 등을 워크플로우에 추가하여 서버상에서 임의의 코드를 실행(RCE)합니다.

  • 핵심 위협

- Zero-Click Attack: 공격자가 인증 없이 단일 HTTP 요청만으로 공격이 가능합니다.

- Complete Takeover: 단순 정보 유출에 그치지 않고, 서버의 최고 권한(Root/Admin)을 탈취하여 시스템을 완전히 장악할 수 있는 가장 치명적인 위협입니다.

  • 대응 방안

- 즉시 보안 업데이트 (Immediate Patching): 가장 근본적인 해결책은 n8n 버전을 v1.121.0 이상 (권장 v1.122.0+)으로 업그레이드하는 것입니다. 해당 버전에서는 parseRequestBody 미들웨어의 검증 로직이 수정되어 LFI 공격이 차단됩니다.

- 보안 키 교체 (Key Rotation - 필수): (중요) 만약 취약한 버전을 운영 중이었다면, 이미 공격자에 의해 N8N_ENCRYPTION_KEY 등의 비밀 키가 유출되었을 가능성이 높습니다. 패치 후에도 기존 키를 계속 사용하면 공격자가 언제든 다시 관리자 권한을 획득할 수 있으므로, 반드시 기존 키를 폐기하고 새로운 키를 생성하여 재설정해야 합니다.

- 네트워크 격리 (Network Isolation): 패치가 불가능한 상황이라면, n8n 인스턴스가 공용 인터넷(Public Internet)에 직접 노출되지 않도록 조치해야 합니다. 접근 제어 목록(ACL)을 통해 신뢰할 수 있는 IP 대역만 웹훅에 접근하도록 제한하거나, VPN 내부망 안으로 서비스를 격리합니다.

- 웹방화벽(WAF) 정책 적용: HTTP 요청 헤더의 Content-Type과 실제 바디(Body) 형식이 일치하지 않는 비정상적인 트래픽을 차단하는 보안 룰을 적용하여 공격 시도를 탐지 및 방어합니다.

3-2. CVE-2025-68613: Expression Injection

  • 기본 정보

- 취약점 유형: 인증된 원격 코드 실행 (Authenticated RCE)

- 심각도: Critical (CVSS 9.9)

- 영향받는 버전: v0.211.0 ~ v1.120.4 (특정 구간 포함)

- 패치 완료 버전: v1.122.0 이상

  • 발생 원인

n8n 워크플로우 내에서 데이터 변환 및 로직 처리를 위해 사용되는 표현식(Expression) 엔진의 샌드박스(Sandbox) 격리 실패가 원인입니다. 사용자가 입력한 자바스크립트 코드는 외부 시스템과 분리된 제한된 환경에서만 실행되어야 하나, 특정 우회 기법을 통해 Node.js의 핵심 시스템 객체(process, require 등)에 직접 접근할 수 있는 경로가 존재했습니다.

  • 공격 흐름

- 악성 코드 주입 (Injection): 워크플로우 편집 권한을 가진 공격자(또는 탈취된 계정을 사용하는 해커)가 노드의 파라미터 입력창에 샌드박스 우회 로직이 포함된 악성 자바스크립트 구문(Payload)을 주입합니다.

- 샌드박스 탈출 (Sandbox Escape): 워크플로우가 실행되어 n8n이 해당 표현식을 평가(Evaluate)하는 시점에, 공격 코드가 보안 샌드박스의 논리적 경계를 우회하여 호스트 시스템의 프로세스 영역으로 진입합니다.

- 원격 명령 실행 (RCE): 샌드박스를 벗어난 코드는 호스트의 시스템 쉘(Shell)을 호출하거나 리버스 쉘(Reverse Shell)을 연결하여, 서버 운영체제 상에서 임의의 명령어를 실행합니다.

  • 핵심 위협

- 권한 기반 위협 (Authenticated Threat): 공격자가 '로그인 권한'을 확보해야 한다는 전제 조건이 있지만, 내부 직원에 의한 위협(Insider Threat)이나 계정 탈취 사고 시 방어 체계가 무력화됩니다.

- Default Credential Risk: 외부에 노출된 n8n 인스턴스가 기본 계정(admin/password)이나 취약한 비밀번호를 사용하고 있을 경우, 공격자가 손쉽게 로그인하여 즉각적인 시스템 장악(Takeover)을 수행할 수 있습니다.

  • 대응 방안

- 보안 패치 적용 (Patch Management): n8n 버전을 v1.122.0 이상으로 업그레이드합니다. 최신 버전에서는 표현식 엔진의 샌드박스 메커니즘이 강화되어, process 객체 등 위험한 Node.js 내장 기능에 대한 접근이 원천 차단됩니다.

- 계정 및 접근 권한 관리 강화 (IAM & RBAC): 강력한 패스워드 정책 - 기본 계정(admin/password) 사용을 금지하고, 복잡도가 높은 비밀번호 사용을 강제해야 합니다. 최소 권한 원칙 - 워크플로우를 생성하거나 수정할 수 있는 권한은 신뢰할 수 있는 관리자에게만 부여하고, 일반 사용자에게는 '조회(Read-only)' 권한만 부여하는 등 역할을 엄격히 분리합니다.

- 위험 노드 실행 제한 (Configuration Hardening): NODES_EXCLUDE 환경 변수를 사용하여 n8n-nodes-base.executeCommand와 같이 시스템 명령어를 실행할 수 있는 노드의 사용을 비활성화합니다. 이를 통해 계정이 탈취되더라도 공격자가 RCE를 수행할 수 있는 도구를 제한할 수 있습니다.

- 모니터링 (Monitoring): n8n 로그에서 자식 프로세스(Child Process) 생성을 유발하거나, 비정상적인 쉘 명령어(sh, bash, curl 등) 호출 패턴이 있는지 지속적으로 감시합니다.

3-3. CVE-2025-68668: N8scape

  • 기본 정보

- 취약점 유형: Python 샌드박스 우회 (Python Sandbox Bypass)

- 심각도: Critical (CVSS 9.9)

- 영향받는 버전: v1.0.0 ~ v2.0.0 미만

- 패치 완료 버전: v2.0.0 이상 (Native Task Runner 도입)

  • 발생 원인

n8n의 Python Code Node 실행을 담당하는 Pyodide(WebAssembly 기반 Python 런타임) 환경의 보안 격리 실패가 원인입니다. Pyodide는 본래 브라우저나 Node.js 환경 내에서 격리된 상태로 Python을 실행하도록 설계되었으나, n8n의 특정 구현 방식에서 이 가상 환경의 제약을 넘어 호스트 시스템으로 탈출할 수 있는 설계적 허점이 발견되었습니다.

  • 공격 흐름

- 악성 노드 구성 (Malicious Node Setup): 워크플로우 편집 권한을 가진 공격자가 Python Code Node를 워크플로우에 추가합니다.

- 가상 환경 탈출 (Sandbox Breakout): 공격자는 Pyodide 가상 환경의 메모리나 실행 제약을 우회할 수 있도록 특수하게 조작된 Python 코드를 작성하여 실행합니다.

- 호스트 시스템 침해 (Host System Compromise): 탈출에 성공한 코드는 호스트 서버의 파일 시스템에 직접 접근하여 민감한 파일을 읽거나, 실행 중인 다른 프로세스를 조작합니다.

  • 핵심 위협

- 호스트 시스템 직접 침해 (Host System Compromise): 단순히 애플리케이션 레벨의 침해가 아닙니다. 보안 격리벽(Sandbox)을 완전히 무력화하기 때문에, 공격자는 서버 운영체제(OS)의 파일 시스템과 프로세스에 직접 접근하여 제어할 수 있습니다.

- 권한 상승 및 데이터 유출: n8n 프로세스가 실행 중인 권한(Docker의 경우 주로 Root, 호스트의 경우 해당 사용자 권한)을 그대로 행사할 수 있습니다. 이를 통해 서버 내의 민감한 정보(환경 변수, SSH 키, DB 접속 정보 등)를 탈취하거나 시스템을 파괴할 수 있는 고위험군 취약점입니다.

  • 대응 방안

- 시스템 업그레이드 및 아키텍처 전환 (Upgrade to v2.0+): 권장 조치 - n8n 버전을 v2.0.0 이상으로 업그레이드합니다. v2.0부터는 Python 코드를 실행할 때 기존의 취약한 방식 대신, 보안이 대폭 강화된 Native Task Runner 아키텍처가 기본 적용됩니다. 이를 통해 코드 실행 프로세스가 메인 프로세스와 물리적으로 분리되어 샌드박스 탈출이 구조적으로 차단됩니다.

- 취약 기능 비활성화 (Disable Feature): 즉시 업그레이드가 불가능한 경우, 환경 변수 설정을 통해 문제가 되는 Python 노드 기능을 비활성화해야 합니다. 설정 값 - N8N_PYTHON_ENABLED=false (또는 N8N_DISABLE_PYTHON_NODES=true 등 버전별 확인 필요)

- 컨테이너 권한 최소화 (Least Privilege on Docker): Root 실행 금지 - Docker 환경에서 n8n을 구동할 때, 컨테이너 내부 프로세스가 Root 권한으로 실행되지 않도록 설정해야 합니다. (PUID/PGID 설정 또는 User Remapping 적용) 이를 통해 만약 샌드박스가 뚫리더라도, 공격자가 호스트 시스템의 핵심 파일(System Files)을 수정하거나 파괴하는 것을 방지할 수 있습니다.


4. 대응

  • CVE-2026-21858: Ni8mare

공격자가 req.body.file 파라미터에 악성 JSON 데이터를 주입하여 서버 내부 파일을 유출할 수 있는 취약점입니다. /etc/passwd 와 같은 일반적인 시스템 파일 접근 시도는 LFI 패턴으로 탐지가 가능하며, /home/node/.n8n/database.sqlite 등 n8n 고유 경로 및 파일에 대한 접근은 기존 범용 패턴에서 누락되는 미탐 사례가 확인되기도 합니다. 이에 n8n 설정 파일 및 DB 확장자(.sqlite, config 등)를 식별할 수 있는 전용 패턴을 적용해야 합니다. 단, 해당 취약점은 공격 성공 조건이 까다롭고 실질적인 위험도가 낮으므로 패턴 적용 시 가용성을 고려하여 신중히 검토해야 합니다.

  • CVE-2025-68613: Expression Injection

낮은 권한의 계정으로 워크플로우를 생성할 때, 표현식 입력값에 대한 검증 미흡을 악용하여 악성 스크립트를 주입하는 SSTI(Server Side Template Injection) 유형입니다. JavaScript SSTI 대응 패턴을 통해 해당 공격 시도를 탐지 및 차단할 수 있습니다.

  • CVE-2026-21877: Malware Injection

Git Workflow 노드 및 파일 시스템을 이용한 악성코드 은닉 가능성이 제기되었으나, 현재까지 구체적인 익스플로잇 코드나 상세 메커니즘은 확인되지 않았습니다. 현시점에서 즉각적인 차단 정책 적용은 과오탐 우려가 있습니다. 향후 기술 분석 정보가 구체화되는 시점에 맞춰 지속적인 모니터링을 수행하고, 대응 정책을 수립해야 합니다.


5. 참고

'Vulnerability' 카테고리의 다른 글

🔥Anthropic Mythos란 무엇인가  (0) 2026.04.23

+ Recent posts