Trovate qui descritto un attacco di fissazione della sessione OAuth2. L'attacco è possibile? E sto comprendendo correttamente come può essere fermato?
L'attacco
Mallory inizia ad accedere a client.example.com
tramite un determinato provider OpenAuth2, ma subito dopo che il provider ha inviato la risposta di autorizzazione ( collegamento ) Mallory chiude il browser e quindi blocca il flusso di accesso OAuth2. Tuttavia, prima di chiudere il browser, ricorda il valore Location nello stato 302 Trovato risposta dal provider:
HTTP/1.1 302 Found
Location: https://client.example.com/oauth-callback?code=12345&state=xyzw
Ora Mallory configura un malvagio server Web per rispondere allo stato 302 Trovato con l'intestazione di posizione sopra. Invia una e-mail ad Alice e dice: "Ciao, guarda questa pagina interessante su Client.Example.Com" con un link al suo malvagio server web. Alice segue il link e viene reindirizzato a client.example.com
con il codice OAuth2 di Mallory (cioè 12345
). client.example.com
continua il flusso di autenticazione: invia il codice OAuth2 al provider OAuth2 e ottiene un token di accesso.
Il risultato è che Alice ha effettuato l'accesso a un account controllato da Mallory. Alice però non se ne rende conto e compie un acquisto tramite Client.Example.Com. Client.Example.Com ricorda il suo numero di carta di credito, a cui Mallory può accedere in seguito accedendo all'account e controllando la cronologia dell'account.
Prevenzione dell'attacco
OAuth2 non consente di riutilizzare lo stesso codice di autorizzazione ( 12345
) più di una volta (vedere il RFC collegato sopra ), ma poiché Mallory ha chiuso il browser nel mezzo del flusso di login, il codice di autenticazione non viene utilizzato più di una volta.
Nella sezione 10.12 della RFC è menzionato che gli attacchi CSRF possono essere fermati tramite il parametro di stato OAuth2 ( xyzw
in questo esempio). Tuttavia, Mallory copia anche il parametro state
, quindi è probabile che sia uno stato valido, se lo stato è ad es. solo un sostantivo generato a caso. E quando Alice segue il malvagio collegamento di Mallory, client.example.com
non ha visto nessuno usare quel particolare stato prima, quindi client.exampel.com
probabilmente lo accetta.
La RFC dice che lo stato dovrebbe essere ", ad esempio un hash del cookie di sessione utilizzato per autenticare l'user-agent" . È questa la chiave per prevenire questo tipo di attacco? Alice avrebbe un cookie di sessione a client.example.com
e lo stato dovrebbe essere hashWithSha1(the-session-cookie-value)
? La state=xyzw
di Mallory sarebbe quindi incompatibile con il cookie di sessione di Alice, quindi client.example.com
capirebbe che qualcosa non andava bene con il reindirizzamento dal malvagio server di Mallory?
(Esattamente ciò che suggeriresti come state
? Sarebbe semplicemente hashWithSha1(the-session-cookie-value)
sicuro?)