lundi 26 mars 2012

CVE-2012-1565 - eZ Publish - Object remote full information disclosure through « EzJSCORE » module


1.1.  Synopsis

Ce document présente une vulnérabilité découverte dans le produit CMS « eZ Publish ». Cette vulnérabilité permet avec un simple navigateur d’accéder à l’ensemble des informations concernant un objet « eZ Publish » dont :
8  Les comptes utilisateurs (nom, prénom, login, email, empreinte du mot de passe et type d’empreinte) lorsque la méthode « ezjsnode » du module « ezjscore » est activée au niveau de la configuration du produit « eZ Publish ».
Par défaut, la méthode « ezjsnode » est activée au niveau du fichier de configuration « ezjscore.ini ».  En général, le module « ezjscore » est activé au niveau « eZ Publish ».

1.2.  Impacts

Toutes les données de la base de données peuvent être récupérées sans authentification via un simple navigateur et via l’accès au site internet utilisant le produit « eZ Publish ».

1.3.  Versions affectées


« eZ Publish » comporte le module « ezjscore » depuis la version 4.2.0. Les versions affectées sont donc :



  • eZ Publish Enterprise 4.6, 
  • eZ Publish Enterprise 4.5, 
  • eZ Publish Enterprise 4.4, 
  • eZ Publish Enterprise 4.3, 
  • eZ Publish Enterprise 4.2, 
  • eZ Publish Enterprise 4.1,
  • eZ Publish Community Project 2011.4
  • eZ Publish Community Project 2011.5
  • eZ Publish Community Project 2011.6 
  • eZ Publish Community Project 2011.7 
  • eZ Publish Community Project 2011.8 
  • eZ Publish Community Project 2011.9 
  • eZ Publish Community Project 2011.10
  • eZ Publish Community Project 2011.11
  • eZ Publish Community Project 2011.12
  • eZ Publish Community Project 2012.1
  • eZ Publish Community Project 2012.2
  • Ainsi que les versions 4.0 et 4.1 d’« eZ Publish » où  le module « ezjscore » a été manuellement installés.

    1.4.  Description

    A la lecture du fichier de configuration « ezjscore.ini », il apparait que la méthode « ezjscnode » est autorisée par défaut :


    Figure 1 - ezjscore.ini

    Pour que le site publié sous « eZ Publish » soit vulnérable, il faut que les fichiers de configuration « module.ini » et/ou « site.ini » comportent :

    Figure 2 - site.ini


    Figure 3 - Module.ini




    Si ces deux prérequis sont satisfaits à savoir :
    8  Activation du module « ezjscore » ;
    8  Autorisation d’accès à la méthode « ezjscnode » ;
    Il est alors possible d’accéder aux informations des objets de la base de données d’ «eZ Publish » par son ID via la construction d’une URL faisant appel à la fonction « load » d’ « ezjscnode » de type :
    http://www.monsite.fr/ezjscore/call/ezjscnode::load::[ID]::all?ContentType=[xml|json]
    où :
    8  [ID]est l’ID de l’objet à récupérer ;
    8  [xml|json]l’affichage résultant si ces formats sont autorisés.

    1.5.  Preuve - récupération  du compte « administrateur » du site ez.no

    L’URL suivante permet de récupérer toutes les informations à propos du compte « administrateur » (ID=15) :


    Figure 4 - Récupération du compte administrateur ID=15
    Nous récupérons en particulier d’après le code explicitant le contenu « user_account » contenu dans le fichier « ezusertype.php »:
    8  Le login ;
    8  L’email ;
    8  L’empreinte MD5 du mot de passe ;
    8  Le type d’empreinte utilisée (user, site, password, plain, …)


    Figure 5 - Informations sur le compte

    functiontoString($contentObjectAttribute)
    {
    $userID=$contentObjectAttribute->attribute("contentobject_id");
    if(empty($GLOBALS['eZUserObject_'.$userID]))
    {
    $GLOBALS['eZUserObject_'.$userID]=eZUser::fetch($userID);
    }
    $user=$GLOBALS['eZUserObject_'.$userID];
    $userInfo=array(
    $user->attribute('login'),
    $user->attribute('email'),
    $user->attribute('password_hash'),
    eZUser::passwordHashTypeName($user->attribute('password_hash_type')),
    (int)$user->isEnabled()
    );
    return implode('|',$userInfo);
    }

    Tous les comptes utilisateurs peuvent en théorie être récupérés de la même façon. Il est alors possible d’effectuer des attaques hors ligne sur les mots de passe. Le fichier « ezuser.php » explique comment sont effectués les calculs des empreintes selon le type :
    staticfunctioncreateHash($user,$password,$site,$type,$hash=false)
    {
    $str='';
    if($type== self::PASSWORD_HASH_MD5_USER )
    {
    $str=md5("$user\n$password");
    }
    elseif($type== self::PASSWORD_HASH_MD5_SITE )
    {
    $str=md5("$user\n$password\n$site");
    }
    elseif($type== self::PASSWORD_HASH_MYSQL )
    {
    $db=eZDB::instance();
    $hash=$db->escapeString($password);

    $str=$db->arrayQuery("SELECT PASSWORD( '$hash' )");
    $hashes=array_values($str[0]);
    $str=$hashes[0];
    }
    elseif($type== self::PASSWORD_HASH_PLAINTEXT )
    {
    $str=$password;
    }
    elseif($type== self::PASSWORD_HASH_CRYPT )
    {
    if($hash)
    {
    $str=crypt($password,$hash);
    }
    else
    {
    $str=crypt($password);
    }
    }
    else// self::PASSWORD_HASH_MD5_PASSWORD
    {
    $str=md5($password);
    }
    eZDebugSetting::writeDebug('kernel-user',$str,"ezuser($type)");
    return$str;
    }

    8  MD5_user : md5( "$user\n$password" );
    8  MD5_site : md5( "$user\n$password\n$site"
    8  MD5_password :md5( $password );
    La variable « $site » est définie dans le fichier de configuration « site.ini ».

    1.6.  Quelques statistiques

    Ce CMS est utilisé par de très nombreux sites et à travers le monde entier. Plus de 250.000 sites s'appuient à ce jour sur eZ Publish et peuvent potentiellement être impactés par cette vulnérabilités.

    1.7.  Recommandation

    Il est hautement recommandé de désactiver la méthode « ezjscnode » via le fichier de configuration « ezjscore.ini ».

    1.8.  Crédits

    Cette vulnérabilité a été découverte par Yann MICHARD de la société OPPIDA.
    Cette information fait suite à l'annonce officielle de l'éditeur.

    Aucun commentaire:

    Enregistrer un commentaire