Ridurre l'impatto dell'attacco DoS su login cpu-costosi?

8

Questo è un seguito alla mia domanda precedente: Impedisci il DOS contro l'autenticazione RSA . Questa domanda riguarda anche un problema simile: Prevenire il rifiuto di attacchi di servizio contro le funzioni di hashing lente? .

La mia configurazione è client-server con socket semplici e un protocollo personalizzato. I programmi client sono forniti con una chiave RSA pubblica e i server hanno la controparte della chiave privata.

In generale, le connessioni sono permanenti, quindi gli accessi sono in realtà rari, tranne durante i riavvii del server, problemi di rete e altri problemi che potrebbero causare la disconnessione e la riconnessione di una grande quantità di client. In altre parole, un attacco "DDoS" potrebbe semplicemente essere un tentativo di riconnessione dei client ...

The current (DoS-friendly) handshake works as follows:

  1. Client sends [protocol-version] [public-key encrypted nonce].
  2. Server unpacks nonce.
  3. Server generates its own nonce and uses PBKDF2 to derive a key using the client nonce and its own nonce.
  4. The server responds with [reply-code] [server-nonce] [AES encrypted packet + HMAC]
  5. Client checks the reply-code. If ok, takes the server-nonce and derives the key and checks that everything is ok by decrypting the encrypted payload using the new key.
  6. Encrypted communication commences using this newly created key.

Il problema è che una grande quantità di connessioni consumerà molte risorse della CPU. Ciò influenzerà entrambi gli utenti già registrati, ma rallenterà anche gli accessi, causando il timeout degli accessi, che a sua volta causerà ancora più disconnessioni e accessi.

È facile vedere che anche senza intenti malevoli, i server non sono stabili con un carico di accesso ragionevolmente alto se la decrittografia è costosa.

Al fine di mitigare questo, ho posto la domanda di cui sopra: Prevenire il DOS contro RSA autenticazione , che ha suggerito ECDH di ridurre il costo degli accessi.

Questo è un buon inizio, ma potrebbe non risolvere correttamente il problema, in cui un DoS non solo previene gli accessi, ma anche peggiora l'esperienza degli utenti già registrati.

