Le 19 juin, notre équipe Threat Intelligence a découvert une vulnérabilité présente dans Commentaires – wpDiscuz, un plugin WordPress installé sur plus de 80 000 sites. Cette faille permettait aux attaquants non authentifiés 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 d’abord contacté le développeur du plugin le 18 juin 2020, et après avoir établi un canal de communication approprié, nous avons fourni tous les détails de divulgation le 19 juin 2020. Les développeurs ont répondu le 20 juin 2020 pour nous faire savoir qu’un correctif serait à venir dans la version 7.0.4. Après plusieurs suivis, un premier correctif a été publié le 19 juillet 2020, et un correctif suffisant a été publié le 23 juillet 2020.

Cette vulnérabilité a été introduite dans la dernière mise à jour majeure du plug-in. Ceci est considéré comme un problème de sécurité critique pouvant conduire à l’exécution de code à distance sur le serveur d’un site vulnérable. Si vous exécutez une version de 7.0.0 à 7.0.4 de ce plugin, nous vous recommandons vivement de mettre à jour immédiatement vers la version corrigée, 7.0.5.

Wordfence Premium et les utilisateurs gratuits sont protégés contre toute attaque tentant d’exploiter cette vulnérabilité grâce à la protection intégrée de téléchargement de fichiers malveillants du pare-feu.


wpDiscuz est un plugin conçu pour créer des zones de commentaires réactives sur les installations WordPress. Il permet aux utilisateurs de discuter de sujets et de personnaliser facilement leurs commentaires à l’aide d’un éditeur de texte enrichi. Dans la dernière refonte du plugin, les versions 7.x.x, ils ont ajouté la possibilité d’inclure des pièces jointes d’image dans les commentaires qui sont téléchargés sur le site et inclus dans les commentaires. Malheureusement, la mise en œuvre de cette fonctionnalité manquait de protections de sécurité, créant une vulnérabilité critique.

Les commentaires wpDiscuz sont destinés à n’autoriser que les pièces jointes d’image. Cependant, en raison des fonctions de détection du type de fichier mime utilisées, la vérification du type de fichier peut facilement être contournée, permettant aux utilisateurs non authentifiés de télécharger tout type de fichier, y compris les fichiers PHP.

Récupération du type Mime

Le ‘getMimeType’Utilise trois méthodes différentes pour déterminer le type mime d’un fichier. Le premier chèque utilisé mime_content_type, qui détermine le type d’un fichier en fonction de son contenu. Si cette fonction PHP n’était pas disponible, elle utiliserait finfo_file, qui détermine également le type mime d’un fichier en fonction du contenu du fichier. Enfin, si cette fonction n’était pas disponible, elle utiliserait wp_check_filetype, qui est une vérification de type de fichier spécifique à WordPress qui détermine le type mime d’un fichier en fonction du nom du fichier et le compare à une liste intégrée de types de fichiers autorisés.

