Impedindo ataques de enumeração de nome de usuário com o Spring Security

Impedindo ataques de enumeração de nome de usuário com o Spring Security

1. Visão geral

Neste tutorial, descreveremos os ataques de enumeração em geral. Mais especificamente, exploraremos os ataques de enumeração de nome de usuário contra um aplicativo da web. E, o mais importante, exploraremos as opções para lidar com eles por meio do Spring Security.

2. Explicando ataques de enumeração

Enumeration technically means complete and ordered listing of all the items in a collection. Embora essa definição seja restrita à matemática, sua essência o torna uma ferramenta de hacking potente. Enumeration often exposes attack vectors that can be employed for exploitation. Nesse contexto, costuma ser conhecido como enumeração de recursos.

A enumeração de recursos, como o nome sugere, é uma maneira de reunir uma lista de recursos de qualquer host. Esses recursos podem ter qualquer valor, incluindo nomes de usuários, serviços ou páginas. Esses recursos podem expor possíveis vulnerabilidades no host.

Agora, pode haver várias maneiras possíveis, exploradas ou mesmo inexploradas, de explorar essas vulnerabilidades.

In a web application, one of the most often employed enumeration attacks is username enumeration attack. Isso basicamente emprega qualquer recurso explícito ou implícito do aplicativo da web para reunir nomes de usuário válidos. Um invasor pode usar opções populares de nome de usuário para atacar o aplicativo Web.

Agora, que tipo de recurso em um aplicativo Web pode revelar se um nome de usuário é válido ou não? Honestamente, pode ser o mais variado possível. Pode ser um recurso projetado, por exemplo, uma página de registro que informa ao usuário que o nome de usuário já foi usado.

Ou isso pode ser tão implícito quanto o fato de que uma tentativa de login com um nome de usuário válido leva uma quantidade de tempo muito diferente em comparação com uma com um nome de usuário inválido.

4. Configuração para emular o ataque de enumeração de nome de usuário

Usaremos um aplicativo da web de usuário simples usando Spring Boot e Spring Security para demonstrar esses vetores de ataque. Este aplicativo da Web terá um conjunto mínimo de recursos para apoiar a demonstração. A detailed discussion on how to set up such an application is covered in a previous tutorial.

Recursos comuns em um aplicativo da Web geralmente revelam informações que podem ser usadas para iniciar ataques de enumeração. Vamos examiná-los.

4.1. Registro de Usuário

O registro do usuário precisa de um nome de usuário exclusivo e o endereço de email geralmente é escolhido por simplicidade. Agora, se escolhermos um email que já existe, o aplicativo deverá nos informar:

image

Juntamente com o fato de não ser difícil encontrar uma lista de emails, isso pode levar a um ataque de enumeração de nome de usuário para descobrir nomes de usuário válidos no aplicativo.

4.2. Login de usuário

Da mesma forma, quando tentamos fazer login em um aplicativo, é necessário fornecer nome de usuário e senha. Agora, se um nome de usuário que fornecemos não existir, o aplicativo poderá retornar essas informações para nós:

image

Isso, como antes, é simples o suficiente para aproveitar um ataque de enumeração de nome de usuário.

4.3. Redefinir senha

A redefinição de senha geralmente é implementada para enviar um link de redefinição de senha para o e-mail de um usuário. Agora, novamente, será necessário fornecer um nome de usuário ou email:

image

Se esse nome de usuário ou email não existir no aplicativo, ele será informado como tal, levando a uma vulnerabilidade semelhante à que vimos anteriormente.

5. Impedindo ataques de enumeração de nome de usuário

Pode haver várias maneiras de impedir um ataque de enumeração de nome de usuário. Many of them we can achieve through simple tweaks in the features like user messages on a web application.

Além disso, o Spring Security ao longo do tempo amadureceu o suficiente para suportar o manuseio de muitos desses vetores de ataque. Existem recursos prontos para uso e pontos de extensão para criar salvaguardas personalizadas. Exploraremos algumas dessas técnicas.

Vamos examinar as opções populares disponíveis para evitar esses ataques. Please note that not all of these solutions are suitable or even possible in every part of the web application. Discutiremos isso com mais detalhes à medida que prosseguirmos.

5.1. Ajustando Mensagens

Primeiro, devemos excluir todas as possibilidades de fornecer inadvertidamente mais informações do que o necessário. Isso seria difícil no registro, mas bastante simples no login e redefinir as páginas de senha.

Por exemplo, podemos facilmente tornar a mensagem para a página de login abstrata:

image

Podemos fazer ajustes semelhantes à mensagem da página de redefinição de senha.

5.2. Incluindo CAPTCHA

Embora ajustar as mensagens funcione bem em algumas páginas, há páginas como o registro em que é complicado fazer isso. Nesses casos, podemos usar outra ferramenta chamada CAPTCHA.

Agora, neste ponto, vale a pena observar que qualquer ataque de enumeração provavelmente é robótico devido a um vasto número de possibilidades para percorrer. Portanto,detecting a human or robotic presence can help us prevent an attack. CAPTCHA serve como uma maneira popular de conseguir isso.

