Skip to content

Command Injection

Command Injection (ou OS Command Injection) é uma vulnerabilidade que ocorre quando uma aplicação passa dados fornecidos pelo usuário para um comando do sistema operacional sem a devida validação ou sanitização.

Um atacante pode manipular esses dados para injetar comandos adicionais, que serão executados com os mesmos privilégios do processo da aplicação.

Imagine um endpoint que recebe um endereço IP e executa um ping para verificar conectividade:

String ip = request.getParameter("ip");
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("ping -c 4 " + ip);

Um usuário normal enviaria algo como 192.168.0.1, gerando o comando:

Terminal window
ping -c 4 192.168.0.1

Um atacante poderia enviar 192.168.0.1; cat /etc/passwd, gerando:

Terminal window
ping -c 4 192.168.0.1; cat /etc/passwd

O caractere ; encerra o primeiro comando e inicia um novo, fazendo com que o servidor execute cat /etc/passwd e retorne seu conteúdo.

Dependendo dos privilégios do processo da aplicação, um atacante pode:

  • Ler arquivos sensíveis do sistema (/etc/passwd, chaves privadas, arquivos de configuração com credenciais).
  • Executar comandos arbitrários no servidor, como instalar ferramentas maliciosas.
  • Escalar privilégios e comprometer outros sistemas na rede interna.
  • Deletar dados ou deixar a aplicação fora do ar.
  • Estabelecer um shell reverso, obtendo acesso interativo ao servidor.

A forma mais segura é não executar comandos de sistema. Utilize APIs nativas da linguagem ou do framework para a operação desejada — no caso de verificar conectividade, use bibliotecas de rede em vez de chamar ping.

Quando uma chamada ao sistema for inevitável, nunca concatene input do usuário ao comando. Passe os argumentos de forma separada e valide o input com uma allowlist antes de utilizá-lo.

String ip = request.getParameter("ip");
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("ping -c 4 " + ip);
if (!ip.matches("^[\\d.]+$")) {
throw new IllegalArgumentException("IP inválido");
}
ProcessBuilder pb = new ProcessBuilder("ping", "-c", "4", ip);
Process process = pb.start();