Segurança Web · 8 min read · Jan 04, 2026
Apresentando o Remo - Uma Maneira Fácil de Proteger uma Aplicação Online Insegura com ModSecurity
Apresentando o Remo - Uma Maneira Fácil de Proteger uma Aplicação Online Insegura com ModSecurity
Diga que você tem uma aplicação desagradável em seu servidor web Apache que foi instalada por alguns idiotas do departamento de marketing e você não pode nem corrigir nem removê-la. Talvez seja um problema de recursos, falta de know-how, falta de código-fonte ou possivelmente até mesmo devido a razões políticas. Consequentemente, você precisa protegê-la sem tocá-la. Existe o ModSecurity, mas dizem que isso é apenas para especialistas. Uma alternativa simples é o Remo, um editor gráfico de regras para ModSecurity que vem com uma abordagem de lista branca. Ele tem tudo o que você precisa para bloquear a aplicação.
Para os fins deste tutorial, usaremos uma aplicação de teste realmente simples. Uma que é tão feia que nem mesmo seu departamento de marketing gostaria de tê-la por perto. Mas ei, é apenas um tutorial.
';
echo $_POST['command'];
echo '
';
system($_POST['command'], $retval); # needed for 'ls' commands
echo '';
echo 'Return value: ' . $retval; echo '
'; echo ''; ?>
ls.php: Um pequeno script que é melhor você remover do seu site enquanto pode.A execução direta de qualquer comando shell postado na forma do parâmetro command torna ls.php um convidado indesejado em praticamente qualquer servidor web - ou um caso de teste perfeito para experimentar o Remo a fim de protegê-lo dos perigos deste script. Então, o que é o Remo? No site remo.netnea.com você aprenderá que ele é destinado a ser uma maneira simples de configurar o ModSecurity sem se tornar um especialista em segurança primeiro. O segundo ponto é que o Remo escreve regras de lista branca, enquanto a maioria das pessoas usa o ModSecurity com uma abordagem de lista negra. A lista negra significa que você informa ao ModSecurity tudo sobre todos os ataques conhecidos. A lista branca faz o contrário: ela garante que sua aplicação receberá apenas a entrada que você realmente deseja que ela receba. Assim, ls.php receberá apenas comandos ls como seu parâmetro de comando e, além disso, você garantirá que nenhum truque sujo seja possível usando crase e ponto e vírgula dentro do parâmetro. Para resumir: o Remo ajuda a fazer validação de entrada no servidor sem tocar na aplicação.
Instalação
Você pode experimentar o Remo na demonstração online na página inicial. Essa funciona bem quando você quer testar o Remo sem instalá-lo primeiro. A instalação também não é muito difícil, mesmo sem pacotes de distribuição prontos para a data. Certifique-se de ter ruby, irb e bindings ruby-sqlite3 instalados antes de baixar.
Eu fiz o seguinte na minha caixa de teste Ubuntu; deve funcionar para Debian também:
aptitude install ruby irb libsqlite3-ruby1.8Quanto ao Remo, você pode baixar um release ou pegar um snapshot da árvore de subversão mais recente. A página de download do Remo informa quais árvores passaram em todos os testes de unidade. Vamos supor que baixamos e instalamos um release. Vá para a página de download e pegue o release beta 0.2.0. Descompacte o tarball e inicie o servidor WEBrick rails. A partir da linha de comando, isso se resume a:
wget http://remo.netnea.com/files/remo-0.2.0.tar.gz
tar xvzf remo-0.2.0.tar.gz
cd remo-0.2.0
ruby script/server
direct browser to http://localhost:3000/main/indexVocê deve obter algo como isto:

Remo como ele aparece após a instalação.Estamos um pouco apressados aqui, pois este tutorial deve ser breve. Portanto, mostrarei apenas as coisas necessárias para proteger a aplicação de teste. Uma espécie de guia prático. Há muito tempo para você explorar o Remo por conta própria.
Protegendo a Aplicação
Remova todas as solicitações padrão na janela e crie uma nova.

Adicionando uma nova solicitação ao Remo.Clique no texto clique para editar e insira o caminho da sua aplicação: /ls.php, em seguida, altere o método http para POST. Abra os detalhes da solicitação e adicione um novo parâmetro post usando o botão p* ao lado dos parâmetros post. Clique no nome (clique para editar) e mude para command. Este é o parâmetro enviado pela nossa aplicação de exemplo ls.php.
À direita do nome está o domínio de valor do parâmetro. Esta é a parte central do Remo. Aqui você define quais valores são aceitáveis para o parâmetro. Lembre-se, isso é lista branca: estamos definindo exatamente o que é aceitável. Existem alguns valores pré-definidos, mas teremos que optar por Personalizado neste caso. Se você abrir os detalhes do parâmetro command, há um campo chamado regex personalizado. É aqui que o Remo procura a regex quando o domínio de valor é Personalizado. Eu usarei ls[0-9a-zA-Z-\x20_.]{0,64}. Este é o comando ls seguido por um grupo opcional de caracteres consistindo de números, letras, hífen, o espaço, caractere sublinhado e ponto. Sem ponto e vírgula, sem barras, sem crases, sem umlauts alemães, sem especialidades unicode: Este é seu servidor e você não quer que nada de errado aconteça aqui.

