Algoritimo contra Brute-force – algoritmo segurança

Pergunta:


Estive pensando em um algoritmo contra ataques do tipo Brute-force que, como vimos no caso do iCloud, pode gerar grandes dores de cabeça se tratado com indiferença.

Inicialmente eu pensei neste fluxo:

Tentativa de login:

[define uma session "tentativas" para o usuário (caso ainda não exista)]

[incrementa o valor da session em 1]

[faz a verificação no banco]

[login correto: efetua login][login errado: volta à pagina de login]

[verifica o número de tentativas da session]

[ >= 5: bloqueia tela de login por 1 min][ < 5: Deixa tentar denovo]

Uma verificação apenas com sessões seria suficiente? Ou valeria a pena adicionar cookies, ou algum outro método de checagem?

Autor da pergunta Kazzkiq

Resposta Comunidade:

A resposta do utluiz dá uma boa visão geral, além de chamar a atenção pra um ponto importante: se sua “segurança” é de menos, você é alvo de um ataque de força bruta; se é demais, você é alvo de um ataque de DoS.

Como resolver isso, não vou arriscar a opinar, pois também não sou especialista em segurança. Mas se seu objetivo é simplesmente evitar que um único usuário [arbitrário, é claro] seja hackeado (i.e. alguém tenta fazer login diversas vezes com o mesmo nome de usuário e senhas diferentes), uma solução viável é aumentar progressivamente o “custo” de se fazer login com esse usuário:

  • A cada tentativa de login mal sucedida, aumente um pouco o intervalo de tempo necessário para se tentar de novo com aquele usuário (não importando de onde venha esse login).
  • Se o número passar de um certo limite (digamos, 3) peça um captcha junto com o login.
  • Se ele aumentar ainda mais, envie um e-mail alertando o usuário do fato (mas não necessariamente bloqueando-o).
  • Se o número for excessivo (e aí não vou arriscar dizer o que seria excessivo) aí sim bloqueie aquela conta de usuário.

Você pode fazer o mesmo por endereço IP, para dificultar um pouco os ataques mais simples, mas como já dito isso é melhor feito fora da camada de aplicação. E de todo modo, uma medida dessa tem mais chance de afetar negativamente um usuário legítimo (ex.: esqueci minha senha, mas lembro que é uma dentre as A, B, C e D) do que um invasor (que já espera esse tipo de medida de segurança e toma ações proativas para evitá-las).

P.S. Complementando, lembre-se que um hash de senhas bem feito também ajuda a proteger contra ataques de força bruta, e que uma autenticação em dois fatores é um modo ainda melhor de se garantir contra o roubo de senhas (que em geral são fracas, tornando um desafio enorme protegê-las não importa o método escolhido).

Aviso: não sou especialista em segurança ou neste tipo de ataque.

Cookies e Sessão não resolvem

Cookies e Sessão não são locais adequados para colocar este tipo de segurança.

Cookies são responsabilidade do cliente (geralmente o navegador), portanto facilmente manipuláveis.

A Sessão do usuário, apesar de ficar no servidor, é apenas uma estrutura de dados associada a um identificador, que geralmente fica num Cookie ou então na URL através do URL Rewriting.

Nos dois casos acima, requisições com o intuito de realizar um ataque de força bruta precisam simplesmente simular um novo usuário a cada requisição, como se fosse alguém que tivesse acabado de abrir o navegador, fazendo com que o servidor gere automaticamente uma nova sessão.

Segurança não é só da aplicação

Ataques que envolvem o uso maciço da rede como este ou DoS (Negação de Serviço) geralmente são mais bem tratados por Firewalls ou Proxies que filtram excesso de requisições.

Deixar isso a cargo da aplicação vai trazer uma complexidade para ela e vai fazer a equipe despender tempo implementando algo que não faz parte do escopo do sistema. Essa distração quase sempre vem a custo de um sistema com menos qualidade.

E o IP?

Uma técnica simples, porém ingênua, seria limitar o número de requisições usando o endereço IP.

Isso funciona num ataque simples, oriundo de apenas uma fonte. Entretanto, ataques distribuídos mais sofisticados irão controlar diversas fontes e acaba sendo muito difícil diferenciar uma requisição “normal” de uma automatizada.

Como detectar ataques?

Falando em diferenciar, aí é que está toda a questão. Como detectar o padrão de requisições artificiais geradas pelos ataques das requisições genuínas originadas pelos usuários?

A resposta a esta pergunta faz com que seja possível evitar ataques de força bruta de forma efetiva.

