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 :
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.
Cette information fait suite à l'annonce officielle de l'éditeur.
Aucun commentaire:
Enregistrer un commentaire