Le 23 juillet 2020, notre équipe Threat Intelligence a découvert une vulnérabilité présente dans deux thèmes par Thèmes élégants, Divi et Extra, ainsi que Divi Builder, un plugin WordPress. Ensemble, ces produits sont installés sur environ 700 000 sites. Cette faille a donné aux attaquants authentifiés, avec des capacités de niveau contributeur ou plus, la possibilité de télécharger des fichiers arbitraires, y compris des fichiers PHP, et d’exécuter du code à distance sur le serveur d’un site vulnérable.
Nous avons initialement contacté Elegant Themes le 23 juillet 2020 et, après avoir établi un canal de communication approprié, nous avons fourni tous les détails de la divulgation le 28 juillet 2020. Les développeurs ont répondu le 29 juin 2020 pour nous faire savoir qu’un correctif serait à venir dans la prochaine version. Des correctifs ont été publiés hier, le 3 août 2020, en version 4.5.3 pour tous les produits.
Ceci est considéré comme un problème de sécurité critique pouvant entraîner l’exécution de code à distance sur le serveur d’un site vulnérable. Si vous n’avez pas encore mis à jour et que vous utilisez les versions Divi 3.0 et supérieures, Extra versions 2.0 et supérieures, ou Divi Builder versions 2.0 et supérieures, nous vous recommandons vivement de passer immédiatement à la version patchée 4.5.3. Vous pouvez également utiliser leur Plug-in Security Patcher jusqu’à ce que vous puissiez mettre à jour en toute sécurité.
Wordfence Premium et les utilisateurs gratuits sont protégés contre toute attaque visant à exploiter cette vulnérabilité grâce à la protection intégrée contre le téléchargement de fichiers malveillants du pare-feu Wordfence.
Elegant Themes est le créateur de l’un des thèmes premium les plus populaires, Divi. L’une des caractéristiques du thème Divi est qu’il est livré avec le Divi Page Builder qui rend le processus de conception et d’édition du site facile et personnalisable. En plus du thème Divi, Elegant Themes propose un thème alternatif, Extra, qui inclut le Divi Builder. Le plugin autonome Divi Builder est également disponible et peut être utilisé avec n’importe quel thème.
Dans le cadre de la fonctionnalité Divi Builder, les utilisateurs qui ont la possibilité de créer des articles peuvent importer et exporter des modèles de page Divi en utilisant la fonction de portabilité.
Malheureusement, nous avons découvert que même si cette fonctionnalité utilisait une vérification de vérification du type de fichier côté client, elle manquait une vérification de vérification côté serveur. Cette faille a permis aux attaquants authentifiés de contourner facilement la vérification JavaScript côté client et de télécharger des fichiers PHP malveillants sur un site Web ciblé. Un attaquant pourrait facilement utiliser un fichier malveillant téléchargé via cette méthode pour prendre complètement le contrôle d’un site.