Não tentarei responder isso aqui, já que será assunto de debate por especialistas em segurança.

Até consigo pensar em pequenas técnicas para dificultar a ação de um hacker, mas em última análise, sempre será possível que ele identifique essas técnicas e ajuste o ataque.

Talvez usar um captcha ou “teste de humano” equivalente seja uma das formas mais efetivas hoje, porém muitas vezes atrapalha a usabilidade e também há garantias de que não possa ser implementado um algoritmo automatizado que resolva esses desafios.

Considerações

O objetivo desta resposta é informar aos desenvolvedores de aplicações web para não tentar reinventar a segurança usando técnicas “ingênuas”. Ao mesmo tempo, quero dizer que a segurança deve ser uma preocupação, mas exige um estudo mais aprofundado, ferramentas adequadas e consulta a especialistas.

A verificação usando apenas a sessão é, na minha opinião, insuficiente!

Recomendo o bloqueio da conta após um certo número de tentativas, e proceder com o envio de um e-mail com uma senha temporária (no máximo 12 horas) para a troca da senha “esquecida”.

NÃO RECOMENDO O USO DE COOKIE PARA VALIDAÇÕES DE SEGURANÇA!

É muito fácil alterar os dados de cookie dada a algumas ferramentas que já pude experimentar.

Leitura recomendada, pelo menos para iniciar:
http://en.wikipedia.org/wiki/Session_hijacking

Aviso: não sou especialista em segurança ou neste tipo de ataque

Modo 1

Um modo que eu utilizo e que você pode utilizar também é bloquear o LOGIN/EMAIL após errar 5 vezes a senha.

O LOGIN/EMAIL só é desbloqueado após alterar a senha ( manda um link para o e-mail cadastrado p/ ele digitar uma nova senha )

Um problema nessa técnica é que torna possível bloquear contas alheias – obrigado
@Daniel Omine

Modo 2

Utilizar Captcha

Li todas as respostas e concordo com todas na generalidade. No entanto gostaria de introduzir o tema da capacidade de resposta do servidor ou do conjunto de servidores.

Mas antes e olhando para a pergunta quero acrescentar que, na minha opinião, um sistema deve de ser capaz e sem prejudicar os reais utilizadores em detrimento dos supostos “hackers” implementar uma política de autenticação que não bloqueie. No entanto e se o fizer… que coloque um arsenal de ferramentas para o próprio resolver a situação que por certo não criou. Utilizador insatisfeito é um utilizador que não quer utilizar o serviço.

Portanto e na minha opinião o utilizador primeiro.

Depois e no seguimento do meu primeiro paragrafo… Dizer que perante o algoritmo apresentado o numero de tentativas terá de ser guardado, mas possivelmente só depois de verificado na base de dados o total de tentativas antes de incrementar.

Tanto a gravação desse incremento como a validação do mesmo tem de ser bem orientados, pois tratando-se de uma base de dados como indicado e de um ataque “brutal force” as chamadas irão suceder-se e certamente o bloquear de nada resolverá pois o serviço poderá ser entupido com tantos acessos que apesar do esforço de implementação do contador este nunca será eficaz.

Portanto, a segurança ao nível da autenticação de credenciais não se irá restringir apenas a essa questão. Na resposta do @utluiz a frase:

Segurança não é só da aplicação

faz todo o sentido e se possível ver o panorama todo.

Para terminar dizer como exemplo que tenho estado envolvido num projeto de um “gestor de identidades” e posso dizer que o serviço contem mais do que um servidor HTTP depois estes acedem a cluster próprio para validar credenciais junto da pool de dados.

Até chegar aqui muitos são os processos de segurança utilizados, no entanto e para mim um dos melhores é esta separação, onde me coloca a possibilidade de definir nos servidores de base de dados os IP’s dos servidores de HTTP que podem aceder, sem permitir qualquer outro acesso.

E mesmo assim é exigida uma boa monitorização.

É claro que nenhuma das técnicas já mencionadas resolve o problema por completo. Com o que temos disponível, podemos fazer conforme muitos já falaram aqui:

  • Errou a senha mais de 3 vezes, usa session e solicita um captcha.
  • Errou a senha mais de 2 vezes, acertando o captcha, bloqueia o ip por 2 minutos.
  • Caso aconteca o segundo bloqueio de IP, bloquea a conta e solicita desbloqueio!

Tem gente confundindo com ataque DDoS que tem como objetivo atingir a fonte, parando sua aplicação e todas as demais que compartilharem do mesmo servidor, ou seja, ninguém vai acessar nada, inclusive você!

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *