Suas aplicações são seguras?

Conheça a Conviso!

WAF – Um pouco sobre Web application firewall

WAF, O que é?

Web Applicaiton Firewall ou simplesmente WAF como é conhecido, é um software que trabalha entre o servidor HTTP/S e cliente, filtrando entradas do cliente e saídas do servidor WEB,  seguindo sempre regras de segurança e graças a esse conjunto de regras é possível registrar ataques e bloquear.

 

É possível encontrar diversas funcionalidades em WAFs, como blacklist, onde temos uma lista de endereços IP a serem bloqueados, funções para controle de banda e até mesmo bloqueio de ataques Denial of Service (DoS).

Quais são os WAFs Open Source disponíveis no mercado? Quais suas qualidades e defeitos?

No mundo Open Source podemos encontrar alguns como FreeWAF[1] e Naxsi[2], todos com a mesma característica, que é ser um módulo para o  servidor web como NGINX. Embora seja prático e ganhe um desempenho considerável por estar dentro do servidor HTTP, nem sempre  é uma solução portável.  Dependendo da aplicação podemos encontrar um servidor HTTP próprio, algo por exemplo com LibMongose, ou libmicrohttpd nestes  casos o WAF não funcionaria, já que é feito para ser módulo de apenas alguns servidores específicos.

Embora maioria dos WAFs Open Source tenham poder para minimizar algum problema de Cross-site scripting e SQL injection,  não são uma solução  definitiva de proteção, isso decorrente a evolução dos ataques. Regras necessitam de uma otimização constante, muitas vezes,  mesmo otimizando as regras ainda temos uma falha, o que pode comprometer a aplicação protegida.

Problemas de carga: Quando o WAF roda como um módulo do servidor de aplicação, ainda temos outro problema que é a negação de serviço causada por excesso de processamento. Isso pode acontecer por um volume grande de regras sendo processadas ou por ataques específicos que exploram o funcionamento do módulo de WAF.

  Conheçam o Raptor, mais uma opção em WAF Open Source

raptor2_waf

Ano passado desenvolvi um WAF em linguagem C chamado Raptor[4], decorrente a uma necessidade de testar ataques em WAFs e ver seu comportamento com cada payload, isso até foi tema para uma apresentação do TDC sobre WAF (veja aqui). Raptor  usa uma lógica simples usando Proxy reverso com a função select() para multiplexação[5], e um filtro simples para analisar requests utilizando autômato finito determinístico (DFA). Caso os DFAs identifiquem um padrão de ataque, o ataque é bloqueado e é feito um registro no log.

O propósito principal do Raptor é possibilitar o estudo de ataques e novas formas de mitigações, seu código fonte é simples, feito 100% em linguagem C e sem nenhuma dependência com biblioteca externa, usa a metodologia KISS (Keep It Simple, Stupid), ou seja, um princípio geral que valoriza a simplicidade do projeto e defende que toda a complexidade desnecessária seja descartada.

Lembrando uma quote do livro a arte da guerra:

“Conheça o inimigo e a si mesmo e você obterá a vitória sem qualquer perigo; conheça terreno e as condições da natureza, e você será sempre vitorioso.” – Sun Tzu

A vantagem de usar proxy reverso é que podemos ter um servidor dedicado para a função de WAF, caso o servidor tenha muita e carga e caia, você pode fazer algo redundante, usando por exemplo, protocolo protocolo CARP[3] com PF, ou seja caso um firewall com WAF caia, então irá usar outro em seu lugar, tudo de forma automática.

Outra vantagem de usar proxy reverso seria que independente do servidor HTTP sendo Apache, IIS, NGINX, Lighttpd, iria funcionar da mesma forma, portabilidade é algo que ajuda durante a implantação do sistema.

Hoje podemos ver que a maioria dos fabricantes de WAF usam esta estratégia de proxy reverso, isso torna o recurso mais portável e não é preciso ter mais recursos no servidor de aplicação para evitar um consumo excessivo e perda de desempenho.

Testando o Raptor

Suponhamos que você esteja em um sistema operacional Linux…

Passo 1:
Para obter o código fonte do Raptor:
$ git clone https://github.com/convisoappsec/raptor
$ cd raptor; make

Caso retorne algum erro na compilação, por favor, entre em contato comigo. Para mais informações consulte o PDF no diretório Doc.

Agora para testar precisamos subir um servidor HTTP, suponhamos que já tenha um nginx trabalhando na porta 80 e com PHP.

Então vamos criar um código chamado “test.php”, totalmente vulnerável a Reflected Cross-Site Scripting, e logo vamos fazer upload para o servidor web:

Se tudo der certo você poderá ver o formulário em “http://localhost/test.php”.

Passo 2:
Para subir o WAF podemos executar o seguinte comando no diretório do WAF:
$ bin/Raptor -h localhost -p 80 -r 8885 -w 4 -o test_vulns.txt

Note que o argumento “-w” seria para especificar o modo do WAF, no caso, modo 4 não seria case sentive, já o argumento “-o” podemos ver nosso arquivo de logs com registros dos ataques.

Passo 3:
Então podemos testar acessando http://localhost:8885/test.php  e escrevendo um payload de XSS no formulário:

Formulário exemplo test.php

Podemos ver que a Request foi bloqueada pelo WAF:

Ataque bloqueado

Verificando os Logs:

logview_raptor

O WAF também conta com uma função de blacklist, para usa-la basta editar o arquivo “config/blacklist_ip.txt”, adicionando novos endereços IP para bloquear.

Isso foi suficiente para mostrar o potencial do WAF? Não, pois embora esteja funcional, ainda esta em fase de construção. Veja só este teste com o DFA de bloqueio.

attackrate

Ou seja, de 509 ataques, foram detectados 349, 68% dos ataques foram bloqueados:

meta-chart(1)

Os testes com o DFA de bloqueio podem ser encontrados no diretório doc do projeto, o DFA não está 100% efetivo no bloqueio entretanto está em constante desenvolvimento.

 

Para o futuro:

  • Melhorar o DFA do filtro de bloqueio.
  • Testar epoll(), kqueue() e libevent, se for o caso, efetuar uma troca de função.
  • Implementar SSL/TLS.
  • Adicionar interface Web para controle com Auth e plots etc…
  • Interpretador para regras de bloqueio.

 

Referências:

[1]- https://github.com/p0pr0ck5/FreeWAF
[2]- https://github.com/nbs-system/naxsi
[3]- http://openbsd.das.ufsc.br/faq/pf/pt/carp
[4]- https://github.com/convisoappsec/raptor
[5]- https://www.gnu.org/software/libc/manual/html_node/Waiting-for-I_002fO

UNIX Network Programming – W. Richard Stevens – http://www.unixnetworkprogramming.com/

 

Tags

2 comentários

  • Gostei muito do seu post amigo, me chamo Paulo, sou estudante do 4º ano de CCP e meu tcc será exatamente sobre WAF. Gostei muito de sua metodologia, se precisar de alguma ajuda no aperfeiçoamento de seu projeto me deixa saber, não tenho muito conhecimento, mas tenho muita sede de aprender.

Deixe uma resposta

Seu endereço de e-mail não será publicado.

topo