Perché le vulnerabilità CSRF sono considerate un problema con l'app Web, piuttosto che con il browser?

3

Da microsoft doc :

CSRF vulnerabilities are fundamentally a problem with the web app, not the end user.

E infatti, la soluzione tipica (token CSRF) è una soluzione lato server piuttosto che una soluzione lato client.

Questa potrebbe essere una domanda filosofica, ma ... Non sono sicuro di capire questo approccio. Per me, la vulnerabilità di CSRF è quando il browser effettua una richiesta non autorizzata; e quindi questo è un problema con il browser . Quindi, le misure sul lato client dovrebbero essere prese, non lato server. È il browser che deve smettere di fare richieste non autorizzate.

I token CSRF non sembrano risolvere questo problema fondamentale. I siti non autorizzati possono ancora utilizzare il browser per effettuare richieste maligne. Solo quel particolare tipo di richieste malevole viene risolto, ma altre no. Una possibilità che mi viene in mente: un sito dannoso potrebbe far sì che il browser invii molte richieste ripetute a un altro sito, rendendo effettivamente il browser partecipante a un attacco DDOS.

Quindi, invece, per risolvere questo problema ... perché non rendere i browser più sicuri? Un esempio più semplice: per impostazione predefinita, non consentire affatto le richieste cross-site? Questo sembra aver senso dal punto di vista teorico: perché i domini diversi dovrebbero essere diversi (questo dovrebbe significare: parti diverse) vogliono parlare da soli attraverso l'utente ?

    
posta gaazkam 17.05.2018 - 18:49
fonte

3 risposte

3

Teoricamente, hai ragione: il web avrebbe potuto essere progettato in modo tale che i browser potessero rilevare e prevenire questi attacchi. Tuttavia, non è stato progettato in questo modo e non esiste una soluzione semplice che possa essere applicata da un browser che non interrompa un numero elevato di siti Web esistenti.

One simplest example: By default, disallow cross-site requests at all?

Una "richiesta cross-site", nel contesto di CSRF, potrebbe essere semplice come "un tag <img> che fa riferimento a un'immagine ospitata su un altro dominio". Prevenire tali richieste interromperebbe così tanti siti Web che il browser sarebbe semplicemente considerato interrotto da tutti i suoi utenti.

It is the browser which must stop making unauthorized requests.

La richiesta è solo "non autorizzata" nel senso che un particolare utente non lo ha richiesto. Questo, a prima vista, è un approccio più promettente: consenti la richiesta, ma non lasciare che sia autenticato come l'azione di un particolare utente.

Il problema qui è che la stragrande maggioranza delle autenticazioni utilizzate dalle applicazioni web non è in realtà visibile per il browser come autentica; al massimo, il browser sa che il server ha richiesto che una o più stringhe opache ("cookie") vengano restituite alla successiva richiesta.

Quindi, i browser dovrebbero interrompere l'invio di tutti i cookie nelle richieste che sono "cross-site", nel senso di CSRF - quando si richiedono immagini e altre risorse da utilizzare in una pagina HTML servita da un dominio diverso; quando si inviano moduli rivolti a un dominio diverso; ecc.

why should different domains (this should mean: different parties) want to talk to themselves through the user?

Un caso di utilizzo ovvio sono i sistemi di tracciamento utilizzati dai servizi di analisi e pubblicità - potresti dire che staremmo meglio se i browser li violassero, ma dal momento che il browser più popolare al mondo è sviluppato da un'azienda che fa gran parte delle sue entrate da tali servizi, questo è improbabile che accada.

A volte, la comunicazione tra i servizi nel browser aumenta effettivamente la privacy dell'utente - se l'unica comunicazione che può avvenire è sul server, entrambi i server devono conoscere e discutere l'identità dell'utente.

Se il web si fosse evoluto pensando a queste considerazioni sulla sicurezza, gli usi sicuri del comportamento simile a CSRF sarebbero stati implementati con altri mezzi; ma anche se vengono inventati nuovi protocolli e API, è molto difficile cambiare il comportamento predefinito dei browser senza rompere una grande quantità di contenuto esistente.

