
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.
Depuis la page de gestion des préférences, un attaquant peut également exfiltrer la valeur secure_hash du contact. En mettant à jour l'adresse e-mail du contact, la valeur « secure_hash » du contact est stockée dans un cookie appelé fc_hash_secure. Avec ce cookie en place, l'attaquant peut afficher toutes les informations de contact rendues disponibles par le shortcode du formulaire de préférences de FluentCRM.
Le « secure_hash » mentionné précédemment est une valeur sur laquelle FluentCRM (dans certaines situations) s'appuie au lieu du hachage MD5 de l'adresse e-mail ou comme alternative. Depuis la version 2.8.0 de FluentCRM, la page de désabonnement repose exclusivement sur la valeur secure_hash pour l'autorisation. La page de gestion des préférences accepte à la fois la nouvelle valeur secure_hash et l'ancien hachage MD5 de l'adresse e-mail pour l'autorisation.
Bien que la valeur secure_hash ne puisse pas être dérivée de l'adresse e-mail, l'utilisation de FluentCRM ne suit pas les bonnes pratiques de sécurité. La valeur secure_hash est générée une fois par contact. Elle n'est jamais mise à jour et n'expire jamais. Cela pose problème car la valeur secure_hash est incluse dans chaque newsletter. Si un attaquant accède à la boîte de réception d'un contact, il peut modifier indéfiniment les paramètres du contact. Si le contact concerné est lié à un utilisateur disposant de privilèges d'administrateur et que les changements d'adresse e-mail sont synchronisés de FluentCRM vers WordPress, chaque newsletter envoyée à ce contact contiendra un token qui n'expire jamais pour prendre le contrôle du site.
J'ai signalé ce problème connexe à WPManageNinja le 2023-03-15. Deux mois plus tard (2023-05-15), WPManageNinja a répondu que leurs conseillers en sécurité ne considéraient pas la valeur secure_hash statique comme un problème. Les conseillers en sécurité de WPManageNinja ont déclaré qu'il était « acceptable d'utiliser ce type de tokens générés une seule fois pour identifier le contact » et que c'était « similaire aux tokens API des services SaaS qui ne sont délivrés à aucun autre contact mais uniquement envoyés au contact réel propriétaire de l'adresse e-mail ».
WPManageNinja a fait preuve d'ouverture d'esprit et m'a dit de les informer si je pensais toujours que c'était un problème de sécurité, ce que j'ai fait. J'ai expliqué pourquoi les valeurs secure_hash ne pouvaient pas être comparées aux tokens API. (Les tokens API peuvent être assurés d'être envoyés uniquement sur des connexions TLS, et l'accès aux tokens API peut être restreint. Ce n'est pas le cas des valeurs en clair dans les e-mails. Plus important encore, les tokens API peuvent être révoqués alors qu'il n'y a aucun moyen pour un contact de révoquer une valeur secure_hash.)
Plus tard dans la journée, WPManageNinja m'a remercié et a dit qu'ils envisageaient de combiner l'ID d'enregistrement de l'e-mail avec le hachage. Cela résoudra le problème si cela est mis en œuvre conjointement avec la révocation automatique des anciennes valeurs secure_hash (expiration basée sur le temps) ou précédentes (expiration basée sur un compteur). Cette fonctionnalité n'a pas encore été mise en œuvre, mais je ne considère pas l'utilisation de valeurs de hachage statiques comme faisant partie de cette CVE.
Au premier trimestre 2023, nous avons commencé à migrer de notre ancien outil de newsletter (Sendy) vers FluentCRM. J'ai trouvé la vulnérabilité lors de l'intégration de FluentCRM avec Nikka Systems Academy (Projet Opal). Comme nous avons remplacé le système de gestion des abonnements de FluentCRM par notre plugin personnalisé, les formulaires vulnérables de FluentCRM n'ont jamais affecté notre site ni les données de nos clients.
FluentCRM est un excellent plugin, mais la gestion de la divulgation de la vulnérabilité par WPManageNinja laisse beaucoup à désirer. La liste suivante est ma suggestion sur la façon dont WPManageNinja pourrait améliorer la situation.
Cela dit, j'ai toujours confiance en WPManageNinja. Il y a des bugs dans tous les logiciels, et un seul rapport de vulnérabilité mal géré n'est pas une raison pour cesser d'utiliser leurs plugins.
Mise à jour 2023-06-12 : Le fait qu'ils aient encore essayé de cacher la vulnérabilité dans leur journal des modifications m'inquiète vraiment. (Ils ont maintenant ajouté le CVE.)