Le CMS Joomla vient d’être touché par deux vulnérabilités dont l’impact a été qualifié comme élevé. La première concerne la possibilité de créer un compte [1] tandis que la deuxième permet une élévation de privilège [2].

Le point important, qui résulte de ces failles, est le fait qu’elles touchent le moteur du CMS et non un plugin qui aurait été mal développé par un développeur tiers (comme c’est régulièrement le cas).

Il est à noter que ces vulnérabilités affectent les versions de Joomla de 3.4.4 à 3.6.3. Les sites utilisant ce CMS sont donc vulnérables depuis le 8 septembre 2015, date de sortie de la version 3.4.4.

Un correctif de sécurité est d’ores et déjà disponible via la version 3.6.4.

Le patch

Afin de comprendre plus facilement le problème, nous avons regardé la différence entre les versions 3.6.3 et 3.6.4 sur le github de Joomla [3].joomla1

Comme nous pouvons le constater, la méthode « register » du contrôleur user a été supprimée dans ce correctif. Cette méthode permettait de créer un utilisateur, nous allons donc analyser le fonctionnement d’enregistrement d’un utilisateur.

1ère vulnérabilité : Création de compte

Lorsque l’option d’enregistrement d’utilisateur est autorisée, le formulaire de création suivant est disponible :

joomla2

Nous avons donc utilisé un proxy web afin d’analyser les requêtes entre le navigateur et le CMS, afin de mieux comprendre la cinématique.

joomla3

Nous voyons que le formulaire est envoyé avec les valeurs saisies par l’utilisateur et d’autres qui étaient présentes dans des champs cachés. Les parties intéressantes à analyser sont, d’une part dans l’URL et d’autre part dans le corps du message.

En effet, dans l’URL nous pouvons constater la présence d’un paramètre « task » avec comme valeur « registration.register » (que nous retrouvons aussi dans le corps de la requête). Cela fait référence à la méthode « register » du contrôleur « registration » que nous avons appelée.

Le corps de la requête est le suivant :

joomla

Nous constatons la présence d’un paramètre « option » avec pour valeur « com_users », celui-ci faisant référence au composant « com_users » qui se situe dans le répertoire « components ».

Si nous regardons le début du code associé à la méthode « register » du contrôleur « registration » du composant « com_users », nous avons ceci :

joomla

Le composant vérifie alors que nous sommes bien autorisés à nous enregistrer.

Lorsque nous regardons le code qui a été supprimé dans le contrôleur « user », il n’y avait pas de vérification pour savoir si nous étions autorisés ou non à exécuter le code.

Ainsi, au lieu d’appeler  « registration.register », si nous appelions « user.register », nous pouvions nous créer un compte sans avoir besoin d’être autorisé.

2ème vulnérabilité : Élévation de privilège

Un utilisateur est associé à un ou plusieurs groupes d’utilisateurs. Il existe un groupe particulier qui est le groupe des administrateurs.

Ainsi, afin d’effectuer une élévation de privilège, il convient d’ajouter dans la requête les groupes auxquels nous souhaitons adhérer et, à minima, nous mettrons l’identifiant du groupe administrateur afin d’avoir un contrôle total du CMS Joomla.

Conclusion

Nous avons pu constater que ces vulnérabilités sont critiques puisqu’elles permettent à n’importe quel attaquant de se créer un compte utilisateur avec des droits d’administration sur le CMS. Une fois ce compte créé, l’attaquant pourra alors installer un plugin Joomla malveillant (backdoor / webshell) afin de garder un accès persistant même quand le CMS sera mis à jour.

Nous recommandons donc vivement de mettre en place le correctif en migrant vers la version 3.6.4 mais également de vérifier l’intégrité des fichiers afin de vous assurer qu’aucune porte dérobée ne soit présente sur vos serveurs.

Il est fort probable que des attaques massives soient menées envers l’ensemble des CMS Joomla exposés sur Internet dans les prochains jours.

[1] https://developer.joomla.org/security-centre/659-20161001-core-account-creation.html

[2] https://developer.joomla.org/security-centre/660-20161002-core-elevated-privileges.html

[3] https://github.com/joomla/joomla-cms/commit/bae1d43938c878480cfd73671e4945211538fdcf