Contromisure CSRF

5

Sto lavorando a un libro sulla sicurezza delle applicazioni web e dice che un'efficace contromisura CSRF è quella di assegnare un token pseudo-casuale temporaneo a azioni sensibili eseguite da utenti autenticati- e che i token segreti dovrebbero durare solo un breve periodo di tempo e essere imprevedibile per essere efficace.

La mia domanda è qual è l'intervallo di sicurezza se il token è l'UID impostato tramite il database utente? Presumibilmente, se ho svolto correttamente il mio lavoro, nessuno saprà quale sia il loro UID e non è nemmeno possibile trovarlo.

    
posta Melanie Sumner Smith 07.01.2013 - 15:01
fonte

3 risposte

4

I token CSRF hanno due parti: una parte è generalmente impostata come parte dei campi dei moduli nascosti, che non sono così difficili da trovare.

In modo diverso, i token CSRF sono archiviati sia lato client che lato server. Qualsiasi cosa memorizzata sul lato client, si deve assumere potrebbe essere trovato / letto / estratto. (Supponiamo che possa essere compromesso.)

Quindi è impossibile assicurarsi che nessuno possa sapere quale sia il loro UID. Questo è il motivo per cui dovrebbe cambiare frequentemente (il più vicino possibile a "ogni richiesta").

Contenuti correlati: link

Buona risorsa: link

Non hai menzionato la tua piattaforma. (.NET, Java, PHP, ecc.). Molte piattaforme hanno librerie ben definite per far fronte a questo. Consiglio vivamente di utilizzare uno di questi se possibile.

    
risposta data 07.01.2013 - 15:42
fonte
4

UnUessable UID sono difficili ... Ricorda che spesso l'attaccante può permettersi di essere paziente, quindi può fare molti tentativi con vari potenziali valori di UID. Al fine di rendere UID veramente inconcepibile dall'attaccante, dovresti generarli casualmente in uno spazio abbastanza grande: questo significa usare un crittografico strong PRNG (il tuo server ne ha già uno, chiamato /dev/urandom su sistemi di tipo Unix, o CryptGenRandom() su Windows) e rendendo l'UID abbastanza grande da non colpire l'attaccante uno "per caso" (quindi dovrebbe essere, al minimo , 12 byte lungo, preferibilmente più).

A meno che tu non usi un UID così grasso e casuale, non puoi fare affidamento sul fatto che UID sia sconosciuto all'attaccante.

Un altro punto, che altri hanno fatto, è che il token CSRF è, per sua natura, un pezzo di dati che viene inviato dal cliente insieme alla sua richiesta (la richiesta sarà accettata in virtù del venire con quel token). Pertanto, se l'UID è il token CSRF, allora ha attraversato il client ... a quel punto, possiamo solo supporre che l'autore dell'attacco ne abbia una copia. Questa è l'idea alla base del concetto di "i token segreti dovrebbero durare solo un breve periodo": rendere la vita più difficile per l'attaccante, accorciando la finestra temporale durante la quale può essere usato un token segreto afferrato. L'UID è longevo, quindi non appropriato in quel ruolo.

    
risposta data 07.01.2013 - 17:31
fonte
2

Come già accennato, l'UID verrà inviato come parte della richiesta HTTP. Questo può essere facilmente visto guardando il traffico HTTP grezzo usando uno sniffer di rete come wireshark o usando un proxy HTTP (rutto).

Se un utente scopre l'UID, potrebbe essere possibile derivare l'UID per altri utenti e sovvertire la protezione CSRF.

Utilizza un UID casuale (non statico) per ogni richiesta e verificalo nel componente lato server (controller e allo stesso modo).

    
risposta data 07.01.2013 - 17:06
fonte

Leggi altre domande sui tag