Proteção para ls.php está a caminho com a definição do parâmetro POST command.Uma solicitação que não atender a essa condição falhará. O comportamento padrão do Apache para uma solicitação que falha será retornar um código de status http 501: Método Não Implementado. Mas vamos ser legais: como código de status (falha na correspondência de domínio) você insere 302 para redirecionamento http e abaixo, em Localização (falha na correspondência de domínio), você insere a URL da sua empresa como http://www.netnea.com. Assim, alguém que não fornecer o parâmetro correto será redirecionado para o site da sua empresa. Na verdade, você pode tornar o parâmetro obrigatório clicando em opcional e abaixo você pode definir um comportamento especial para a condição obrigatória falhada também. Mas, em nosso caso, o parâmetro não precisa ser de caráter obrigatório.
Se você está se perguntando como esse parâmetro de expressão regular será transformado em uma regra ModSecurity, então dê uma olhada na seguinte imagem:

É assim que uma configuração de parâmetro Remo é traduzida em uma regra ModSecurity.Ela descreve como seu parâmetro Remo está sendo traduzido em uma regra ModSecurity e o que acontecerá durante a avaliação. Isso se resume a isto: Cada parâmetro de solicitação http é comparado ao domínio de valor definido no Remo e, se não se encaixar, então toda a solicitação é negada.
Colocando em Prática
Dito isso, vamos gerar o conjunto de regras ModSecurity. Clique no botão gerar na barra de ferramentas e salve o arquivo que você receberá. Este é o arquivo de regras na linguagem de regras ModSecurity. Pegue este arquivo e salve-o em um lugar onde o Apache possa encontrá-lo. Vale a pena dar uma olhada, aliás, para entender como o Remo usa o ModSecurity. Em seguida, você deve garantir que o ModSecurity esteja habilitado em seu servidor web. O Remo gera conjuntos de regras ModSecurity 2, pois houve uma grande atualização e extensão para a linguagem de configuração entre 1.9 e 2.0 e o Remo precisa desses novos recursos. Caso sua distribuição não forneça pacotes ModSecurity, você pode obter a maioria deles em http://www.modsecurity.org. Caso contrário, você sempre pode compilá-lo você mesmo. Não é muito complicado.
É melhor incluir seu arquivo de regras na configuração do apache da seguinte forma:
Include /etc/apache2/rulefile.conf
Em seguida, recarregue seu apache e faça um teste (estou usando a ferramenta de linha de comando curl na demonstração, mas seu navegador funcionará bem):
curl --data "command=ls -l" http://localhost/ls.php-rw-r--r-- 1 sam staff 353 Feb 7 13:05 index.html
-rw-r--r-- 1 sam staff 248 Apr 23 05:35 ls.php
...Então isso ainda funciona. Que tal um abuso do ls.php?
curl --data "command=ls -l; cat /etc/passwd" http://localhost/ls.php
302 Encontrado
Encontrado
O documento foi movido aqui.
Apache/2.2.3 (Debian) PHP/5.2.0-8 Servidor em railsmachine Porta 80
Pegamos o atacante! Há um log de auditoria definido no arquivo de configuração. Por padrão, isso está em /var/log/apache2/modsec_audit.log. Ele será lido como o seguinte em nosso caso:
...
--2957a220-H--
Mensagem: Acesso negado com redirecionamento para http://www.netnea.com usando status 302 (fase 2).
Correspondência de "rx ^(ls\x20[0-9a-zA-Z-_.]{0,64})$" contra "ARGS:command" exigida. [id "1"]
[msg "Postparameter command falhou na verificação de validade. Domínio de valor: Personalizado."] [severity "ERROR"]
Ação: Interceptado (fase 2)
...Antes de ir para o modo de produção, certifique-se de que este log não esteja crescendo muito. Na verdade, você pode querer desativar muitos logs quando terminar a configuração. O arquivo de log é configurado pelo Remo para fazer log completo de solicitações para fins de depuração por padrão. Isso inclui tudo, até senhas. Quando você terminar os testes, deve definir o parâmetro SecAuditLogParts no arquivo de regras para um valor mais razoável. ABHZ é uma opção. Dessa forma, ele registra apenas cabeçalhos http e o resumo de auditoria do ModSecurity.
Então, este foi um rápido resumo do Remo. Há mais a ser encontrado no site do Remo. ModSecurity.org tem uma ótima documentação que lhe diz tudo sobre a linguagem de configuração. Além disso, há um conjunto de regras principais que o ajudará em situações em que você não tem tempo para modelar sua aplicação no Remo. O conjunto de regras principais é sempre um bom começo, pois capturará 90% dos ataques com muito pouco esforço.
O Remo está longe de ser maduro, mas está pronto para uso e, dado um base de usuários útil, pode se desenvolver em uma ferramenta interessante para proteger aplicações web. Sua aplicação não precisa ser tão simples quanto a usada neste tutorial. Aplicações maiores com dezenas de URLs e muitos parâmetros também funcionam bem.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.