Ho provato a elaborare alcune strategie che potrebbero essere di aiuto indipendentemente dall'algoritmo di handshake utilizzato, e mi piacerebbe sentire quali sarebbero consigliate, e se trascuro qualche strategia utile.

  1. Limita l'utilizzo della CPU di accesso accodando i decrittografi su un singolo (o pochi) thread a bassa priorità. Se la coda è grande, i clienti possono essere rifiutati o tenuti in attesa con aggiornamenti periodici.
  2. Aggiungi un server di login, che serve i client con le chiavi, simile all'handshake in alto, ma al client viene anche assegnato un identificatore con questa chiave. Il client può quindi accedere ai normali server presentando l'identificatore, in quanto il server sarà in grado di recuperarlo. (La presentazione dell'identificatore e il recupero della chiave dal server di login sostituiscono 1-3 nel protocollo di handshake). Qualsiasi DoS influirebbe solo sul server di login.
  3. Ancora un server di login, ma utilizzando HTTPS anziché lo schema RSA personalizzato per la distribuzione della chiave + identificatore al client.
  4. Login server come (2) ma richiede al client di presentare un hashash con la richiesta (e il server di login non elabora i dati crittografati a meno che non sia valido)
  5. Accedi al server come (2), ma usa invece un enigma del client emesso dal server.

Meriti e svantaggi (come li ho capiti):

(1) Può essere utilizzato sia con i normali server che con un server di login.

L'uso di (2) complicherà un po 'l'accesso, ma rende banale il fatto che i giocatori non siano influenzati da un attacco DoS sull'algoritmo di autenticazione.

Ho il sospetto che (3) renderebbe più facile l'uso con un sistema DDoS come Cloudflare, tuttavia è a mia conoscenza che (4) e (5) è impossibile da usare con HTTPS, che è uno svantaggio.

Indipendentemente da ciò, qualsiasi schema deve essere abbinato ai meccanismi standard che impediscono attacchi DoS per singola macchina, come il divieto di riconnettere rapidamente gli IP. Anche selezionare un algoritmo di autenticazione più economico ti aiuterà molto.

Modifica

Per riepilogare

  • La mia attuale stretta di mano non può gestire una quantità sufficiente di connessioni simultanee perché la decifrazione RSA consumerà quantità eccessive di CPU.
  • Mi piacerebbe conoscere i soliti metodi per ridurre questa vulnerabilità, sia a livello di handshake (algoritmi più economici, puzzle del client, CPU limitata per la decrittazione, ecc.) sia a livello di server (servizi di accesso separati ecc.). I collegamenti a documenti / libri sarebbero fantastici.
  • Inoltre, sarei grato se potessi ottenere una valutazione positiva / negativa delle strategie (1-5) sopra menzionate.

EDIT 2

Queste sono connessioni persistenti che eseguono un protocollo personalizzato. Ciò significa che migliaia di clienti legittimi possono essere connessi contemporaneamente.

Se un utente malintenzionato riesce a soffocare temporaneamente la larghezza di banda e a causare timeout della connessione, può essere utilizzato per sfruttare riconnessioni client legittime per arrestare il server, indipendentemente dai ritardi di riconnessione del client.

    
posta Nuoji 28.04.2013 - 21:39
fonte

3 risposte

3

Anche senza la minaccia di DoS, i tentativi di autenticazione senza restrizioni rappresentano un problema a sé stante . Un modo comune per limitare i tentativi di autenticazione a livello di protocollo consiste nel forzare un determinato IP ad attendere esponenzialmente più a lungo dopo ogni tentativo di autenticazione fallito.

Una caratteristica interessante di SSL / TLS è che consente i clienti riprendono le sessioni già stabilite , riducendo il consumo di risorse.

(come ha sottolineato AJ Henderson) Forzare l'hacker a conoscere un nome utente prima di consumare CPU su un hash PBKDF2 è una soluzione semplice, a patto che i nomi utente siano difficili da indovinare. In base alla tempistica delle richieste, o più comunemente un messaggio di errore prodotto, questa implementazione potrebbe essere un venerabilità dell'enumerazione del nome utente .

Filtraggio dei tentativi di autenticazione con mod_dosblock , Sourcefire o un altro IPS / Application Firewall è che taglia il piede per salvare il corpo . Questa tecnologia non è magica, vede che c'è un gran numero di un tipo di richiesta (una richiesta di accesso) e li filtra tutti. In questo contesto, questo approccio filtrerebbe i tentativi di autenticazione legittimi. Ciò significa che l'attaccante ha vinto utilizzando meno risorse dell'attaccante di quanto avrebbe impiegato per consumare tutto il tempo disponibile della CPU.

La forma generale di questo DoS basato sull'accesso è un Algorithmic Complexity Attacks o ACA. Il problema principale di un ACA è che l'utente malintenzionato è in grado di forzare la vittima a eseguire calcoli con una classe di complessità superiore rispetto al server. Durante la progettazione di un protocollo puoi costringere il potenziale aggressore a presentare una Prova di lavoro con ogni tentativo di autenticazione . Un proof-of-work comunemente usato per i sistemi di autenticazione è un Capthca! Questo tipo di lavoro è molto difficile da risolvere per un computer, il che limita notevolmente i tentativi automatici. Un'altra prova di lavoro potrebbe essere costringere il cliente a risolvere un PBKDF2 di un nonce per ogni tentativo di autenticazione. L'hash risultante è la prova di lavoro e può essere inviato insieme al nome utente / password.

Related:

Difesa contro la negazione del servizio tramite aste di puzzle .

Prezzo tramite elaborazione o lotta a Junkmail

    
risposta data 30.04.2013 - 17:35
fonte
2

Controlla prima il nome utente (o identificatore di sessione). Se non ne hai uno nella tua stretta di mano che sia facilmente accessibile, aggiungine uno. Cercare un identificatore è economico. Finché non si forniscono i propri identificatori, non avranno un numero elevato di identificatori validi da utilizzare nella propria funzione di accesso o hash. Se un identificatore viene utilizzato ripetutamente, bloccalo (o termina la sessione se si tratta di un identificatore di sessione).

    
risposta data 29.04.2013 - 15:29
fonte
1

Si desidera interrompere un possibile attacco DOS contro il server, quindi perché non inserire un firewall a livello di applicazione o un IDS / IPS di rete, fare ancora meglio entrambe le cose.

Un firewall Palo Alto con le regole del livello applicazione appropriato sarebbe in grado di identificare il traffico autentico e inoltrarlo al server mentre un IDS / IPS basato su Snort potrebbe essere facilmente configurato per eliminare pacchetti stile D / DOS.

Un SNS basato su IDS / IPS (o se hai il budget completo di Sourcefire) avrà le regole incorporate per questo tipo di protezione.

C'è anche la condizione che se vogliono veramente e possono permettersi di pagare per l'host zombi non c'è protezione dal DDOS ea volte devi solo superare la tempesta nel miglior modo possibile e assicurarti che il DDOS porti solo alla perdita del servizio e non è la copertura per un attacco più avanzato che è dopo l'IP delle aziende.

    
risposta data 30.04.2013 - 10:04
fonte

Leggi altre domande sui tag