En una aplicación web, una forma de protegerse contra los ataques de adivinación de contraseñas es bloquear las cuentas después de un número determinado de inicios de sesión fallidos. Esto se puede hacer tanto en la dirección IP de origen como en el nombre de usuario.
Por ejemplo, la siguiente tabla muestra lo que sucede cuando se detectan intentos repetidos. El sistema está configurado para bloquear cuentas después de 3 inicios de sesión fallidos dentro de una ventana de 5 minutos, durante 5 minutos.
IP Time Username Creds Correct? Message Given
203.0.113.1 10:00:00 [email protected] N Bad username or password
203.0.113.1 10:00:01 [email protected] N Bad username or password
203.0.113.1 10:00:02 [email protected] N Bad username or password
203.0.113.2 10:00:03 [email protected] N Bad username or password
203.0.113.1 10:00:04 [email protected] N Login locked from your location
203.0.113.2 10:00:05 [email protected] Y Welcome!
203.0.113.2 10:00:06 [email protected] N Account locked
203.0.113.2 10:00:07 [email protected] Y Welcome!
203.0.113.1 10:01:00 [email protected] Y Login locked from your location
203.0.113.1 10:05:03 [email protected] Y Welcome!
Los intentos de inicio de sesión solo cuentan cuando se validan las credenciales (el proceso es verificar el bloqueo antes de validar las credenciales; si están bloqueadas, las credenciales no se validan).
Como se puede ver en lo siguiente, un usuario malintencionado (en IP 203.0.113.3
) puede bloquear una cuenta que causa una Denegación de Servicio al adivinar repetidamente la contraseña incorrecta a propósito:
IP Time Username Creds Correct? Message Given
203.0.113.3 10:06:00 [email protected] N Bad username or password
203.0.113.3 10:06:01 [email protected] N Bad username or password
203.0.113.3 10:06:02 [email protected] N Bad username or password
203.0.113.3 10:06:03 [email protected] N Account locked
203.0.113.10 10:07:00 [email protected] Y Account locked
203.0.113.10 10:07:04 [email protected] Y Account locked
203.0.113.10 10:07:08 [email protected] Y Account locked
203.0.113.10 10:07:15 [email protected] Y Account locked
203.0.113.10 10:07:25 [email protected] Y Account locked
... impidiendo que el usuario real en 203.0.113.10
inicie sesión.
Una alternativa a esto es retrasar artificialmente la respuesta HTTP. Diga los primeros retrasos de inicio de sesión fallidos en 1 segundo, el segundo en 2 segundos, el tercero en 4 y así sucesivamente hasta un total de 16 segundos. Si su cuenta está siendo atacada, el usuario verá un círculo giratorio en su navegador mientras espera la respuesta HTTP a su solicitud de inicio de sesión.
¿Hay algún inconveniente a esto? Lo anterior ahora se vería como el siguiente (digamos que hay un retraso de 1 segundo como predeterminado, debido a las iteraciones de bcrypt):
IP Req Time Resp Time Username Creds Correct? Message Given
203.0.113.3 10:06:00 10:06:01 [email protected] N Bad username or password
203.0.113.3 10:06:01 10:06:03 [email protected] N Bad username or password
203.0.113.3 10:06:03 10:06:08 [email protected] N Bad username or password
203.0.113.3 10:06:08 10:06:17 [email protected] N Bad username or password
203.0.113.10 10:06:18 10:06:35 [email protected] Y Welcome!
Tenga en cuenta que el retraso artificial (cuando está activo) es a través de subprocesos, lo que significa que el atacante no puede enviar solicitudes desde una única IP a una velocidad mayor. Un inicio de sesión de una IP diferente no está en cola, aunque seguirá experimentando cualquier retraso artificial generado por intentos incorrectos en el nombre de usuario.
Como puede ver, al usuario en 203.0.113.10
no se le niega el acceso; simplemente tiene que esperar 17 segundos para que se complete su inicio de sesión, mientras que el atacante tiene que retrasar su ataque. Por lo tanto, es eficaz en la prevención de ataques de adivinación de contraseñas.
Mi pregunta es ¿cuáles son los aspectos negativos de este enfoque y por qué no ve este tipo de enfoque con más frecuencia en lugar del bloqueo general que puede causar la denegación de servicio para los usuarios?