¿Qué está mal con este sistema de autenticación?

8

Soy un desarrollador de software con un interés y un nivel básico de conocimiento sobre seguridad. Me he encontrado con un sistema de autenticación que "me huele mal", pero me falta la experiencia para saber si algo está mal.

El sistema de software incluye servicios web para descargar y cargar datos de / a una base de datos a través de Internet pública. Toda la comunicación se produce a través de HTTPS y un número entero aleatorio de 32 bits identifica al usuario. Se eliminan las solicitudes de ID de usuarios desconocidos.

Algo sobre esto parece débil, pero no estoy seguro de cuán débil y si vale la pena defender el cambio. Supongo que esto es equivalente a una contraseña numérica alfa (mayúsculas / minúsculas) de 5 caracteres sin nombre de usuario asociado (log62 (4 billones) ~ 5) y si lo veo en esos términos parece completamente anémico.

Mi instinto instintivo sobre qué hacer para la autenticación habría sido exponer una operación de servicio web para "iniciar sesión" que toma un nombre de usuario / contraseña y devuelve un token de autenticación (por ejemplo, un hash criptográfico basado en las credenciales y el hora actual), que es válida durante un período de tiempo determinado o hasta que el usuario solicita un cierre de sesión.

Creo que mi enfoque es más seguro principalmente porque el espacio de credenciales es mucho más grande y porque el token de autenticación cambia con el tiempo, mientras que en el sistema actual el espacio de credenciales es pequeño y el token de autenticación nunca cambia. Pero no tengo un punto de referencia ... ¿contra qué tipo de adversario fallaría el sistema actual? ¿Contra qué tipo de adversario fracasaría mi idea?

El argumento en apoyo del sistema actual es que somos un jugador pequeño con clientes pequeños en un mundo grande, por lo que no esperamos ser atacados, y si somos atacados tenemos cierto nivel de seguridad. Mi idea es que las amenazas a la seguridad son cada vez más numerosas y sofisticadas con bastante rapidez, y nos encontramos en una industria en la que la seguridad es una preocupación. No quiero dar detalles aquí solo porque puedo estar señalando la existencia de un sistema en vivo mal protegido, pero ¿quizás alguien con conocimientos podría hablar sobre las tendencias actuales en amenazas de seguridad?

Agradecería cualquier comentario sobre este tema, y si por alguna razón mi pregunta es inadecuada, hágamelo saber para poder actualizarlo en consecuencia en lugar de marcarlo para que se cierre.

    
pregunta Paul 18.12.2013 - 19:52
fuente

2 respuestas

8

Supongo que los ID de usuario se atribuyen de forma aleatoria y uniforme entre los 2 32 posibles valores de 32 bits. En ese caso, lo mejor que puede hacer un atacante es probar las ID de usuario potenciales (valores de 32 bits) en cualquier orden hasta que se encuentre la correcta. Si hay una ID de usuario válida de N , el número promedio de intentos que el atacante deberá realizar estará cerca de 2 32 / (N + 1) : si hay mil usuarios, entonces el atacante necesitará conectarse aproximadamente 4 millones de veces a su servidor antes de que se le otorgue acceso. Una vez que el atacante obtiene acceso, puede reutilizar la ID a voluntad.

Su única defensa en ese caso es tratar de detectar dicho forzamiento brutal, por ejemplo. al prohibir las direcciones IP de las que provienen demasiados intentos fallidos. Esto tiene limitaciones; en particular, cuando muchas personas están detrás de algún tipo de proxy web o NAT , pueden, desde su punto de vista, compartir La misma dirección IP, por lo que corre el riesgo de desactivar una pérdida de usuarios con una estrategia de bloqueo. A la inversa, los atacantes pueden alquilar botnets para realizar su fuerza bruta única desde muchas direcciones IP distintas.

Una forma de verlo es, de hecho, considerar que el ID de usuario es algún tipo de contraseña; en esa vista, el atacante puede atacar las contraseñas de todos los usuarios simultáneamente. El nivel de seguridad se reduce así cuando hay más usuarios, como se puede ver en la expresión matemática anterior: más usuarios significa más objetivos para el atacante, sin aumentar el costo de búsqueda.

Una estrategia de inicio de sesión + contraseña es lo que hace la mayoría de las personas. Esto es mucho mejor: cuando se trata de forzar una contraseña bruta, el atacante debe seleccionar un nombre de usuario específico, y podrá romper solo esa contraseña específica. El "nombre de usuario" es una información no secreta que es específica para cada usuario. Con los nombres de usuario, la tarea del atacante ya no es mil veces más fácil cuando hay miles de usuarios. En cuanto al "token de sesión", hay varios métodos que son más o menos equivalentes (token en la URL, token como parámetro POST, token como encabezado HTTP, también conocido como "cookie"), y pronto); SSL en sí mismo tiene su propia noción de sesión y podría reutilizarse.

Resumen: el "ID de usuario secreto" sin estrategia de nombre de usuario puede ser seguro, pero solo si el espacio de la posible ID de usuario es lo suficientemente grande como para vencer la fuerza bruta , incluso si hay muchos ID de usuario válidos. Esto requiere un ID de usuario grande que debe seleccionarse de manera aleatoria y uniforme. 128 bits serían suficientes. 64 bits me pondrían bastante nervioso. 32 bits son demasiado pequeños.

    
respondido por el Thomas Pornin 18.12.2013 - 20:38
fuente
3

El argumento fácil es que 32 bits están bien dentro de los límites de fuerza bruta, dependiendo de cuántos ataques por segundo sea posible, probablemente tomará algo en el rango de una semana a un año para buscar en todo el espacio. Divida ese tiempo por el número de usuarios y tendrá un marco de tiempo aproximado para que el atacante encuentre una cuenta.

No conozco los detalles de la implementación, una aceleración de solicitud de inicio de sesión por IP hace que el ataque sea más difícil, pero probablemente no lo suficiente. ¿Es posible deducir el espacio de ID simplemente mirando el código público? En este momento, su mejor defensa puede ser que no mucha gente sepa que todas las ID de usuario son enteros. No es algo en lo que confíe, pero un ataque de fuerza bruta de diccionario sin el conocimiento de los enteros sería mucho más difícil.

Además, quien haya escrito este código en primer lugar, obviamente, no está muy preocupado por la seguridad, parece probable que haya otros problemas. Solicitud de falsificación en sitios cruzados, inyecciones de SQL, o tal vez incluso algún código C "rápido" con un agotamiento del búfer de la vieja escuela.

    
respondido por el aaaaaaaaaaaa 18.12.2013 - 21:00
fuente

Lea otras preguntas en las etiquetas