User-Agents, Controle de Acesso e Monitoramento
Notei um padrão interessante nos testes que fiz em aplicativos para Android e iOS nos últimos meses: o uso do campo User-Agent para controle de acesso.
O cenário*: através do aplicativo, é possível acessar o formulário de login e todas as funcionalidades. Analisando um pouco mais percebi que o aplicativo era, na verdade, um navegador embutido que apenas exibia as respostas de uma aplicação. Mas quando tento utilizar outro navegador para acessar a URL do aplicativo, recebo como resposta 403 Forbidden:
A primeira coisa que me veio à mente é que o campo user-agent da requisição seja verificado para permitir o acesso à aplicação que roda no servidor. E isso é fácil de resolver usando o User Agent Overrider (Firefox) ou User Agent Switcher (Chrome) para preenchendo o campo por um valor conveniente. Então, analisando novamente a requisição feita pelo aplicativo é possível ver qual o User-Agent utilizado:
E usando o User Agent Overrider, consigo mudar para valor correto.
E problema resolvido.
Ou seja: como é possível para o cliente modificar facilmente o campo User-Agent, esta não pode ser considerada uma forma eficaz de controle de acesso.
Agora, vamos fazer uma pausa aqui e ver o que a RFC 2616 (Hypertext Transfer Protocol -- HTTP/1.1) fala a respeito do campo:
14.43 User-Agent The User-Agent request-header field contains information about the user agent originating the request. This is for statistical purposes, the tracing of protocol violations, and automated recognition of user agents for the sake of tailoring responses to avoid particular user agent limitations. User agents SHOULD include this field with requests. The field can contain multiple product tokens (section 3.8) and comments identifying the agent and any subproducts which form a significant part of the user agent. By convention, the product tokens are listed in order of their significance for identifying the application.
Vemos uma boa dica no uso apresentado na RFC (“fins estatísticos, rastrear violações de protocolo e reconhecimento automático de navegadores para adequar respostas…”). O campo pode não ser uma boa para controle de acesso, mas talvez seja interessante para detectar ataques automatizados. Guardadas, claro, suas limitações (já que o valor do campo pode ser modificado pelo usuário - e é configurável na maior parte dos scanners).
Com isso em mente, fiz uma pequena pesquisa sobre os valores enviados no campo User-Agent por várias ferramentas. A coleta dos dados foi feita através da execução do software com suas opções default contra um servidor Apache rodando a DVWA e um simples servidor web em Python. No primeiro cenário, configurei o Apache para criar um arquivo de log apenas com o User-Agent das requisições; no segundo, o próprio script armazena o conteúdo do campo em um arquivo.
Coloquei o resultado aqui.
Note que esse tipo de monitoramento pode ser útil para script kiddies ou algum atacante mais desleixado, mas dificilmente será tão eficiente contra alguém que sabe o que está fazendo. A informação, entretanto, ajuda que a aplicação e WAFs façam pelo menos um tratamento preliminar.
Fique à vontade para colaborar com User-Agents de outras ferramentas!
* Simulei o cenário em laboratório, para evitar expôr informações de outros. ;)
Referências:
Resultados dos testes
User Agent Overrider (Firefox)
User Agent Switcher (Firefox e Chrome)
RFC 2616 (Hypertext Transfer Protocol -- HTTP/1.1)
Servidor web em Python utilizado nos experimentos
Configuração de logs do Apache















