Perché i token CSRF sono necessari?

3

Sembra che l'intero problema possa essere risolto in modo molto elegante semplicemente aggiungendo un nuovo flag alle specifiche del cookie HTTP.

Analogamente a come i cookie segnalati con Secure verranno inviati dall'agente utente solo su connessioni sicure e quelli contrassegnati con HttpOnly saranno per sempre inaccessibili tramite l'accesso DOM, perché non specificare un nuovo flag, ad esempio NoCSR o SameOriginOnly , che, se impostato, impedirebbe che il cookie venisse inoltrato con richieste innescate da referrer di origine incrociata?

Ovviamente, verrà disattivato per non interrompere il comportamento precedentemente previsto per i siti Web già esistenti, come per HTML5 Design Principle # 2.1 . Suppongo che esista un buco di sicurezza, ma non uno che non può essere risolto facilmente: non può dipendere in modo indiscriminato, perché i vecchi browser ignorerebbero presumibilmente la bandiera non riconosciuta.

Quindi, perché non creare solo un'enumerazione di whitelisted di NoCSR -implementare le stringhe UA corrispondenti delle versioni degli interpreti degli utenti e quindi accettare / elaborare solo richieste richiedenti e sensibili che portano uno di quei valori di User-Agent: ? Per le richieste inviate con intestazioni UA non autorizzate o non autorizzate, potrebbe essere restituito un errore che richiede ragionevolmente all'utente di eseguire l'aggiornamento a una versione del browser supportata.

La whitelisting potrebbe essere eliminata con librerie di implementazione canoniche (probabilmente sarebbe più simile a una singola funzione semplice) per vari linguaggi lato server.

Non sembra molto più semplice dell'attuale sistema di generazione, tracciamento e lettura di token CSRF sicuri?

Pensieri, chiunque?

    
posta wwaawaw 09.09.2012 - 16:27
fonte

3 risposte

4

Fondamentalmente hai ragione, la tua soluzione impedirebbe ai token CSRF di essere necessario contro tali attacchi. Ma potremmo anche controllare l'intestazione Referer per assicurarci che provenga da un dominio o sottodominio consentito, giusto? E l'utilizzo del referrer sarebbe già più flessibile di un NoCSR-flag: puoi autorizzare domini o sottodomini.

Il problema sono gli attacchi di riproduzione o quando un utente si presenta per sbaglio due volte. Per questo motivo avresti già bisogno di un token che cambierà imprevedibilmente ogni richiesta (a.k.a. nonce). Potrebbe essere semplice come un hash salato dell'ora corrente, ma è comunque necessario farlo.

Anche i cookie sono necessari per mantenere qualcuno connesso. Dovendo avere cookie separati per identificare gli attacchi CSRF e quando qualcuno è loggato è un po 'fastidioso. (Quello per identificare gli attacchi CSRF portava il flag NoCSR.) E tu vuoi sapere se qualcuno è loggato, il menu probabilmente dovrà essere diverso, anche quando viene indirizzato da un altro sito web.

    
risposta data 10.09.2012 - 02:00
fonte
3

Direi principalmente complicazione. Un collegamento inviato attraverso un'altra applicazione non porta alcun referrer del sito, quindi è un buco che deve essere considerato. Uno potrebbe concentrarsi solo sulle richieste di passaggio all'interno del sito, ma potrebbe esserci una vulnerabilità XSS che creerebbe un comportamento simile a CSRF che verrebbe interrotto da utilizzando un nonce .

In breve riassunto: il metodo nonce funziona già e non è molto complicato da implementare. Questo metodo proposto potrebbe risultare molto più complicato da implementare, romperebbe la compatibilità all'indietro e richiederebbe il metodo nonce esistente come stop-gap.

Infine, ci sono altri comportamenti di non ripetizione per i quali potresti ancora desiderare un nonce.

    
risposta data 10.09.2012 - 01:15
fonte
2

Poiché questa domanda è stata posta, solo una simile bandiera del cookie è stata aggiunta ai browser moderni: SameSite . Dalla specifica :

5.3.7. The SameSite Attribute

If the attribute-name case-insensitively matches the string
"SameSite", the user agent MUST process the cookie-av as follows:

  1. If cookie-av's attribute-value is not a case-insensitive match for "Strict" or "Lax", ignore the "cookie-av".

  2. Let "enforcement" be "Lax" if cookie-av's attribute-value is a case-insensitive match for "Lax", and "Strict" otherwise.

  3. Append an attribute to the cookie-attribute-list with an attribute-name of "SameSite" and an attribute-value of "enforcement".

5.3.7.1. "Strict" and "Lax" enforcement

Same-site cookies in "Strict" enforcement mode will not be sent along with top-level navigations which are triggered from a cross-site document context. As discussed in Section 8.8.2, this might or might not be compatible with existing session management systems. In the interests of providing a drop-in mechanism that mitigates the risk of CSRF attacks, developers may set the "SameSite" attribute in a "Lax" enforcement mode that carves out an exception which sends same-site cookies along with cross-site requests if and only if they are top- level navigations which use a "safe" (in the [RFC7231] sense) HTTP method.

Lax enforcement provides reasonable defense in depth against CSRF
attacks that rely on unsafe HTTP methods (like "POST"), but does not
offer a robust defense against CSRF as a general category of attack:

  1. Attackers can still pop up new windows or trigger top-level navigations in order to create a "same-site" request (as described in section 2.1), which is only a speedbump along the road to exploitation.

  2. Features like "<link rel='prerender'>" [prerendering] can be exploited to create "same-site" requests without the risk of user detection.

    When possible, developers should use a session management mechanism such as that described in Section 8.8.2 to mitigate the risk of CSRF
    more completely.

È supportato a partire da IE 11 (solo su Windows 10), Edge 16, Firefox 60, Chrome 51, Safari 12 e Opera 39, in base a caniuse.com .

    
risposta data 24.08.2018 - 22:49
fonte

Leggi altre domande sui tag