¿Necesito protección CSRF en esta configuración con una API REST respaldada con oauth2 y un servidor de autenticación SSO básico?

5

He visto la respuesta ¿Es posible CSRF? ¿Si ni siquiera utilizo cookies? pero hay 2 respuestas conflictivas y la pregunta en sí tampoco proporciona tanta información.

Estoy creando una API REST que será utilizada por un cliente web (de nuestra propia creación) que se ejecuta en otro dominio, por lo que haremos solicitudes CORS. Esta API se ejecuta como un servidor de recursos oauth2, por lo que el acceso está restringido por tokens de acceso que se pasan en el encabezado de autenticación. No tenemos galletas, todo es apátrida. Sigo los consejos del artículo en enlace

  • Utilizaremos SSL
  • Tenemos uri de redireccionamiento pre-registrado
  • Nuestro único tipo de concesión es el código de autorización, sin requerir un secreto de cliente (ya que la fuente del cliente web es pública) en lugar del tipo de concesión implícita, según las recomendaciones en enlace
  • El cliente se autentica con un encabezado cuando realiza llamadas al servidor de recursos reales
  • La obtención del token de acceso se realiza al pasar el código de autorización 1 vez en los parámetros del formulario ( x-www-form-urlencoded ), que parece ser la forma normal, no debería quedar bloqueado en el historial del navegador ya que no es un parámetro de consulta.
  • El cliente también usará algún parámetro de estado secreto cuando obtenga el código de autorización. En este caso, no estoy seguro de que haya un punto ya que el cliente no depende de un secreto para obtener un token de acceso al intercambiar un código de todos modos.
  • Para el punto final oauth / token donde realmente obtiene un token de acceso, el único origen permitido es el dominio de nuestro cliente web
  • Para el punto final oauth / authorize, CORS no está permitido. Quizás esto sea excesivo, ya que el uri de redireccionamiento solo apuntaría a nuestro propio dominio de todos modos.

Creo que eso cubre casi todo en ese lado.

Ahora existe otro posible vector de ataque en la forma del propio servidor de autenticación oauth2, que se supone que es SSO y tiene sesiones y es accesible con autenticación básica. Sin embargo, no parece haber ninguna acción que pueda tomar con un ataque csrf que realmente sea útil. Puede hacer una solicitud a estos puntos finales, pero tendría que poder leer el resultado, lo que se evita mediante la configuración de CORS y el hecho de que los uri de redireccionamiento están registrados previamente. No hay POST que pueda hacer allí para cambiar su contraseña, restablecer su dirección de correo electrónico, etcétera, todas esas cosas también están expuestas como un servidor de recursos.

¿Me estoy perdiendo algo? ¿Cómo harías para detectar vulnerabilidades aquí?

    
pregunta Sebastiaan van den Broek 11.07.2018 - 06:28
fuente

1 respuesta

3

Para responder a su pregunta inicial: no necesita implementar contramedidas CSRF en su servidor de recursos, si no está utilizando cookies (sesiones) y no está usando la autenticación básica dentro del navegador.

El navegador almacena las cookies y el encabezado de autorización Básico para cada nombre de dominio que visita, y cada vez que envía una solicitud a un sitio, las cookies guardadas y el encabezado de autorización Básico se agregan automáticamente a los encabezados de solicitud.

Ya que está usando un token de acceso, y presumiblemente lo está enviando usando Authorization: Bearer <token> , debe estar seguro. Su navegador no sabe cómo manejar este tipo de autorización y por eso también tiene que agregar manualmente este encabezado en cada solicitud.

Redirigir URIs

Está utilizando URI de redireccionamiento pre-registrado, que es recomendado por el estándar OAuth 2.0. Esto garantiza que su servidor de autorización solo envíe códigos de autorización a sitios en los que confíe.

Es importante que sus URI de redireccionamiento utilicen un esquema seguro, como HTTPS, de lo contrario, son vulnerables a un ataque MITM.

Intercambio de código de autorización por token de acceso

Su sitio está recibiendo un código de autorización a través de un parámetro de consulta, cuando se le redirige desde el servidor de autorización. Lo más probable es que esté intercambiando inmediatamente el código de autorización por un token de acceso, que luego debería revocar el código de autorización.

El parámetro state se debe usar aquí para evitar ataques CSRF, por ejemplo. enviando un valor aleatorio al punto final authorize y comprobando que está recibiendo el mismo valor con el código de autorización. En un SPA, puede guardar el valor aleatorio en el almacenamiento local, es decir,

En un SPA, debes preocuparte menos por esto, por ejemplo, en una aplicación web del lado del servidor con estado. ¿Qué sucede si un atacante lo redirige a la página de autorización desde su propia página web? Terminas en tu propio SPA, donde el atacante no debería poder continuar.

En una aplicación de servidor con estado, es posible que al hacer esta autorización, en realidad se vinculen las cuentas, y las cosas puedan comenzar a suceder. (Dependiendo de la aplicación, por supuesto).

CORS en token endpoint

En primer lugar, CORS solo lo controla su navegador, por lo que no debe confiar en él para impedir que un atacante use su punto final token .

Para evitar CORS aquí, todo lo que un atacante tendría que hacer, es crear un punto final proxy, que simplemente envía la solicitud a su punto final token .

Además, el punto final token solo funciona si recibe un código de autorización válido.

CORS en el punto final authorize

Normalmente, redirigiría a sus usuarios al punto final authorize , donde (iniciarían sesión y) harían clic en un botón de autorización, dando acceso a la aplicación.

Sin CORS, un ataque probable es que un atacante puede crear su propio sitio, donde usa XHR / fetch para recuperar su página authorize . Y suponiendo que el usuario haya iniciado sesión (de manera estatal) en su página authorize , podría hacer clic en el botón de autorización, sin el consentimiento del usuario.

No hay ningún escenario en el que sea necesario usar XHR / fetch para recuperar la página authorize . Así que puedes bloquearlo con seguridad con CORS.

Servidor de autorización

Si su servidor de autorizaciones tiene estado, mientras escribe, debe implementar la protección CSRF siempre que realice una acción que pueda cambiar algo. Lo mejor es hacer esto en general, y si agrega una función de actualización de contraseña en el futuro, ya tiene el código necesario para protegerse contra CSRF.

Recomendaciones

Parece que entiendes la especificación OAuth. y parece que estás haciendo lo que se supone que debes hacer.

  • Las recomendaciones obvias son usar HSTS con precarga (y HPKP), para prevenir ataques MITM.
  • Asegúrese de que sus códigos de autorización sean de corta duración y se puedan usar solo una vez. No necesitan ser válidos por mucho tiempo, en escenarios normales se usa inmediatamente después de ser otorgados.
  • No almacene tokens de acceso final, tokens de actualización, códigos de autorización en su base de datos. En su lugar, almacene un identificador (por ejemplo, 64 bytes de forma aleatoria) y emita una versión firmada (por ejemplo, JWT). Esto evita que los atacantes extraigan tokens de acceso de su base de datos, ya que el atacante no puede usarlos de todos modos.
  • Use una implementación estándar de OAuth, no haga su propio rollo.
respondido por el Daniel A 18.07.2018 - 09:26
fuente

Lea otras preguntas en las etiquetas