2011-02-14 14 views
14

Estaba pensando en la seguridad de mi API de servicio web REST, y decidí echar un vistazo a otros servicios grandes y cómo lo hacen. Como ejemplo, decidí estudiar OAuth de Twitter. Después de leer la guía para principiantes, estoy un poco confundido y conmocionado.¿OAuth no es seguro o no lo entendí?

que he entendido que es proveedor de servicio la responsabilidad para autenticar usuarios y para mostrar qué tipo de usuario el acceso del consumidor es exigente (por ejemplo, que quieren de acceso de sólo lectura a los recursos específicos). Pero vi proveedores de servicios que no informan al usuario sobre qué tipo de acceso exige el consumidor (e incluso ahora muestra la identidad del consumidor). La segunda parte del problema es que el consumidor puede mostrar su propio formulario personalizado de Autenticación del servicio del proveedor en IFrame, y simplemente ocultar los detalles de acceso, simplemente puede robarle la contraseña, o solicitar acceso ilimitado a sus recursos, puede hacer básicamente lo que quiera, hay muchas formas de engañar al usuario.

Como ejemplo tomemos LinkedIn. Solicitan su nombre de usuario y contraseña de Gmail dentro de su propio formulario, y no tienen idea de cómo lo usarán. Pueden simplemente robarlo y almacenarlo en su base de datos, pueden hacerlo mediante OAuth a Gmail (y no muestran la página de Gmail con información sobre el tipo de acceso que solicitan), pueden hacer lo que quieran con esta información.

Lo que estoy tratando de decir no es que el protocolo de comunicación OAuth no sea seguro, sino que hay muchas maneras de usarlo incorrectamente para engañar al usuario y obtener sus credenciales.

BTW había flujo de seguridad en el propio protocolo OAuth http://oauth.net/advisories/2009-1/) y estoy bastante seguro de que hay más, pero a nadie le importa encontrarlos.

+4

Si un servicio solicita su nombre de usuario y contraseña dentro de un formulario, esto es ** no ** OAuth. De hecho, ese es precisamente el patrón que OAuth debe resolver. –

+1

@BobAman: no es OAuth en cuanto a que OAuth no aborda la Autenticación, pero puede usar el nombre de usuario | contraseña desde para autenticar el nombre del usuario ob en el sitio del proveedor del servicio y obtener el token de autorización OAuth. Así que bajo la cubierta puede ser OAuth bot no como debería ser. –

Respuesta

17

Voy a ir con 'Usted no entiende.' (En su defensa, muy pocas personas).

Seamos claros: el ataque de fijación de sesión al que se refiere afecta a OAuth 1.0, pero se resolvió en OAuth 1.0a, que se convirtió en RFC 5849. No hay implementadores importantes de OAuth 1.0: los principales implementadores implementaron OAuth 1.0a/RFC 5849 o implementaron uno de los borradores de OAuth 2.0.

En cuanto a la anti-patrón de nombre de usuario/contraseña, OAuth 1.0a no prevé un mecanismo para intercambiar un nombre de usuario y la contraseña de un token de acceso. OAuth 2.0 sí, pero solo con el propósito de soportar aplicaciones instaladas. Tenga en cuenta que una aplicación instalada simplemente podría registrar con keylog (o similar) si realmente quisiera. Cuando se trata de seguridad, todas las apuestas están desactivadas si una aplicación ya se está ejecutando de forma nativa y no se encuentra en la arena en la máquina del cliente. Pero este es en realidad un escenario muy diferente de lo que estás hablando. Las aplicaciones web en OAuth 1.0a y OAuth 2.0 nunca tocan el nombre de usuario y la contraseña.

