Vulnerabilidad en Menéame

Revisando el código de Meneame (en su última versión del CVS) he encontrado un fallo importante de seguridad que permite suplantar la identidad de cualquier usuario registrado en el portal de forma arbitraria.

El código vulnerable se encuentra en el fichero libs/login.php en la función/constructor UserAuth.

[...]

switch ($userInfo[2]) {
        case ‘3′: if (($this->now – $cookietime) > 864000)                 $cookietime = ‘expired’;
               $key = md5($dbuser->user_email.$site_key.$dbusername.$dbuser->user_id.$cookietime);
               break;
        case ‘2′:
                $key = md5($dbuser->user_email.$site_key.$dbusername.$dbuser->user_id);
                $cookietime = 0;
                break;
         default:
               md5($site_key.$dbusername.$dbuser->user_id);
                $cookietime = 0;
}

if ( !$dbuser || !$dbuser->user_id > 0 || $key !== $userInfo[1] || $dbuser->user_level == ‘disabled’ || empty($dbuser->user_validated_date)) {
        $this->Logout();
       return;
}
[...]

El problema radica en el que el “default” de la estructura “switch” no se asigna la variable $key, por lo que una cookie preparada maliciosamente permite pasar la comprobación de tipos y contenido en la siguiente condición “$key !== $userInfo[1]“, únicamente consiguiendo que $userInfo[1] sea NULL.
Modificando la cookie “mnm_user” para que contenga el usuario víctima y la cookie “mnm_key” el mismo usuario pero codificado en base64, el ataque tiene éxito, ya que al hacer el “explode” de “mnm_key“, todos los elementos del array “$userInfo” quedan a NULL excepto el primero.

Para corregirlo únicamente habría que modificar

md5($site_key.$dbusername.$dbuser->user_id);

por

$key = md5($site_key.$dbusername. $dbuser->user_id);

La vulnerabilidad fue encontrada e informada al responsable del código y más tarde corregida en el mismo día (diff), tanto en el CVS como en el código usado por meneame.net. Todos aquellos portales que se hayan basado en su código desde el día 2 de julio de 2007 hasta hoy contienen dicha vulnerabilidad (diff), ya que fue introducido entonces de forma accidental.

Este post fue escrito el Viernes, Julio 20th, 2007 a las 20:43 y está archivado en la(s) categoría(s) Frikadas. Puedes seguir los comentarios de esta entrada suscribiéndote a este feed RSS 2.0. Puedes dejar un comentario, o enviar un trackback desde tu web. Technorati icon


4 Suspiros en “Vulnerabilidad en Menéame”


Leave a Reply