OAuth flujo implícito y confuso problema del diputado

1

Estoy leyendo sobre Google OAuth y el flujo implícito. En Google docs dice que el token de acceso recibido mediante el flujo implícito debe validarse, de lo contrario, la aplicación podría ser vulnerable a un "problema de agente confuso". ( enlace )

Me preguntaba si alguien podría dar un ejemplo que demostrara la vulnerabilidad. Digamos que tenemos a Alice que es un usuario regular. Si algún adversario presenta su propio token (suponiendo que este token solo puede acceder al servicio del adversario, es decir, Google Drive), no veo cómo el adversario podría causar ningún daño. Su propio token solo funcionará con su Gdrive, por lo que los archivos de Alice no podrían verse afectados con esto.

Estoy seguro de que hay una buena razón para la verificación, pero no puedo pensar en una ... ¿Ideas?

    
pregunta markovuksanovic 25.08.2014 - 12:19
fuente

3 respuestas

2

Creo que el siguiente ejemplo demuestra el problema (basado en la respuesta aceptada de enlace )

Todo esto supone el uso del flujo implícito de OAuth

  1. Alice conecta su navegador a GoodApp.com
  2. GoodApp.com obtiene un token de acceso OAuth autorizado por Alice.

    A) Este token de acceso está vinculado a la identidad de Alice en el Servidor de Autorización.

    B) El token de acceso es usado por GoodApp.com para autenticar a Alice o para acceder a
       Algunos recursos de OAuth en nombre de Alice.

  3. Alice conecta su navegador a BadApp.com (por cualquier motivo; digamos que BadApp.com "ofrece juegos que parecen divertidos")
  4. BadApp.com obtiene un token de acceso OAuth autorizado por Alice.
  5. BadGuy (que controla BadApp.com) luego conecta su navegador a BadApp.com y obtiene BadApp.com para redirigir el navegador de BadGuy a GoodApp.com con un OAuth falso Respuesta de autorización que incluye el token de acceso que BadApp.com tiene para Alice.
  6. Si GoodApp.com acepta la respuesta falsificada, BadGuy puede actuar como Alice de la siguiente manera.

    A) Si GoodApp.com utiliza el token de acceso para autenticar a Alice, BadGuy puede hacerlo    cualquier cosa que Alice pueda hacer en GoodApp.com

    B) Si GoodApp.com utiliza el token de acceso para acceder a algún recurso de OAuth, entonces BadGuy    puede hacer que GoodApp.com haga cualquier cosa dentro del "alcance" del token de acceso, todo en    nombre de Alicia.

Por lo tanto, si GoodApp.com verifica que cualquier token de acceso recibido fue diseñado para sí mismo, entonces puede evitar las cosas malas como se describe en el ejemplo anterior.

Tenga en cuenta que creo que el uso correcto del parámetro "estado" de un Cliente OAuth para la falsificación de solicitudes entre sitios también puede mitigar este problema, independientemente de la validación del token de acceso.

    
respondido por el E Anwar Reddick 09.02.2015 - 22:24
fuente
1

Creo que la mejor manera de entender cómo este patrón de uso de OAuth puede ser inseguro es hablar sobre el propósito de los ámbitos de OAuth.

De acuerdo con su diseño, un alcance de OAuth representa un conjunto de acciones posibles que se pueden realizar en nombre del usuario autenticado. Entonces (como un ejemplo inventado) si su cliente obtiene un alcance de token con el alcance "send_messages" , entonces puede enviar mensajes en nombre del usuario. En cierto sentido, la definición verdadera de un ámbito es qué acciones le permite realizar un token con ese alcance.

El problema con la forma "Iniciar sesión con FB / Twitter / etc". se implementa es que todos usan un solo ámbito (por ejemplo, "public_profile" para Facebook).

Según la documentación, este alcance es bastante inofensivo, con esto el cliente puede ver la identidad del usuario actual. Sin embargo, si un sitio web de terceros A.com usa este token para verificar la identidad de un usuario e iniciar sesión en A.com, esencialmente ha expandido la definición del ámbito public_profile para significar "ver información del perfil público, y también acceder a los recursos de este usuario en A.com ".

Todo lo que necesita en este momento es que un atacante obtenga un token con un alcance public_profile (por ejemplo, ejecutando otro sitio web con un enlace "Iniciar sesión con Facebook"): este alcance solicitado parece inofensivo según la documentación de Facebook y lo que le muestran al usuario, pero en realidad si el atacante puede pasar eso a A.com, puede acceder a los recursos del usuario.

La solución

La solución que surgió es que A.com verifique que el token se generó específicamente para A.com, es decir, que durante el flujo de inicio de sesión de OAuth, el usuario fue dirigido a A.com en lugar de a otro sitio.

Para hacer esto, el token OAuth generado tiene información adicional asociada, específicamente "a qué sitio web / aplicación se envió este token". La presencia de esta información adicional determina el resultado cuando inspecciona el token (por ejemplo, / debug_token punto final).

(Personalmente creo que esto más o menos constituye un "alcance invisible", y no tendríamos esta confusión si Facebook / etc. hubiera proporcionado ámbitos de inicio de sesión personalizados de terceros, por ejemplo, "third-party:a.com" , sin embargo, la solución existente es igual de funcional.)

(El flujo "implícito" de OAuth a veces es totalmente culpable en esta situación, que creo que falta la mitad del punto. El problema es que el flujo "implícito" permite que un atacante inserte sus propios tokens de OAuth interceptar la redirección del navegador, pero esto no sería un problema si los ámbitos de OAuth no se redefinieran.)

    
respondido por el cloudfeet 23.03.2017 - 12:45
fuente
0

La falsificación de solicitudes entre sitios, que es el problema que ha descrito en su pregunta, es ligeramente diferente de un problema de diputado confuso más general que se describe en la otra respuesta. CSRF involucra el token del atacante, no el de Alicia (usando el mismo ejemplo que antes). Y sí, CSRF puede mitigarse al aprovechar el parámetro de estado.

Pero un ejemplo diferente de problema de diputado confundido, como se describe en la otra respuesta, no se resuelve simplemente. En su lugar, el servidor de autorización tendría que validar cada llamada a la API contra el ID de cliente y el token de acceso (w / scopes)     

respondido por el akoo1010 23.03.2017 - 02:38
fuente

Lea otras preguntas en las etiquetas