El flujo de OAuth 1.0a dice así: La aplicación solicita al proveedor para un identificador de petición, diciendo que todas las cosas que quiere acceder.El proveedor emite el token no autorizado temporal, en cuyo punto el cliente puede enviar al usuario al proveedor para autorizar ese token. El usuario inicia sesión con su nombre de usuario y contraseña en el sitio del proveedor y luego concede o niega el acceso. Luego, el proveedor redirecciona con una cadena de verificadores que permite que el sitio se actualice a un token de acceso autorizado. Todas estas interacciones están firmadas. Si las firmas no coinciden en ninguna de ellas, el proveedor rechazará la solicitud. Y el usuario puede revocar cualquier token en cualquier momento, eliminando la capacidad del cliente de acceder a su cuenta.

Hay un número de security considerations con el protocolo, pero si realmente lee la lista, es esencialmente la misma lista de problemas de seguridad que afectan a casi todos los sitios en Internet. Estas consideraciones de seguridad son muy conocidas y muy bien entendidas. Que yo sepa, actualmente no se conocen ataques explotables contra proveedores que aborden correctamente todas estas consideraciones de seguridad.

Por lo tanto, está mucho más seguro al utilizar OAuth 1.0a u OAuth 2.0 para autorizar a un tercero que con cualquiera de las alternativas. Si no se siente cómodo con esto, la solución es simple: no autorice a terceros a acceder a su cuenta. Ciertamente hay muchas razones por las cuales no querrás hacer eso.

+0

"es esencialmente la misma lista de problemas de seguridad que afectan a casi todos los sitios en Internet". Estoy de acuerdo en eso. Esperaba que OAuth fuera mejor, pero no soluciona ni intenta resolver las "consideraciones de seguridad" actuales de la web. Espero que sea un sistema de seguridad complejo que aborde los problemas de autenticidad del servidor, suplantación de identidad, pero no lo es y todos los problemas comunes de seguridad web, pero no es así. –

+3

Las balas mágicas no existen. No existe la seguridad perfecta, y usar OAuth ciertamente no hará que algo sea seguro. Lo que sí hace es eliminar la necesidad de un antipatrón específico no seguro, es decir, exponer el nombre de usuario y la contraseña a terceros como una forma de concesión de autorización. Criticar la especificación por no lograr algo que no estaba tratando de lograr y que posiblemente no podría lograr, incluso si lo estaba intentando, es un poco extraño. –

+0

Creo que el OP decía que podía abrir una ventana emergente con un panel de inicio de sesión falso y robar la contraseña de alguien de esa manera. Una especie de ataque de phishing, supongo. Si el usuario no inspecciona la barra de ubicación, no sería más inteligente, y casi cualquier URL con la palabra google o facebook en ella probablemente parezca legítima para un usuario. –

7

Parece que no está seguro de lo que no es seguro. Según tengo entendido, el protocolo OAuth en sí mismo, si se implementa correctamente, es seguro. Es solo que es fácil de implementar incorrectamente, y los usuarios se confunden porque realmente no entienden lo que están haciendo.

Por ejemplo, lo que LinkedIn está haciendo está mal. Nunca les daría la información de mi cuenta de Gmail de esta manera. Para poder proporcionar la información de mi cuenta de gmail, insisto en que mi navegador esté usando SSL con Google, por lo que el marco raíz de la página proviene de Google.

Luego está la cuestión de confiar en Google para decirme correctamente lo que el acceso se está solicitando y por quién. Si no confío en que hagan esto, no debería usar OAuth.

+5

Si no confías en Google para hacer eso, primero no deberías confiar en ellos ;-) –

+1

@Joachim, Google es una organización grande con una gran base de código. Puede ser razonable confiar en gmail para mantener sus datos seguros, pero no confiar en otra parte de Google para proporcionar una interfaz de usuario que sea clara e indestructible. Dicho esto, los chicos de OAuth saben cómo diseñar protocolos de seguridad. El problema de crear una interfaz de usuario que deje en claro a muchos usuarios diferentes de diferentes culturas qué autoridad otorgan sigue siendo un tema de investigación abierta. –

Cuestiones relacionadas