Se un'applicazione client / server utilizza un modello di richiesta / risposta per l'autenticazione, ad es. SCRAM o simili, spesso implica l'uso di nonces (client nonce e server nonce) per prevenire attacchi di replay.
Il server genererà un server nonce, basato su un numero generato casualmente sicuro concatenato con il nonce del client. Supponendo che il server memorizzi il nonce del client ricevuto più recente e abbia emesso il nonce del server, per garantire che non vengano accettati "non vecchi" o "non validi", questo aprirebbe un vettore di attacco.
Un utente malintenzionato potrebbe sottoporre a richieste di forza bruta a userid che egli indovina, al fine di ignorare il nonce client / server valido e concordato con un nuovo valore, che il client effettivo non conosce. Se questo accade tra la sfida e la risposta del cliente reale, il server negherà l'accesso poiché il nonce non sarà più valido. Quale sarebbe una sorta di attacco di tipo Denial Of Service.
Se il server decide di aggiornare solo il nonce / server effettivamente valido nella memoria solo se la richiesta / risposta è stata eseguita correttamente nel suo complesso, dovrebbe rifiutare le richieste di verifica per gli utenti che non hanno risposto alla sfida più recente . Ciò aprirebbe anche una finestra di attacco. L'attacco potrebbe richiedere sfide agli utenti (indovinati) al fine di impedire loro di richiedere una sfida in primo luogo.
Supponendo che il server tenga traccia di un elenco di nonces inutilizzati, entrambi gli attacchi sarebbero prevenuti, ma questo apre un altro vettore affinché l'attaccante possa richiedere una quantità enorme di sfide, portando il server a memorizzare tutti quei punti in memoria. Provoca il carico di I / O e potenzialmente porta nuovamente a DoS.
In ogni caso, attualmente non capisco come implementare in modo sicuro la gestione di nonce sul lato server per prevenire quegli attacchi DoS. Attualmente ho la sensazione che si venda la protezione dagli attacchi di replay a favore del DoS.
So che ci sono altri modi per impedirlo, tramite la limitazione delle richieste sui firewall, ecc., ma vorrei risolvere questo problema sul livello di implementazione della sfida / risposta, se possibile. Grazie per le idee e le risposte.