Por que existe um grande atraso depois de inserir uma senha errada?

89

Percebo uma coisa estranha (bem, na minha opinião) sobre senhas. Por exemplo, se eu digitar uma senha incorreta durante o login, haverá um atraso de alguns segundos antes que o sistema me informe. Quando tento sudocom uma senha errada, também tenho que esperar antes que o shell diga "Desculpe, tente novamente".

Eu me pergunto por que demora tanto para "reconhecer" uma senha incorreta? Isso foi visto em várias distribuições que eu uso (e até no OSX), então acho que não é uma coisa específica da distribuição.

phunehehe
fonte
Percebi isso não apenas no terminal, mas também no login da sessão inicial após a inicialização ou quando o laptop está no modo de suspensão. Desbloquear na senha correta é instantânea, porém, feliz de ver estas questões levantadas :)
krozaine

Respostas:

92

Isso é uma coisa de segurança, não está demorando muito para perceber. 2 vulnerabilidades que isso resolve:

  1. isso limita as tentativas de logon, o que significa que alguém não pode usar o sistema o mais rápido possível, tentando quebrá-lo (1 milhão de tentativas por segundo? não sei).

  2. Se o fizesse assim que verificasse que suas credenciais estavam incorretas, você poderia usar o tempo necessário para invalidar suas credenciais para ajudar a adivinhar se parte de suas credenciais estava correta, reduzindo drasticamente o tempo de adivinhação.

Para evitar essas duas coisas, o sistema leva um certo tempo para fazer isso, acho que você pode configurar o tempo de espera com o PAM ( consulte a resposta de Michaels ).

A Engenharia de segurança ( 2ed, amazon | 1ed, free ) fornece uma explicação muito melhor desses problemas.

xenoterracida
fonte
4
// offtopic g não é um bug, é uma característica ;-)
echox
2
O link do seu afiliado foi reescrito automaticamente para SE, btw.
Gelatina
1
@Tshepang: Veja o capítulo 2 , particularmente os §2.4 e §2.5.3.3.
Gilles
4
A diferença entre falha precoce e tardia ao comparar um hash de senha é medida em nanossegundos. Com a codificação adequada (comparação de memória de tempo constante), não há nenhuma diferença. Isso não é justificativa para adicionar um atraso.
código é o seguinte
2
Concordo com CodesInChaos: O segundo ponto da resposta está incorreto. O que realmente está acontecendo é o seguinte: 1. um hash da sua entrada é calculado; 2. esse hash é comparado ao hash armazenado (cada byte dele, mesmo que já tenha sido encontrada uma diferença); Observe que essas duas etapas não são de forma alguma mais rápidas ou mais lentas, dependendo se a senha digitada estava correta. (e como outros já apontaram, a adição de uma duração do sono não consertaria um ataque de tempo, se fosse possível)
exemplo
41

Isso é intencional, tentar limitar a força bruta. Geralmente, você pode modificá-lo procurando a FAIL_DELAYentrada de configuração /etc/login.defse alterando seu valor (o meu é 3segundos por padrão), embora o comentário nesse arquivo pareça que o PAM imporá pelo menos um 2segundo atraso, não importa o que

Michael Mrozek
fonte
9
Isso é para evitar mais do que apenas forçar brutos. mas pontos de bônus por saber onde configurá-lo.
Xenoterracide
5
Eu acho que o fail_delay também é configurável /etc/pam.d/login. Procurepam_faildelay.so delay=
Steven D
8
o que impede que você escreva um wrapper para o sudo que inicie uma nova instância do sudo depois que uma tentativa não funcione em, digamos, 0,1 segundos?
Janus Troelsen
11

Nos sistemas linux modernos, o motivo é que o pam_unix.so impõe esse atraso. Conforme relatado anteriormente, isso pode ser configurado em até dois segundos, alterando FAIL_DELAY-o /etc/login.defs. Se você deseja reduzir ainda mais o atraso, é necessário dar ao pam_unix.so a opção "nodelay". Por exemplo, no meu sistema, se você rastrear as inclusões a partir de /etc/pam.d/sudo, você precisará editar a seguinte linha de /etc/pam.d/system-auth:

auth      required  pam_unix.so     try_first_pass nullok

e mude para isso:

auth      required  pam_unix.so     try_first_pass nullok nodelay

Infelizmente, da maneira como minha distribuição Linux (arch) configura as coisas, esse mesmo system-autharquivo é incluído por system-remote-login, o qual é usado pelo sshd.

Embora seja seguro eliminar o atraso no sudo, porque ele é registrado, usado apenas por usuários locais e ignorável pelos invasores locais de qualquer maneira, você provavelmente não deseja eliminar esse atraso para logins remotos. Obviamente, você pode corrigi-lo escrevendo um sudo personalizado que não inclui apenas os arquivos de autenticação do sistema compartilhados.

Pessoalmente, acho que o atraso no sudo (e ignorar o SIGINT) é um grande erro. Isso significa que os usuários que sabem que digitaram incorretamente a senha não podem interromper o processo e ficar frustrados. Obviamente, você ainda pode parar o sudo com Ctrl-Z, pois o sudo não captura o SIGTSTP e, depois de interrompê-lo, você pode matá-lo com o kill -9 (SIGKILL). É apenas chato de fazer. Isso significa que um ataque automatizado pode disparar sudos em pseudo-terminais a uma taxa super alta. Mas o atraso frustra usuários legítimos e os incentiva a suspender suas conchas raiz em vez de sair deles para evitar ter que sudo novamente.

user3188445
fonte
1
O mesmo com o Fedora. Análise impressionante
Freedom_Ben
Resposta brilhante. Eu também estava pensando que FAIL_DELAY se tornou obsoleta nos modernos sistemas de desktop. Você deve confiar na criptografia da partição / disco rígido e nada mais. Normalmente, não há outro usuário que possa tentar usar a senha de root de força bruta. No entanto , programas potencialmente maliciosos podem abusar de um FAIL_DELAY inseguro e, assim, obter acesso root.
phil294
definir pam-unix como nodelaydefinirá o tempo de espera para 0, a propósito, e FAIL_DELAY será ignorado.
phil294
Por que não desativar o atraso e depois desativar o login com senha remota (somente SSH)? Isso não resolve o problema sem introduzir nenhuma vulnerabilidade de segurança?
Radon Rosborough