9 questions pour tout comprendre des dernières vulnérabilités touchant Joomla!

Après la publication d’une annonce concernant un important correctif de sécurité le 21 octobre dernier, les développeurs du CMS Joomla! ont publié la dernière mouture de leur projet, Joomla! 3.4.6, corrigeant deux vulnérabilités permettant à un simple visiteur de prendre le contrôle d’un site.

1. Qu’est-ce que Joomla! ?

Joomla! est un CMS (acronyme de « Content Management System »), c’est-à-dire un système de gestion de contenu. Il permet de créer facilement un site web grâce à des modèles préconstruits, un gestionnaire de thèmes, un backend de gestion des utilisateurs et différents modules personnalisables. Sa robustesse et ses nombreux paramétrages permettent ainsi à une entreprise comme à un particulier de construire des sites web personnalisés.

Ces atouts en font un des principaux concurrents du CMS WordPress, ainsi que d’autres CMS tels que Drupal ou SPIP. Cependant, comme tout CMS renommé, sa popularité en fait une cible de choix pour les pirates. Ainsi, il n’est pas rare de voir de nombreux correctifs mis à disposition par les développeurs du projet tout au long de l’année. Malgré cela, la communauté autour de Joomla! est très active et les problématiques liées à la sécurité sont désormais au coeur du projet.

2. Quels sont les impacts liés à ces vulnérabilités ?

Les vulnérabilités, référencées CVE-2016-8870 et CVE-2016-8869, permettent à un attaquant distant, non authentifié sur le CMS Joomla!, de créer un utilisateur avec les droits administrateur. Ce dernier dispose alors d’un contrôle total sur le site, voire sur le serveur sur lequel il est hébergé.

3. D’où viennent les vulnérabilités ?

Concernant la vulnérabilité référencée CVE-2016-8870 :

Dans les versions vulnérables de Joomla!, il existe deux méthodes permettant de créer un utilisateur :

  • La méthode « registration.register » est celle « officielle ». Un administrateur peut, via son interface web, désactiver cette fonctionnalité et empêcher la création de comptes sur son CMS. La méthode intègre des vérifications sur les données envoyées par l’utilisateur avant de l’enregistrer.
  • La méthode « user.register » est celle « historique ». L’administrateur n’a aucun pouvoir sur cette méthode. De plus, elle ne réalise aucun contrôle.

Celle-ci, présente au sein du fichier /components/com_users/controllers/user.php, ne présente pas de vérification quant à la possibilité de créer un utilisateur :

bypass_activation

L’enregistrement d’un nouvel utilisateur sur Joomla! passe traditionnellement par une requête qui utilise la méthode « officielle » :

  • [highlight3]POST index.php/component/users/?task=registration.register[/highlight3]

Le contenu de la requête est formé de multiples paramètres décrits plus loin au sein de cet article. Les données passent ensuite par la fonction « validate() » permettant de s’assurer que le nombre de champs envoyés correspond au nombre de champs attendus.

Le choix de la méthode d’enregistrement est donc réalisé au travers du paramètre « task ». Aucune vérification n’étant réalisée sur ce paramètre, un attaquant peut y spécifier la méthode de son choix. En appelant la méthode « user.register » plutôt que « registration.register », un attaquant pourra ainsi créer un compte même si l’administrateur a désactivé la fonctionnalité:

  • [highlight3]POST index.php/component/users/?task=user.register[/highlight3]

joomla_recap

Concernant la vulnérabilité référencée CVE-2016-8869 :

Originellement, la méthode « registration.register » contient des paramètres sous la forme de tableaux portant les noms suivants :

  • jform[name],
  • jform[username],
  • jform[password],
  • etc.

Le nombre de champs ainsi envoyés est contrôlé avant l’écriture des données en base via la fonction « validate() », empêchant la création d’un paramètre supplémentaire.

joomla_filter

La vérification est réalisée par la fonction « filter() », elle-même présente au sein de « validate() » qui vérifie que les champs renseignés par l’utilisateur correspondent bien à ceux attendus. Tout champ supplémentaire est alors simplement supprimé, sans pour autant provoquer d’erreur. Pour ce faire, la fonction utilise comme référence le fichier « registration.xml » qui recense toutes les informations liées à la requête « register » :

  • https://github.com/joomla/joomla-cms/blob/91749f845dcf20e097801ecd75da8e4665075a18/components/com_users/models/forms/registration.xml

