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 require está acessível no contexto do template (por exemplo, via require: require no render()).

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 ejs para a versão 3.1.7 ou superior.
  • Nunca passar entradas do usuário diretamente para ejs.render() sem validação.
  • Evitar tornar require acessí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

Leave a Reply

Your email address will not be published. Required fields are marked *