Existem várias maneiras possíveis de implementar ou integrar serviços CAPTCHA em um aplicativo da web. Um desses serviços éreCAPTCHA by Google, which can be easily integrated on the registration page.

5.3. Limitação de taxa

Embora o CAPTCHA atenda bem ao objetivo, ele adiciona latência e, mais importante, inconvenientes aos usuários legítimos. Isso é mais relevante para páginas usadas com frequência, como login.

One technique that can help prevent robotic attacks on frequently used pages like login is rate limiting. A limitação de taxa refere-se à prevenção de tentativas sucessivas de um recurso após um determinado limite.

Por exemplo, podemos bloquear solicitações de um IP específico por um dia após três tentativas falhas no login:

image

A Spring Security torna isso particularmente conveniente.

Começamos definindo ouvintes paraAuthenticationFailureBadCredentialsEvent and AuthenticationSuccessEvent.. Esses ouvintes chamam um serviço que registra o número de tentativas malsucedidas de um determinado IP. Depois que um limite definido é violado, as solicitações subsequentes são bloqueadas emUserDetailsService.

5.4. Limitação geográfica

Além disso, podemos capturar a localização por país de um usuário durante o registro. Podemos usar isso para verificar uma tentativa de login originada em um local diferente. Se detectarmos um local incomum, ações adequadas podem ser tomadas:

  • Ativar o Captcha seletivamente

  • Impor autenticação de etapa (como parte da autenticação multifator)

  • Peça ao usuário para verificar o local com segurança

  • Bloquear o usuário temporariamente em solicitações sucessivas

Mais uma vez, o Spring Security, por meio de seus pontos de extensão, torna possível conectar um serviço de verificação de localização personalizado noAuthenticationProvider. A particular flavor of this has been described in detail in a previous tutorial.

5.5. Autenticação multifatorial

Por fim, devemos observar que a autenticação baseada em senha geralmente é a primeira e, na maioria dos casos, a única etapa necessária. Masit’s not uncommon for applications to adopt multi-factor authentication mechanisms for better security. Isto é especialmente verdade para aplicativos confidenciais como banco on-line.

Existem muitos fatores possíveis quando se trata de autenticação multifatorial:

  • Fator de conhecimento: refere-se ao que um usuário sabe, como PIN

  • Fator de posse: refere-se ao que um usuário possui, como um token ou smartphone

  • Fator de Inerência: refere-se ao que um usuário possui inerentemente, como impressões digitais

O Spring Security é bastante conveniente aqui também, pois nos permite conectar umAuthenticationProvider. personalizado. O aplicativo Google Authenticator é uma escolha popular para implementar o fator de posse adicional. Isso permite que os usuários gerem um token efêmero no aplicativo em seu smartphone e o usem para autenticação em qualquer aplicativo. Obviamente, isso requer a configuração prévia do usuário no aplicativo, durante o registro ou posteriormente.

Mais importante,a solution like multi-factor authentication is only suitable if the application needs it. Portanto, não devemos usá-lo principalmente para impedir ataques de enumeração.

5.6. Atrasos no tempo de processamento

Ao processar uma solicitação como um login, verificar se o nome de usuário existe é geralmente a primeira coisa que fazemos. Se um nome de usuário não existir, a solicitação retornará imediatamente com um erro. Pelo contrário, uma solicitação com um nome de usuário válido envolveria muitas etapas adicionais, como correspondência de senha e verificação de função. Naturalmente, o tempo para responder a ambos os casos pode variar.

Agora, mesmo que abstraiamos a mensagem de erro para ocultar o fato de um nome de usuário ser válido ou não, uma diferença significativa no tempo de processamento pode avisar um invasor.

Uma solução possível para esse problema pode ser adicionar um atraso forçado para descartar a diferença nos tempos de processamento. No entanto, como esse não é um problema que possa ocorrer com certeza, devemos empregar essa solução apenas se necessário.

6. Empacotando

Embora nós cobrimos muitos truques para usar quando se trata de ataques de enumeração de nome de usuário, é natural perguntar, quando usar o quê? Obviamente, não há uma resposta para isso, pois é amplamente baseado no tipo de aplicativo e seus requisitos.

Algumas coisas, como mensagens para o usuário, devem vazar o mínimo de informações possível. Além disso, é aconselhável restringir tentativas sucessivas com falha de um recurso como o login.

No entanto, devemos usar quaisquer medidas adicionais somente se os requisitos considerarem necessário. Também devemos ponderá-los racionalmente contra a dissuasão da usabilidade.

Além disso, é importante perceber que podemos aplicar qualquer combinação dessas medidas para diferentes recursos para protegê-los seletivamente.

7. Conclusão

Neste tutorial, discutimos ataques de enumeração - ataques de enumeração de nome de usuário, em particular. Vimos isso através das lentes de um aplicativo simples do Spring Boot com o Spring Security.

Examinamos várias maneiras de abordar progressivamente as preocupações dos ataques de enumeração de nome de usuário.

Por fim, discutimos a adequação dessas medidas na segurança de aplicativos.

Como sempre, o código dos exemplos está disponívelover on GitHub.