CSRF: valore casuale o HMAC

6

Ho visto diversi inneschi di token CSRF:

  • Il primo utilizza token CSRF generati casualmente che utilizza a generatore casuale strong crittografico per generare il token.
  • La seconda implementazione che ho trovato utilizza HMAC che crittografa l'ID di sessione con la chiave segreta memorizzata nella configurazione lato server.
  • Il terzo impianto che ho visto utilizza una combinazione di entrambi, una chiave segreta memorizzata nella configurazione lato server viene utilizzata per HMAC un valore generato casualmente

Il secondo non richiede che lo stato sia memorizzato sul lato server (che è l'ideale in caso di clustering).

Mi chiedo quale sia il vantaggio tra la prima e la terza implementazione.

    
posta Lucas Kauffman 25.02.2014 - 16:40
fonte

2 risposte

6

The first one uses randomly generated CSRF tokens which uses a cryptographic strong random generator to generate the token.

Questo è l'ideale. In questo caso, il token è un blocco opaco assolutamente imprevedibile senza alcun significato al di fuori del contesto previsto.

The second implementation I found uses HMAC which encrypts the session id with secret key stored in the server side config.

È più semplice da implementare. Presumibilmente gli ID di sessione sono già stati generati, quindi non è necessario perseguire nulla di aggiuntivo. Poiché non è necessario ulteriore spazio di archiviazione, è possibile che questo meccanismo possa essere implementato in situazioni in cui un token casuale non può essere utilizzato in un progetto legacy. Questa è una soluzione relativamente elegante. Supponendo che la chiave segreta non diventi nota all'attaccante, il token non dovrebbe essere riproducibile al di fuori del server.

The third implentation I saw uses a combination of both, a secret key stored in the server side config is used to HMAC a random generated value

Questo è un po 'sciocco. Presumibilmente spinto dal fatto che un HMAC è un concetto di sicurezza, l'autore tenta di aggiungere sicurezza al suo progetto includendo qualcosa legato alla sicurezza. Una sorta di magico talismano della sicurezza. Presumibilmente non è peggiore che usare solo il numero casuale, ma certamente non è meglio. A meno che non si contenga la calda sensazione di confusione derivante dall'utilizzo di HMAC nell'implementazione della sicurezza.

È è , tuttavia, una soluzione ragionevole se hai un RNG scadente, anche se in questo caso probabilmente combinerei l'ID di sessione o qualcosa di simile lì prima dell'hashing in modo che tu sia garantito che il numero di hash in unico.

    
risposta data 26.02.2014 - 01:02
fonte
-1

So che asp.net MVC 3/4 usa un metodo simile a 2. Il problema che trovo con questo approccio è che esiste un solo token CSRF per la sessione, a differenza di quello della forma. Quindi, per esempio, se ottengo il token CSRF una volta, quel token è valido per qualsiasi modulo post nel corso della sessione. Quando collaudo con uno strumento come ZAP, una richiesta mi dà il token che posso poi riutilizzare a mio piacimento. Oltre a ciò, il token deve essere scritto da qualche parte nella pagina HTML (non è memorizzato in un cookie, ad esempio) e quindi può essere facilmente letto da un utente malintenzionato che cerca la stringa specifica.

Mi piace l'idea di 1/3. La casualità fornisce sicurezza su base per modulo / chiamata, al contrario di una per sessione. Può anche essere utilizzato per impedire più post dello stesso modulo. Ciò sarebbe utile in un sistema transazionale in cui si vorrebbe garantire che un invio avvenga solo una volta. Quando il server riceve il primo invio, invalida il token. Il prossimo invio fallirebbe. L'hacker ora deve prendere possesso di un token e usarlo prima che l'utente lo faccia.

Riesco a vedere il tuo punto riguardo il clustering / bilanciamento del carico, ma la maggior parte dei load balancer può / inoltrerà richieste dalla stessa sessione allo stesso host back-end.

    
risposta data 25.02.2014 - 17:37
fonte

Leggi altre domande sui tag