La plupart des fichiers commencent par plusieurs soi-disant «octets magiques» qui sont une signature spécifique qui peut être utilisée pour déterminer leur type Mime. Malheureusement, en raison de la façon dont PHP traite les fichiers, il ignore tout ce qui se trouve dans le fichier avant l’ouverture marque. En tant que telles, les deux premières fonctions utilisées pourraient facilement permettre aux fichiers d'être usurpés et d'apparaître comme des fichiers image autorisés simplement en ajoutant des octets magiques spécifiques à l'image. Par exemple, un utilisateur peut insérer les octets magiques pour un fichier .png, 89 50 4E 47 0D 0A 1A 0A, au début d'un fichier PHP et tromper les deux premières fonctions.

 foreach ($files as $file) {
   $error = false;
   $extension = pathinfo($file["name"], PATHINFO_EXTENSION);
   $mimeType = $this->getMimeType($file, $extension);

   private function getMimeType($file, $extension) {
        $mimeType = "";
        if (function_exists("mime_content_type")) {
            $mimeType = mime_content_type($file["tmp_name"]);
        } elseif (function_exists("finfo_open") && function_exists("finfo_file")) {
            $finfo = finfo_open(FILEINFO_MIME_TYPE);
            $mimeType = finfo_file($finfo, $file["tmp_name"]);
        } elseif ($extension) {
            $matches = wp_check_filetype($file["name"], $this->options->content["wmuMimeTypes"]);
            $mimeType = empty($matches["type"]) ? "" : $matches["type"];
        }
        return $mimeType;
    }

Vérification des types de fichiers autorisés

Le problème a été escaladé avec le "isAllowedFileType'Qui a vérifié si le fichier était un type de fichier autorisé car il utilisait le mime du'getMimeType' fonction. En raison du fait que le ‘getMimeType’Utilise des fonctions pour obtenir le type mime d’un fichier en fonction du contenu du fichier, tout type de fichier peut facilement être usurpé pour ressembler à un type de fichier autorisé et réussir cette vérification.

   private function isAllowedFileType($mimeType) {
        $isAllowed = false;
        if (!empty($this->options->content["wmuMimeTypes"]) && is_array($this->options->content["wmuMimeTypes"])) {
            $isAllowed = in_array($mimeType, $this->options->content["wmuMimeTypes"]);
        }
        return $isAllowed;
    }

Les possibilités d'exploitation

Cela a permis aux attaquants de créer n'importe quel type de fichier et d'ajouter des fonctionnalités d'identification d'image aux fichiers pour passer le contrôle de vérification du contenu du fichier. Un fichier PHP tentant de contourner cette vérification pourrait ressembler à ceci dans une requête:

------WebKitFormBoundaryXPeRFAXCS9qPc2sB
Content-Disposition: form-data; name="wmu_files[0]"; filename="myphpfile.php"
Content-Type: application/php

‰PNG

L’emplacement du chemin d’accès au fichier a été renvoyé dans le cadre de la réponse à la demande, ce qui permet à l’utilisateur de trouver facilement l’emplacement du fichier et d’accéder au fichier chargé sur le serveur. Cela signifiait que les attaquants pouvaient télécharger des fichiers PHP arbitraires, puis accéder à ces fichiers pour déclencher leur exécution sur le serveur, réalisant ainsi l'exécution de code à distance.

Si elle est exploitée, cette vulnérabilité pourrait permettre à un attaquant d'exécuter des commandes sur votre serveur et de traverser votre compte d'hébergement pour infecter davantage les sites hébergés dans le compte avec du code malveillant. Cela donnerait effectivement à l'attaquant un contrôle complet sur chaque site de votre serveur.

Heureusement, les utilisateurs de Wordfence Premium et ceux qui utilisent encore la version gratuite sont protégés contre cette vulnérabilité grâce à la protection intégrée contre le téléchargement de fichiers malveillants du pare-feu.

Une autre façon de rester protégé.

Wordfence a une fonctionnalité pour désactiver l'exécution de code dans le répertoire des téléchargements. 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 peuvent 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 de téléchargement, 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.

Vous pouvez trouver cette fonctionnalité en allant dans Wordfence -> Toutes les options -> Options générales de Wordfence -> «Désactiver l'exécution de code pour le répertoire des téléchargements». Cochez simplement la case pour activer la fonctionnalité et enregistrer vos modifications.

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 à la fois de la gravité critique de cette vulnérabilité et de la facilité d'exploitation, nous n'avons pas créé de 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 Heures de bureau de Wordfence le mardi 4 août à 12h00 HNE. Cela nous permet de donner aux utilisateurs suffisamment de temps pour 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 à une date ultérieure.

Calendrier de divulgation

18 juin 2020 - Découverte initiale de la vulnérabilité. Nous vérifions que le pare-feu Wordfence offre une protection contre les tentatives d’exploitation et nous effectuons notre première tentative de contact avec l’équipe du plugin.
19 juin 2020 - L'équipe du plugin confirme la boîte de réception pour gérer la divulgation. Nous envoyons tous les détails de la divulgation.
20 juin 2020 - L’équipe du plugin nous a fait savoir qu’un correctif sera publié dans la version 7.0.4.
6 juillet 2020 - Suivi car aucun patch n'a été publié.
10 juillet 2020 - Ils répondent pour nous faire savoir qu'un patch arrive dans 1-2 jours.
13 juillet 2020 - Suivi car aucun patch n'a été publié.
15 juillet 2020 - Ils répondent en disant qu'un patch sera publié d'ici la fin de la semaine.
20 juillet 2020 - Un patch a été publié. Nous vérifions le correctif et voyons que la vulnérabilité est toujours exploitable et les informons.
23 juillet 2020 - Un correctif suffisant a été publié dans la version 7.0.5

Conclusion

Dans l'article d'aujourd'hui, nous avons détaillé une faille dans wpDiscuz qui permettait aux utilisateurs non authentifiés de télécharger des fichiers arbitraires, y compris des fichiers PHP, et d'exécuter ces fichiers sur le serveur. Cette faille a été entièrement corrigée dans la version 7.0.5. Nous recommandons aux utilisateurs de mettre immédiatement à jour vers la dernière version disponible, qui est la version 7.0.5 au moment de cette publication.

Les deux sites utilisant Wordfence Premium et 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 ce plugin sur son site, nous vous recommandons vivement de lui transmettre cet avis pour aider à garder ses sites protégés car il s'agit d'une mise à jour de sécurité critique.


Source link