Cette vérification est bien réalisée sur les deux méthodes (« l’historique », comme « l’officielle »). Mais alors pourquoi la fonction « historique » est-elle vulnérable ?

La vulnérabilité provient d’une simple erreur de nommage de variable, ou d’un copier/coller malheureux. En effet, la variable $data contenant les champs user[name], user[username], etc. est comparée aux champs attendus par Joomla! stockés au sein de la variable $form, via la fonction « validate() ». Le champ « groups[] » supplémentaire est ainsi supprimé, et l’ensemble des champs est inséré dans la variable $return.

Cependant, la dernière ligne du code permettant l’enregistrement en base de données du nouvel utilisateur récupère le champ $data original, qui contient encore le champ « groups[] ».

copypaste

L’enregistrement de l’utilisateur est donc réalisé directement à partir des entrées utilisateur sans filtrage préalable. Un attaquant peut ainsi ajouter le champ « groups[] ».

Cet ajout permet de définir le groupe auquel l’utilisateur appartiendra. Par défaut, le groupe « administrateur » est le groupe numéro « 7 ». En renseignant ainsi cette valeur, un attaquant peut obtenir les privilèges administrateur sur un CMS vulnérable. Cette seconde vulnérabilité est référencée CVE-2016-8869.

4. Suis-je impacté par ces vulnérabilités ?

Seules les versions 3.4.4 à 3.6.3 de Joomla! sont affectées par ces vulnérabilités. Si vous disposez d’une version antérieure à 3.4.4 ou supérieure à 3.6.3, vous n’êtes pas impactés. Cela est du à une simple modification dans la méthode « user.register ». Auparavant, celle-ci ne récupérait pas le formulaire $form nécessaire à la fonction « validate() », ce qui empêchait la création d’un utilisateur par cette méthode.

 

joomla34

5. Depuis combien de temps ces vulnérabilités sont présentes ?

La version 3.4.4 de Joomla! a été publiée le 08 septembre 2015. Ces vulnérabilités sont donc vieilles de plus d’un an.

6. La vulnérabilité est-elle exploitée sur Internet ? Existe-t-il des codes d’exploitation ?

Selon les experts de la société Sucuri, aucun site Internet n’a été piraté en utilisant cette faille avant sa publication au grand public, le 25 octobre 2016. Cependant, le nombre de tentatives d’exploitation après la divulgation de cette dernière a grimpé de manière exponentielle dans les deux jours ayant suivi l’annonce. L’exploitation de ces vulnérabilités étant simple, même pour un novice, de nombreux acteurs tentent leur chance via des scans massifs à la recherche d’un site vulnérable.

Un code d’exploitation complet est disponible à l’adresse suivante :

Ce dernier crée un compte administrateur nommé « hacker », puis tente d’exécuter un fichier PHP pour vérifier que l’exploitation s’est bien déroulée. Néanmoins, un attaquant devra modifier le code de l’exploit s’il veut charger son propre webshell afin d’exécuter des commandes arbitraires sur le serveur sous-jacent.

7. Comment corriger ces vulnérabilités ?

La seule méthode simple et fiable permettant de corriger ces vulnérabilités est de mettre à jour Joomla! vers la version 3.6.4 ou supérieure.

Le patch de sécurité est relativement simple puisque la méthode « historique » « user.register » a été purement et simplement supprimée :

  • https://github.com/joomla/joomla-cms/commit/bae1d43938c878480cfd73671e4945211538fdcf

8. Dois-je patcher en urgence ?

Si votre version est affectée, oui. Cette vulnérabilité est facile à exploiter et permet de prendre le contrôle total de votre site, voire du serveur sur lequel il est hébergé. Il est donc très fortement recommandé de mettre à jour au plus vite, en téléchargeant la dernière version de Joomla! disponible depuis le site officiel :

9. Cette vulnérabilité est-elle plus critique que la CVE-2015-8562 ?

Pour rappel, la CVE-2015-8562 permettait à un attaquant distant non authentifié d’exécuter des commandes à distance sur un système hébergeant le CMS Joomla! (voir ActuSecu #43). La vulnérabilité CVE-2015-8562 reste très importante puisqu’elle touche quasiment toutes les versions du CMS. Cependant, les vulnérabilités CVE-2016-8870 et CVE-2016-8869, bien que touchant potentiellement moins d’installations restent très simples à exploiter, pour un impact très important. Elles sont donc loin d’être négligeables.

Adrien Guinault

Découvrir d'autres articles