Quer saber o que é Remote Code Execution e quais passos seguir para prevenir vulnerabilidades na sua aplicação?
Para entender como campos como formulários, parâmetros de consulta e até cookies podem tornar a aplicação vulnerável a ataques, vamos primeiramente abordar o que é server side e como o Remote Code Execution pode ser uma vulnerabilidade explorada do lado do servidor.
Portanto, se você quer entender o que é Remote Code Execution e como tornar as suas aplicações mais seguras por meio de uma abordagem Shift-Left, continue lendo este artigo!
Trouxemos aqui algumas dicas para minimizar a exposição a ataques e criar o software de maneira menos vulnerável desde o desenvolvimento.
Remote Code Execution vs. XSS
Antes de entrarmos propriamente no tema do artigo, vamos deixar aqui uma pequena nota.
Este é um dos primeiros textos que vamos publicar com o objetivo de explicar algumas vulnerabilidades que encontramos com mais facilidade na web, quais seus impactos e como podemos ter ações básicas para impedir a exploração dessas vulnerabilidades.
Neste primeiro artigo vamos explicar o que é Remote Code Execution ou RCE.
É importante deixar claro que o RCE é diferente da vulnerabilidade XSS encontrada no OWASP Top 10, mesmo que está também seja uma vulnerabilidade onde há o uso de injeção de códigos.
A diferença básica é que o RCE é uma vulnerabilidade que explora uma fragilidade server-side, ou seja, o código enviado será executado do lado do servidor.
Já no XSS, por exemplo, o código utilizado explora uma fragilidade do lado do cliente, geralmente usando o browser do usuário para retornar com o dado ou a informação desejada.
Mas, temos que lembrar que ambas as vulnerabilidades são perigosas e trazem para a estrutura de aplicações uma série de riscos, conforme vamos detalhar a seguir. Confira!
Explicando o que é Remote Code Execution
Como comentamos acima, o RCE ou Remote Code Execution, é a exploração de uma fragilidade na aplicação que permite que o atacante envie um código malicioso para ser executado.
Para isso, ele usa a linguagem da aplicação e a exploração executada em server-side.
Basicamente, qualquer aplicação que não tenha um tratamento adequado dos dados nela inseridos acabam sendo vulneráveis a este tipo de ataque.
Com a quantidade de aplicações web que temos hoje, não é de se estranhar que esse tipo de aplicação acabe sendo o alvo predileto dos atacantes.
Como o Remote Code Execution funciona?
Como falamos anteriormente, para entendermos o que é o Remote Code Execution precisamos saber que se trata de uma fragilidade explorada do lado do servidor, server-side como é conhecido.
No entanto, para que possamos dizer que uma aplicação possa ser considerada vulnerável a RCE, duas condições básicas devem ser identificadas — ambas descritas de uma forma mais detalhada em CWE-94 e em CWE-95.
De forma geral, o CWE-94 descreve que, durante a construção de um software, este depende total ou parcialmente da introdução de dados.
No entanto, mesmo tendo a entrada de dados como parte fundamental do software, ele não realiza de forma adequada ações que possam neutralizar o uso arbitrário de códigos maliciosos.
Enquanto o CWE-94 fala sobre a necessidade de validar códigos e dados de entrada em um aplicativo, o CWE-95 trata da necessidade de tratamento de entradas das sintaxe de códigos antes delas serem processadas em uma chamada dinâmica (dynamic evaluation call).
Como os agem os atacantes
Mas temos que imaginar que um RCE se refere não apenas à entrada de dados e códigos por meio de um formulário, por exemplo.
Além dos formulários, atacantes podem usar parâmetros de consulta para realizar ataques de RCE — ou ainda cookies ou o envio de arquivos para a aplicação.
O fato é que a grande maioria desses meios não estão sob o controle do desenvolvedor.
O que está no controle do desenvolvedor é a introdução de mecanismos de validação tanto de dados quanto de parâmetros enviados à aplicação.
Porém, mesmo sabendo da necessidade de validação de dados de entrada, muitos desenvolvedores negligenciam este fato e deixam suas aplicações vulneráveis.
Então, a aplicação usa esses dados que não foram validados, tornando-se vulnerável.
Essa vulnerabilidade é geralmente explorada pelo uso inapropriado de funções como eval() no PHP — ou outras funções equivalentes em outras linguagens — além é claro da concatenação de strings enviadas pelo usuário.

Se os códigos maliciosos enviados pelo atacante forem processados pelo servidor, o ataque se confirma e o atacante terá acesso, server-side, ao interpretador da linguagem usada pela aplicação.
Então, se esta aplicação tem acesso a chamadas do sistema, o atacante pode escalar esta vulnerabilidade para executar comando no próprio servidor, permitindo agora a injetar comandos durante o ataque.
Como o Remote Code Execution pode ser corrigido?
A correção de uma vulnerabilidade como a RCE é basicamente a que acontece com outras vulnerabilidades da mesma categoria.
Uma construção de código, validada e testada durante o seu período de construção, terá maiores chances de estar livre desse tipo de vulnerabilidade.
No entanto, alguns pontos devem ser observados para que possamos ter uma menor chance de exposição às vulnerabilidades.
1. Validação e sanitização de entradas
Se a sua aplicação deve receber apenas um tipo de dado em um determinado campo, porque não limitar a este campo o dado esperado?
Essa é uma das ações mais básicas que podem ser implementadas e que pode resolver muitos problemas.
Ainda com relação a validação, busque por caracteres especiais, símbolos e caracteres usados pela linguagem usada na aplicação bem como no sistema operacional que dá suporte à aplicação.
2. Trate todos os dados como não confiáveis
Considerando que o desenvolvedor não tem controle sobre os dados inseridos pelo usuário, o campo em que há interação deve sempre ser tratado como não confiável.
Ou seja, toda vez em que há uma operação onde o usuário pode entrar com alguma fonte na aplicação, essa fonte deve ser rigidamente validada.
Isso permite filtrar os dados enviados ao sistema, de forma que eles estejam exatamente de acordo com o esperado, evitando possíveis erros e ataques.
3. Teste e valide seu código
Construa, na esteira de desenvolvimento, um processo que garanta que o seu código é validado em diversos momentos — e não somente no final.
A constante validação do código garante que a segurança dele seja testada em vários momentos do desenvolvimento, permitindo, assim, que falhas seja mais facilmente identificadas.
4. Limite o acesso ao interpretador
Ao configurar o seu servidor, garanta que o acesso ao interpretador está limitado e que o usuário possua privilégios apenas para executar a tarefa que precisa para a sua aplicação.
Dessa forma, as chances de um usuário mal intencionado conseguir acessar outras instâncias ficam reduzidas.
Todo cuidado é pouco
A partir do entendimento de o que é o Remote Code Execution, conseguimos elaborar esta pequena lista de tarefas que podem ser feitas para minimizar a possibilidade de existência de vulnerabilidades.
No entanto, não podemos determinar uma lista finita, estes são apenas algumas ações básicas que devem ser realizadas, mas que não devem de forma alguma responder por toda a gama de testes.
A criação deste artigo teve como objetivo a apresentação do RCE de forma simplificada, de forma que possa ser entendido por aqueles que atuam junto às equipes de segurança, mas que não tem tanto conhecimento técnico.
E mesmo àqueles que têm um conhecimento maior sobre o assunto — como os desenvolvedores, por exemplo, também podem se beneficiar deste artigo para relembrar o que é preciso fazer para manter as aplicações mais seguras.
Esperamos que desta forma possamos contribuir com uma melhor visão de AppSec para todos.