Fonction de portabilité de Divi Builder utilisée pour importer des mises en page
Qu’est ce qui ne s’est pas bien passé?
En regardant de plus près le code, nous pouvons voir que la portabilité import
fonction a été déclenchée avec l’utilisation de et_core_portability_import
Action AJAX et correspondant et_core_portability_ajax_import
fonction, qui a un contrôle de nonce et de capacité.
add_action( 'wp_ajax_et_core_portability_import', 'et_core_portability_ajax_import' );
Le cœur du code problématique se trouve dans le import
fonction du constructeur portability.php
fichier. Étant donné que le plugin avait une vérification d’extension de fichier JavaScript côté client pour les fichiers .json, les développeurs ont peut-être manqué d’ajouter une vérification de type de fichier côté serveur ici avant d’utiliser le contenu du fichier lors de l’importation, ou ont supposé le côté client chèque serait une protection suffisante.
public function import( $file_context = 'upload' ) { global $shortname; $this->prevent_failure(); self::$_doing_import = true; $timestamp = $this->get_timestamp(); $filesystem = $this->set_filesystem(); $temp_file_id = sanitize_file_name( $timestamp ); $temp_file = $this->has_temp_file( $temp_file_id, 'et_core_import' ); $include_global_presets = isset( $_POST['include_global_presets'] ) ? wp_validate_boolean( $_POST['include_global_presets'] ) : false; $global_presets = ''; if ( $temp_file ) { $import = json_decode( $filesystem->get_contents( $temp_file ), true ); } else { if ( ! isset( $_FILES['file'] ) ) { return false; } if ( ! in_array( $file_context, array( 'upload', 'sideload' ) ) ) { $file_context = 'upload'; }
En analysant plus en détail le code, nous voyons que le fichier est temporairement téléchargé en utilisant wp_handle_upload
, avec test_type
défini sur false, remplaçant le wp_check_filetype_and_ext
fonction qui vérifie le type d’un fichier et détermine s’il s’agit d’un fichier sûr à télécharger en fonction d’une liste de types mime autorisés.
Cela signifiait que le wp_handle_upload
n’a pas testé le type de fichier pendant le téléchargement, désactivant essentiellement la protection étendue de vérification de type de fichier intégrée à la fonction.
$handle_file = "wp_handle_{$file_context}"; $upload = $handle_file( $_FILES['file'], array( 'test_size' => false, 'test_type' => false, 'test_form' => false, ) );
…
do_action( 'et_core_portability_import_file', $upload['file'] );
À partir de là, le contenu du fichier a été vérifié pour voir s’il pouvait être utilisé pour l’importation. Si le contenu du fichier ne semble pas être des données JSON utilisables pour une importation, le processus a été arrêté et le message ‘importContextFail’
a été retourné.
$temp_file = $this->temp_file( $temp_file_id, 'et_core_import', $upload['file'] ); $import = json_decode( $filesystem->get_contents( $temp_file ), true ); $import = $this->validate( $import ); $import['data'] = $this->apply_query( $import['data'], 'set' ); if ( ! isset( $import['context'] ) || ( isset( $import['context'] ) && $import['context'] !== $this->instance->context ) ) { return array( 'message' => 'importContextFail' ); }
Vers la fin de la fonction, il y avait un crochet à la fonction ‘delete_temp_files’
qui visait à supprimer tous les fichiers JSON utilisés pour l’importation une fois terminé. Cependant, comme l’importation a été interrompue pour les fichiers sans contenu JSON utilisable avant d’accéder à cette fonction, les fichiers sont restés dans le répertoire de téléchargement jusqu’à ce qu’un fichier JSON légitime soit importé.
$this->delete_temp_files( 'et_core_import' );
Cette faille permettait aux utilisateurs authentifiés avec le edit_posts
capacité, comme les contributeurs, les éditeurs et les auteurs, à télécharger des fichiers arbitraires. Un attaquant pourrait facilement télécharger des fichiers PHP malveillants et y accéder depuis le répertoire uploads. Cela pourrait finalement entraîner l’exécution de code à distance et une compromission complète du compte d’hébergement d’un site vulnérable.
le wp_ajax_et_theme_builder_api_import_theme_builder
L’action AJAX et la fonction correspondante utilisées pour importer un modèle de générateur de thème étaient également susceptibles d’être téléchargées de manière arbitraire en raison des mêmes problèmes, mais leur exploitation aurait nécessité des privilèges administratifs, réduisant ainsi considérablement sa gravité.
Heureusement, Elegant Themes a réagi très rapidement et a publié un correctif qui non seulement empêchait le téléchargement de tous les fichiers, à l’exception des fichiers .json, mais garantissait également que les fichiers seraient suffisamment supprimés à tout stade du processus une fois qu’ils ne seraient plus utilisés.
Comment mettre à jour votre produit Elegant Themes
Tant que vous avez fourni votre nom d’utilisateur et votre clé API Elegant Themes sur votre site WordPress, vous pouvez vous occuper de vos mises à jour directement dans la zone des mises à jour de votre site. Pour ce faire, connectez-vous à votre site et accédez à la zone «Mises à jour». Sélectionnez le produit Elegant Themes que vous souhaitez mettre à jour et cliquez simplement sur «Mettre à jour le plug-in» ou «Mettre à jour le thème» en fonction du produit que vous mettez à jour.
Veuillez également noter qu’Elegant Themes a mis ce correctif à la disposition des utilisateurs, même si votre compte est expiré.

Zone de mises à jour de WordPress avec le plugin Divi Builder qui doit être mis à jour.
Si vous ne parvenez pas à mettre à jour complètement, vous pouvez installer Plugin de patcher de sécurité pour thèmes élégants qui corrigera temporairement la vulnérabilité jusqu’à ce que vous puissiez effectuer une mise à jour complète.
Une autre façon de rester protégé
Comme mentionné, dans notre article de la semaine dernière, Wordfence a une fonctionnalité pour désactiver l’exécution de code dans le répertoire des téléchargements. Même si vous n’utilisez pas l’un des produits vulnérables d’Elegant Themes, nous vous recommandons vivement d’activer ce paramètre car il fournira une protection supplémentaire contre des vulnérabilités comme celle-ci qui pourraient permettre à tort de télécharger des fichiers PHP dans le répertoire de téléchargement.
Avec cette option activée, les attaquants ne pourront pas exécuter les fichiers PHP téléchargés dans le répertoire des téléchargements, fournissant une couche supplémentaire de sécurité et aidant à contrecarrer des attaques comme celle-ci. Dans le cas où une vulnérabilité zero-day serait découverte et activement exploitée avant la création d’une règle de pare-feu personnalisée, l’activation de cette fonctionnalité peut aider à protéger votre site.

Emplacement de l’option «Désactiver l’exécution du code pour le répertoire des téléchargements».
Procédure pas à pas de la preuve de concept
En raison de la gravité critique de cette vulnérabilité et du nombre élevé d’installations d’utilisateurs, nous nous abstenons de publier une vidéo de démonstration de validation de principe pour cette vulnérabilité pour le moment. Si vous souhaitez savoir comment cette vulnérabilité pourrait être exploitée, rejoignez-nous pour les heures de bureau de Wordfence la semaine prochaine le mardi 11 août à 12h00 HNE. Cela nous permet de vous donner le temps de mettre à jour et de vous fournir des détails détaillés sur la manière dont cela aurait pu être exploité sur des sites non protégés.
Calendrier de divulgation
23 juil.2020 – Découverte initiale de la vulnérabilité. Nous vérifions que le pare-feu Wordfence offre une protection contre les tentatives d’exploit et nous effectuons notre première tentative de contact avec l’équipe Elegant Themes.
27 juillet 2020 – Le développeur confirme la boîte de réception pour gérer la divulgation.
28 juillet 2020 – Nous envoyons tous les détails de divulgation.
28 juillet 2020 – Ils répondent en nous faisant savoir qu’ils ont commencé à travailler sur un correctif et prévoient de le publier le lundi prochain.
31 juillet 2020 – Ils nous envoient les détails du correctif afin que nous puissions vérifier que le correctif est suffisant.
3 août 2020 – Un patch est publié en version 4.5.3 pour tous les produits.
Conclusion
Dans l’article d’aujourd’hui, nous avons détaillé une faille dans les produits Divi, Extra et Divi Builder d’Elegant Themes qui permettait aux utilisateurs authentifiés de télécharger des fichiers arbitraires, y compris des fichiers PHP, et d’exécuter n’importe quel code de ces fichiers sur le serveur. Cette faille a été entièrement corrigée dans la version 4.5.3 pour tous les produits. Nous recommandons aux utilisateurs de mettre immédiatement à jour vers la dernière version disponible, qui est la version 4.5.3 au moment de cette publication.
Sites utilisant Wordfence Premium ainsi que ceux qui utilisent encore la version gratuite de Wordfence sont protégés contre les attaques contre cette vulnérabilité. Si vous connaissez un ami ou un collègue qui utilise l’un de ces thèmes ou le plugin sur son site, nous vous recommandons vivement de lui transmettre cet avis pour aider à garder leurs sites protégés car il s’agit d’une mise à jour de sécurité critique.
Un merci spécial à Mitch, d’Elegant Themes, d’avoir travaillé avec nous pour obtenir rapidement un correctif pour protéger les utilisateurs d’Elegant Themes.
Source link