Archive for Julio 20th, 2007

Vulnerabilidad en Menéame

Julio 20th, 2007

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.

Posted in Frikadas | 4 Comments »


Julio 2007
L M M J V S D
« Jun   Ago »
 1
2345678
9101112131415
16171819202122
23242526272829
3031