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 ».
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 ».
« 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.
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.
|
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 ».
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.
Il est hautement recommandé
de désactiver la méthode « ezjscnode »
via le fichier de configuration « ezjscore.ini ».
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.