OAuth2 Flujo implícito: ¿Posibles vectores de ataque de token de actualización a través de CORS?

3

Actualmente estamos implementando una aplicación de una sola página (Angular2) y, por lo tanto, nos hemos encontrado con el problema estándar de "cómo asegurar nuestra API de backend".

Aparentemente, la solución estándar para esto es utilizar el flujo de concesión implícita OAuth2, que está bien. Estamos implementando un Servidor de Autorización personalizado que se autentica utilizando nuestra Solución de SSO Web (Open AM / SAML), verifica las licencias y luego emite tokens de acceso a través de la puerta de enlace API (Mashape Kong).

El token de acceso (como se especifica en el Flujo implícito de OAuth2) se devuelve al SPA mediante una redirección, que proporciona el token de acceso en el fragmento ( https://my.spa.com/#access_token=asdfasdf&token_type=bearer&expires_in=1800 ).

Hasta ahora, no hay especialidades. Ahora: el token de acceso solo es válido por un corto período de tiempo, y no hay token de actualización; no queremos que el usuario final sea redirigido de nuevo al Servidor de Autorización (se vería mal / flicker / ...). Nuestra idea fue utilizar la sesión existente con el Servidor de Autorización (que implementamos, ver más arriba) para actualizar el token de acceso (crear uno nuevo) a través de una llamada CORS a un punto final especial del Servidor de Autorización (llamémoslo /heartbeat ).

Obviamente, esto requiere hacer un par de cosas:

  • El Origin debe ser exactamente el host de la aplicación que realiza la llamada, y el Auth Server debe verificarlo y reflejarlo en la respuesta de verificación previa
  • La aplicación cliente debe hacer la llamada CORS con withCredentials: true activado (usando XMLHttpRequest , credentials: include para Fetch)

Hicimos una implementación de prueba de esto, y parece funcionar bastante bien, pero todavía quiero preguntarle a ustedes como expertos en esto: ¿Existen vectores de ataque (adicionales) al habilitar este tipo de actualización? Además de los sospechosos habituales para la concesión implícita, es decir.

Saludos cordiales, Martin

    
pregunta donmartin 01.12.2016 - 16:34
fuente

1 respuesta

2

En lugar de utilizar un enfoque completamente diferente que, como usted mencionó, merecería una revisión más exhaustiva desde un punto de vista de seguridad, sugeriría aprovechar lo que ya está especificado en OpenID Connect: el soporte de un modo de autenticación inmediata mediante el uso de prompt=none .

  

Si bien los SPA no pueden usar tokens de actualización, pueden aprovechar otras mecánicas que proporcionan la misma función. Una solución para mejorar la experiencia del usuario es usar prompt=none cuando invocas el /authorize endpoint . Esto no mostrará el cuadro de diálogo de inicio de sesión o el cuadro de diálogo de consentimiento. Además de eso, si llama a /authorize desde un iframe oculto y extrae el nuevo token de acceso del marco principal, entonces el usuario no verá los redireccionamientos que suceden .

(fuente: Auth0 - ¿Qué flujo de OAuth 2.0 debo usar? ; el énfasis es mío)

Su servidor de autorización deberá admitir este parámetro de solicitud adicional y también la aprobación automática de solicitudes / ámbitos que ya fueron autorizados por el usuario.

El principal beneficio de este enfoque es que aprovecha la mayor parte de lo que ya existía, por lo que no aumenta significativamente la superficie de ataque, como sería el caso de un enfoque completamente nuevo y diferente.

Consulte la Auth0.js library para obtener una implementación de referencia sobre cómo este tipo de autenticación silenciosa podría lograrse.

    
respondido por el João Angelo 02.12.2016 - 11:37
fuente

Lea otras preguntas en las etiquetas