Pertanto, le funzionalità per proteggerle, comunque standardizzate, saranno sempre opt-in , quindi richiede un po 'di lavoro dallo sviluppatore dell'applicazione, per dire "Non sto facendo affidamento sulla funzionalità X , quindi disabilitalo in modo che non possa essere abusato ". Cose come le intestazioni di Content Security Policy e le opzioni di cookie HttpOnly e SameSite sono tali opt-in. Cose come i token CSRF nelle forme sono modi per non fare affidamento sull'utente per avere un browser aggiornato che implementa tutte le protezioni necessarie.

    
risposta data 17.05.2018 - 19:41
fonte
2

Hai ragione nel senso che il problema è con il browser piuttosto che con l'app web e oggi i cookie SameSite può essere usato per risolvere questo problema. In definitiva, però, il problema non è così semplice, perché alcune richieste cross-site sono legittime, come fare clic su un link.

Se StackExchange ha impostato SameSite su strict e un utente è arrivato al sito facendo clic su un link da una ricerca Google, il cookie non sarebbe stato inviato perché si trattava di una richiesta cross-site e la pagina non sarebbe stata inviata t mostra all'utente come effettuato il login, anche se ha effettuato l'accesso in precedenza. Questa è UX non intuitiva e cattiva. Questo può essere risolto impostando SameSite su lax , ma CSRF potrebbe essere ancora possibile se l'app Web non è compatibile con RFC 7231 sezione 4.2.1 , e sfortunatamente ho visto molte app Web con richieste di GET non identienti.

Il blocco di tutte le richieste cross-site non è semplicemente fattibile con il modo in cui funzionano le cose attualmente. Previene troppi usi legittimi come CDN, incorporamento di immagini, annunci, ecc. Questa pagina attualmente richiede richieste a questi domini:

adservice.google.com
ajax.googleapis.com
cdn.sstatic.net
pixel.quantserve.com
qa.sockets.stackexchange.com
sb.scorecardresearch.com
securepubads.g.doubleclick.net
secure.quantserve.com
security.stackexchange.com
www.google-analytics.com
www.googletagservices.com
www.gravatar.com
    
risposta data 17.05.2018 - 19:43
fonte
1

CSRF, insieme alla maggior parte degli attacchi, è possibile perché un'applicazione non convalida correttamente gli input. Gli input devono sempre essere convalidati indipendentemente dalla sorgente.

Se convalidi i tuoi input, non devi fare affidamento sugli utenti o su Google, Mozilla, ... per garantire la sicurezza.

D'altra parte, anche se Google e Mozilla hanno trovato una versione sicura dei loro browser che impedisce assolutamente qualsiasi tipo di CSRF, gli utenti della tua applicazione sarebbero comunque vulnerabili se non aggiornano i loro browser.

Se pensi che tutti aggiornino i loro browser, ti sbagli. Un sacco di gente usa ancora i browser di 5-10 anni, e lo stesso vale per altre importanti applicazioni. Con l'avvento dell'IoT, questo problema è ancora peggiorato.

In conclusione: se vuoi che i tuoi utenti siano sicuri, è più comodo aggiungere alcune contromisure alla tua applicazione o chiedere a Google e Mozilla di chiudere immediatamente la causa principale della forza e di CSRF tutti i tuoi utenti per l'aggiornamento a questa nuova versione del browser?

Inoltre, l'interruzione della causa principale di CSRF non è così semplice. Come giustamente sottolineato da @IMSoP, questo sostanzialmente romperebbe le attuali industrie di analisi e pubblicità. Vedi anche: link .

Ancora una volta, se vuoi che i tuoi utenti siano al sicuro, è più comodo aggiungere alcune righe di codice alla tua app O per distruggere un settore da molti milioni di miliardi di dollari?

    
risposta data 17.05.2018 - 19:45
fonte

Leggi altre domande sui tag