¿Por qué usar un proxy para ocultar las credenciales del cliente OAuth en las llamadas de concesión de contraseña?

6

En un artículo de noviembre de 2014 de Alex Bilbie, se aconsejó a los usuarios de OAuth que no enviaran al cliente sus credenciales ( client_id y client_secret ) al realizar Contraseña del propietario del recurso otorgan llamadas. Según tengo entendido, la idea es que para que el cliente pueda agregar sus credenciales a sus solicitudes, dichas credenciales deben estar escritas en su código fuente (a menudo HTML / JS) y, por lo tanto, accesibles a posibles atacantes, que luego podrían usarlas para realizar llamadas a la API suplantando al cliente.

En comentarios de otra publicación del blog , el autor añadido:

  

Si puedo ver la fuente y copiar las credenciales del cliente, no hay nada que me impida crear mi propia aplicación que pueda autenticarse en su servicio OAuth y luego llamar a la API.

La solución alternativa propuesta es que el cliente no debe llamar directamente a la API, sino a un proxy delgado que sería responsable de adjuntar las credenciales del cliente a la solicitud y luego enviarla a la API.

Como novato ingenuo de OAuth, no entiendo por qué esto evitaría que los atacantes realicen llamadas a mi API. Si el cliente no tiene que agregar sus credenciales a sus solicitudes, nadie lo hace. A medida que el proxy agrega automáticamente las credenciales, cualquier solicitud enviada a la API se trata como proveniente del cliente autorizado.

Alguien le preguntó a Alex Bilbie esta misma pregunta en Twitter. Aquí está su respuesta:

  

¿Cómo asegurarías el proxy? ¿No puede el atacante simplemente enviar una solicitud al proxy y completar el secreto?

     

el punto es que estás ocultando los detalles de implementación de tu backend y, por lo tanto, conservas más control

Estaría agradecido si alguien pudiera dar más detalles sobre esta respuesta, ya que no veo qué podría obtener (en lo que respecta a la seguridad) al ocultar los detalles de la implementación y al mismo tiempo eliminar la necesidad de que un cliente se autentique.

    
pregunta marcv 22.08.2015 - 19:16
fuente

1 respuesta

3

Después de leer la publicación del blog vinculado y de hacer una referencia cruzada de sus problemas con el OAuth 2.0 RFC tengo algunos problemas con sus preocupaciones En la primera sección de su publicación de blog, tiene dos problemas importantes con el uso de OAuth en una aplicación web de una sola página utilizando la Credencial de contraseña de propietario del recurso :

  1. Los client_id y client_secret se incorporan a Javascript.
  2. Un atacante también puede acceder a access_token y refresh_token desde Javascript.

Abordando el primer problema, sección 4.3.2 de la RFC enumera los requisitos para solicitar un access_token usando el flujo de Credenciales de contraseña de propietario del recurso . Estos requisitos no incluyen un client_secret porque el proveedor confía en el cliente. Si este flujo se usara para clientes que no son de confianza, el cliente no necesitaría un client_secret porque el cliente solo podría autenticar al proveedor utilizando los usuarios username y password . Este flujo básicamente replica esquemas de autenticación tradicionales basados en contraseña.

El segundo problema existe, sin embargo, el autor no explica realmente el impacto. Para obtener acceso al access_token del usuario, el atacante necesita acceso físico a la computadora del usuario o explotar una vulnerabilidad separada, como los scripts entre sitios dentro de la web. Un access_token es básicamente equivalente a una cookie de sesión, excepto que el navegador no tiene mecanismos integrados como los indicadores de cookie secure y http-only para proteger un access_token .

Juntos, esto significa que realmente no hay una razón válida para enviar las solicitudes de API a través de un proxy delgado porque la aplicación no debería exponer ningún dato secreto que una aplicación web normalmente no expondría.

    
respondido por el Justin Moore 24.08.2015 - 17:48
fuente

Lea otras preguntas en las etiquetas