martes, 30 de julio de 2013

Fallo en LinkedIn permitía extraer el token de OAuth del usuario autenticado

LinkedIn ha corregido un fallo en su web que permitía extraer el token del protocolo OAuth del usuario autenticado.

El fallo fue reportado por el británico Richard Mitchell y según comenta en su blog se dio cuenta como al acceder al sitio de ayuda de LinkedIn (http://help.linkedin.com) este procedía a autenticar al usuario con su ID de LinkedIn sobre HTTP.

Mitchell se detuvo a observar por curiosidad, a través de las herramientas de desarrollador de Chrome, como se efectuaba el proceso. Encontró que existía un script que efectuaba una petición con la llave API correspondiente al sitio web de ayuda y este respondía con el token OAuth del usuario.

Intentó hacer la misma petición copiando el script en una página local y comprobó que, como era de esperar, que las peticiones eran denegadas desde otro dominio. El problema era que la manera de chequear esto, en primer lugar, se hacía desde el propio script, consultando la variable "window.location.host" y comparándola con un grupo de valores, dominios controlados por LinkedIn: "*.linkedin.com" y "*.custhelp.com". Este primer filtro pudo evadirlo trivialmente sobreescribiendo la función "window.String.prototype.match" para que siempre devolviera "true".

Posteriormente comprobó como la petición volvía a ser denegada por el servidor de LinkedIn, así que verificando que la única diferencia entre una petición desde el navegador (dentro del dominio LinkedIn) y desde su página modificada en local (dominio local) era la cabecera "Referer", procedió a cambiar el HTML local para que su "Referer" no indicara su origen:

    <meta name="referrer" content="never">

De esta forma podía recoger el token OAuth sin que el servidor se percatara del origen de la petición.

El fallo, que ya ha sido corregido, nos muestra doblemente algo que repetimos continuamente: No creas nada que venga del cliente (navegador). Primero por filtrar desde Javascript el dominio desde el cual se está efectuando la petición y segundo por filtrar la petición en el servidor comprobando la cabecera "Referer" del cliente.

Por cierto, Mitchell fue premiado por el reporte de este bug con una camiseta.

Más información:

Stealing OAuth tokens from the LinkedIn API using meta referrer

David García

Twitter: @dgn1729

1 comentario: