Si una aplicación cliente / servidor usa un patrón de desafío / respuesta para la autenticación, por ejemplo. SCRAM o similar, a menudo implica el uso de nonces (cliente nonce y servidor nonce) para prevenir ataques de repetición.
El servidor generará un nonce de servidor, basado en un número aleatorio seguro generado concatenado con el nonce del cliente. Suponiendo que el servidor almacena el archivo de cliente recibido más reciente y el servidor emitido para garantizar que no se aceptarán los archivos "más antiguos" o "no válidos", esto abrirá un vector de ataque.
Un atacante podría hacer una solicitud de fuerza bruta contra los ID de usuario que adivina, para anular la condición de cliente / servidor válida y acordada con un nuevo valor, que el cliente real no sabe. Si esto sucede entre el desafío y la respuesta del cliente real, el servidor denegará el acceso, ya que el nonce ya no será válido. Lo que sería algún tipo de ataque de denegación de servicio.
Si el servidor decide solo actualizar el servidor / cliente realmente válido en el almacenamiento solo si el desafío / respuesta se ejecutó con éxito en su totalidad, tendría que rechazar las solicitudes de desafío para los usuarios que no han respondido al desafío más reciente . Esto también abriría una ventana de ataque. El ataque podría solicitar desafíos a los usuarios (adivinados) para evitar que soliciten un desafío en primer lugar.
Suponiendo que el servidor mantendrá un registro de una lista de nonces no utilizados, se evitarían ambos ataques, pero esto abre otro vector para que el atacante solicite una gran cantidad de desafíos, lo que lleva al servidor a almacenar todos esos nonces en el almacenamiento. Provocar la carga de E / S y potencialmente llevar a DoS nuevamente.
De todos modos, actualmente no entiendo cómo implementar de manera segura el manejo de nonce en el lado del servidor para evitar esos ataques DoS. Actualmente tengo la sensación de que uno intercambia la protección contra ataques de repetición a favor de DoS.
Sé que existen otros medios para evitar esto, mediante la limitación de solicitudes en los cortafuegos, etc., pero me gustaría resolver este problema en el nivel de implementación de desafío / respuesta, si es posible. Gracias por ideas y respuestas.