OAuth + Confused Deputy + access token verification + state parameter

2

L'articolo "Uso di OAuth 2.0 per l'applicazione sul lato client" di Google all'indirizzo link afferma che il cliente DEVE convalidare tutti accedere a token per verificare che fosse il destinatario previsto del token di accesso, al fine di evitare di essere vulnerabili al problema del delegato confuso.

Credo che l'uso corretto del parametro "stato" OAuth possa anche prevenire questa vulnerabilità. "Uso corretto" che sta crittograficamente e vincola in modo sicuro il valore del parametro di stato alla sessione corrente del browser. Questo può essere fatto tagliando una combinazione dell'ID di sessione e di un nonce (non sono sicuro che sia necessario includere il nonce).

Ho due domande:

La mia domanda principale è: l'uso corretto del parametro "stato" OAuth, insieme all'utilizzo di TLS con la convalida del certificato del server, attenua il problema del delegato confuso, senza convalidare il pubblico del token di accesso, per una definizione di "uso corretto" "che mitiga la falsificazione di richieste cross site?

La mia domanda secondaria è: la falsificazione di richieste cross-site è un tipo di problema di vice confuso? E se "sì", allora non è la risposta alla mia domanda principale anche "sì" necessariamente?

    
posta E Anwar Reddick 09.02.2015 - 22:35
fonte

1 risposta

4

Questo è il problema che stai cercando di prevenire convalidando il token :

As a simplified example, imagine there are two apps: (1) FileStore, a legitimate file storage app, and (2) EvilApp. Both apps use Google's authentication process for client-side apps. Alice is an innocent end user, and her Google user ID is XYZ.

  1. Alice signs into FileStore using Google.
  2. After the auth process, FileStore creates an account for Alice and associates it with Google user ID XYZ.
  3. Alice uploads some files to her FileStore account. So far everything is fine.
  4. Later, Alice signs into EvilApp, which offers games that look kind of fun.
  5. As a result, EvilApp gains an access token that is associated with Google user ID XYZ.
  6. The owner of EvilApp can now construct the redirect URI for FileStore, inserting the access token it was issued for Alice's Google account.
  7. The attacker connects to FileStore, which will take the access token and check with Google to see what user it is for. Google will say that it is user XYZ.
  8. FileStore will give the attacker access to Alice's files because the attacker has an access token for Google user XYZ.

FileStore's mistake was not verifying with Google that the access token it was given was truly issued to FileStore; the token was really issued to EvilApp.

I believe proper use of the OAuth "state" parameter can also prevent this vulnerability. "Proper use" being cryptographically and securely binding the state parameter value to the current browser session. This can be done by hashing a combination of the session ID and a nonce (I'm not sure if including the nonce is necessary).

I have two questions:

My primary question is: Can proper use of the OAuth "state" parameter, along with using TLS with server certificate validation, mitigate the confused deputy problem, without validating the audience of the access token, for some definition of "proper use" that mitigates cross site request forgery?

No, devi convalidare audience , non stato, come da questo articolo :

Some people believe that using the state parameter in OAuth protects against token substitution. The only binding a browser cookie to state protects against is Cross Site Scripting [think they mean CSRF]. In the attack I am proposing the client generates a legitimate request to a bad user agent that captures it and provides a response that includes state unchanged from the request. Their is nothing in the OAuth client-side flow that proves the issuer you sent the request to through the browser ever received it and is the one responding. Only the access_token parameter is generated by the Authorization server, all the other parameters are dropped or echoed back. The client has no way to tell who the authorization server thought it was issuing that access_token to.

Immagina che un utente malintenzionato faccia clic su un pulsante sulla tua app per consentirgli di accedere al suo account Google al fine di convalidare la sua identità (ad esempio l'autenticazione). Tuttavia, invece di seguire il reindirizzamento, invece, afferra il valore dello stato e lo memorizza da qualche parte. Poi riceve un token dalla sua app dannosa e poi lo riproduce sul redirect_uri , sostituendo il state che ha catturato a se stessa.

L'app autentica l'utente come quello che ha dato accesso alla sua app dannosa. Convalidare il pubblico è invece l'approccio sicuro perché viene controllato da Google quando si convalida il token sul lato server.

My secondary question is: Is cross site request forgery a type of confused deputy problem? And if "yes", then isn't the answer to my primary question also "yes" necessarily?

Sì, CSRF è un altro tipo di problema con i confusi.

Per questo motivo è possibile utilizzare

state , in quanto ciò confermerebbe che una parte malintenzionata non ha allettato un utente al proprio sito e reindirizzato al proprio endpoint per autorizzare l'account dell'attaccante contro la propria app. Ad esempio, se la tua app copia il contenuto da sé e si sincronizza con un account Google, l'utente malintenzionato potrebbe reindirizzare l'utente al tuo endpoint, dovresti controllare sul lato server che il token corrisponde e quindi iniziare a sincronizzare il tuo contenuto con l'account Google: dato che questo è l'account dell'attaccante, ora hanno accesso ai file dell'utente. Quindi, perché controllare state è una buona soluzione per questo.

    
risposta data 10.02.2015 - 11:56
fonte

Leggi altre domande sui tag