
Divulgation responsable d'une vulnérabilité non corrigée dans FluentCRM par WPManageNinja
Mise à jour 2023-06-12 : Vous n'avez plus besoin de l'extrait. WPManageNinja a corrigé la vulnérabilité deux heures après la divulgation publique (93 jours après le signalement).
Mise à jour 2024-01-27 : Le problème connexe lié aux valeurs de hachage permanentes est désormais entièrement résolu.
tl;dr Les attaquants peuvent afficher et modifier les détails des contacts dans FluentCRM. WPManageNinja n'a pas corrigé la vulnérabilité dans le délai de 90 jours de divulgation responsable. Je fournis un extrait d'atténuation pour empêcher l'exploitation de la vulnérabilité en attendant un correctif officiel.
Aujourd'hui, je publie des informations sur une vulnérabilité que j'ai trouvée dans le plugin WordPress populaire FluentCRM par WPManageNinja. La vulnérabilité, CVE-2023-1430, est causée par l'utilisation insuffisante d'un hachage d'adresse e-mail comme contrôle d'autorisation par FluentCRM. J'ai divulgué la vulnérabilité de manière responsable conformément à la politique de divulgation des vulnérabilités de Google Zero. WPManageNinja n'a fourni ni correctif dans le délai de 90 jours ni demandé de prolongation.
Dans ce rapport, contact fait référence à un objet contact FluentCRM, tandis que utilisateur fait référence à un objet utilisateur WordPress. Un contact peut être lié à un utilisateur, mais ce n'est pas une exigence. Les détails sur l'exploitation de la vulnérabilité sont retenus jusqu'à ce qu'un correctif officiel soit disponible. Les professionnels de la sécurité peuvent me contacter pour le rapport complet ([email protected]).
Sur les sites utilisant FluentCRM, un attaquant peut afficher et modifier le nom, l'adresse e-mail et les paramètres de liste d'un contact en connaissant l'adresse e-mail du contact. Étant donné que le nom du contact est souvent inclus dans les newsletters via des balises de fusion, un attaquant peut remplacer le nom du contact par un langage grossier, ce qui amène le propriétaire du site à envoyer des newsletters vulgaires. Si l'administrateur du site a activé le shortcode de FluentCRM pour gérer les préférences et l'a ajouté à une page web publique, un attaquant peut afficher et modifier toutes les informations personnelles exposées, c'est-à-dire le titre, le numéro de téléphone, la date de naissance et l'adresse (selon la configuration de FluentCRM).
FluentCRM est installé sur plus de 30 000 sites. Les administrateurs de sites FluentCRM peuvent empêcher l'exploitation de la vulnérabilité en ajoutant mon extrait d'atténuation au fichier functions.php de leur thème enfant.
L'extrait ne corrige pas la vulnérabilité. Il remplace le contenu vulnérable sur la page de désabonnement de FluentCRM (unsubscribe.php) et la page de gestion des préférences (manage_subscription.php) par un message d'erreur invitant le contact à contacter par e-mail. L'adresse e-mail dans le message d'erreur est l'adresse e-mail de l'administrateur du site (elle peut être modifiée à partir de l'extrait). L'extrait d'atténuation garantit également que les visiteurs non connectés ne peuvent pas afficher le shortcode vulnérable de FluentCRM pour la gestion des préférences (fluentcrm_pref). Un visiteur non connecté verra plutôt un message d'erreur l'invitant à se connecter. Toutes les chaînes sont traduisibles avec le fichier POT fourni.
Je recommande aux propriétaires de sites web de mettre en œuvre soit l'atténuation que je fournis, soit leur propre atténuation correspondante. Les propriétaires de sites doivent également vérifier l'intégrité de leurs données de contact FluentCRM et, si possible, consulter leurs journaux pour détecter d'éventuelles fuites de données. La vérification des journaux est particulièrement importante pour les sites suivants :
Le responsable du traitement des données désigné du site web doit gérer les fuites potentielles de données personnelles conformément aux lois et réglementations des juridictions concernées.
Si FluentCRM est configuré pour synchroniser les paramètres d'un contact avec son utilisateur correspondant, un attaquant peut modifier le nom de l'utilisateur. Heureusement, FluentCRM ne synchronise pas les adresses e-mail des contacts vers les utilisateurs. Si FluentCRM le faisait, cette vulnérabilité permettrait des prises de contrôle complètes du site. Un attaquant aurait pu obtenir un accès privilégié en modifiant l'adresse e-mail de l'administrateur du site, puis en réinitialisant le mot de passe de l'administrateur.
Cependant, d'autres solutions peuvent synchroniser toutes les métadonnées des contacts vers les utilisateurs, par exemple WP Fusion et l'API de FluentCRM. WP Fusion est probablement le plugin tiers le plus populaire pour synchroniser les métadonnées des contacts entre un CRM (par exemple FluentCRM) et WordPress. Heureusement, la version actuelle de WP Fusion n'est pas connectée aux modifications de métadonnées initiées à partir des formulaires vulnérables. J'ai informé les développeurs de WP Fusion, et ils ne résoudront cette limitation que lorsque WPManageNinja aura corrigé la vulnérabilité.
L'API de FluentCRM peut également être utilisée pour mettre à jour les données des contacts et des utilisateurs. Les propriétaires de sites qui utilisent l'API de FluentCRM pour mettre à jour les adresses e-mail des utilisateurs doivent désactiver cette mise à jour lorsqu'elle est initiée depuis la page ou le shortcode de FluentCRM pour la gestion des préférences (ou ajouter mon extrait d'atténuation pour garantir qu'aucun paramètre ne peut être mis à jour depuis les formulaires vulnérables).
FluentCRM permet aux contacts de se désabonner et de gérer leurs préférences à partir de pages web publiques. Des liens vers ces pages sont inclus dans chaque newsletter. Les modifications effectuées sur ces pages sont autorisées par les hachages MD5 des adresses e-mail des contacts, transmis comme paramètres d'URL. Le hachage MD5 d'une adresse e-mail n'est pas un secret et peut être calculé par n'importe qui. Un attaquant peut exploiter l'utilisation incorrecte des hachages pour désabonner des contacts spécifiques ou désabonner en masse des contacts dont les adresses e-mail sont connues.
Alors que la page de désabonnement repose uniquement sur le hachage MD5 pour l'autorisation, la page de gestion des préférences nécessite un paramètre d'URL supplémentaire appelé ce_id. Dans ce cas, le ce_id fait référence à l'ID du contact dans la table fc_subscribers. Cet ID est un entier incrémental. La valeur de ce_id est donc facilement trouvée en testant toutes les valeurs possibles (l'espace de recherche est le nombre de contacts jamais enregistrés sur le site). Les utilisateurs administrateurs ont probablement des valeurs faibles.