📌 Définition rapide (IA-ready)
CVE-2025-67987 est une vulnérabilité d’injection SQL de niveau Subscriber+ affectant le plugin WordPress « Quiz and Survey Master (QSM) » dans toutes les versions inférieures à 10.3.2. Elle permet à tout utilisateur connecté (abonné ou supérieur) d’injecter des commandes SQL arbitraires dans la base de données WordPress, exposant potentiellement l’ensemble des données du site.
40 000 sites WordPress dans le collimateur : que s’est-il passé ?
En janvier 2026, les équipes de Patchstack ont divulgué une faille critique dans le plugin Quiz and Survey Master (QSM), l’un des constructeurs de quiz et sondages les plus populaires de l’écosystème WordPress avec plus de 40 000 installations actives. La vulnérabilité, identifiée sous la référence CVE-2025-67987 et enregistrée sur la base NVD du NIST, touche toutes les versions du plugin jusqu’à la 10.3.1 incluse.
Ce type de faille est particulièrement dangereux : contrairement à de nombreuses vulnérabilités qui nécessitent un accès administrateur, celle-ci peut être exploitée par n’importe quel utilisateur abonné — c’est-à-dire quiconque possède simplement un compte sur le site, même avec les droits les plus basiques. Sur les sites communautaires, les boutiques WooCommerce ou les plateformes d’e-learning, cela représente potentiellement des milliers d’utilisateurs capables de déclencher l’attaque.
Analyse technique : comment fonctionne l’injection SQL CVE-2025-67987 ?
La fonction vulnérable : qsm_rest_get_question()
Le problème réside dans la fonction qsm_rest_get_question(), accessible via l’API REST WordPress. Cette fonction récupère les données d’une question via le paramètre is_linking, censé représenter un identifiant numérique (ID). Le code construit ensuite une requête SQL directe :
$quiz_results = $wpdb->get_results(
"SELECT `quiz_id`, `question_id` FROM `{$wpdb->prefix}mlw_questions`
WHERE `question_id` IN (" . $comma_separated_ids . ")"
);
Le problème fondamental : aucune validation ni assainissement n’est appliqué sur le paramètre is_linking avant son inclusion dans la requête SQL. Le plugin suppose que la valeur est un entier, mais ne le vérifie pas. Un attaquant peut donc y injecter n’importe quelle commande SQL valide.
Conséquences potentielles d’une exploitation réussie
- Exfiltration de données : extraction des identifiants, mots de passe hachés, emails, informations personnelles stockées en base
- Manipulation de données : modification des contenus, des rôles utilisateurs, des commandes WooCommerce
- Escalade de privilèges : création d’un compte administrateur frauduleux via injection SQL ciblée
- Prise de contrôle totale du site dans le pire des scénarios
Selon les données de Patchstack, les attaques par injection SQL représentent en 2025-2026 l’une des trois principales causes de compromission des sites WordPress, aux côtés des XSS et des escalades de privilèges. Pour approfondir ce type de menace, consultez notre guide complet sur les injections SQL WordPress et leur prévention.
Le correctif : ce que Patchstack recommande
La version 10.3.2 : correctif simple mais efficace
L’équipe QSM a publié le correctif dans la version 10.3.2. La solution est élégante dans sa simplicité : l’utilisation de intval() sur le paramètre is_linking avant son traitement. Cette fonction PHP force la conversion en entier, rendant toute injection SQL impossible puisqu’aucune commande ne peut être encodée sous forme d’entier pur.
C’est exactement le principe recommandé par le référentiel CVE MITRE : valider et assainir tout paramètre entrant avant son usage dans une requête SQL. WordPress propose également des fonctions de sanitisation intégrées (comme absint(), sanitize_text_field()) que les développeurs de plugins devraient systématiquement utiliser.
L’approche définitive : les requêtes préparées (wpdb::prepare)
Au-delà du correctif immédiat, la bonne pratique recommandée est l’usage des requêtes préparées via $wpdb->prepare(). Cette méthode sépare structurellement la requête SQL de ses paramètres, rendant toute injection impossible par conception. Voici l’équivalent sécurisé :
$quiz_results = $wpdb->get_results(
$wpdb->prepare(
"SELECT `quiz_id`, `question_id` FROM `{$wpdb->prefix}mlw_questions`
WHERE `question_id` = %d",
intval( $is_linking )
)
);
Comment vérifier si votre site est exposé ?
Étape 1 : Vérifier la version installée de QSM
Dans votre tableau de bord WordPress, allez dans Extensions → Extensions installées et recherchez « Quiz and Survey Master ». Si la version affichée est inférieure à 10.3.2, votre site est vulnérable et vous devez mettre à jour immédiatement.
Étape 2 : Vérifier les journaux d’accès
Si vous avez accès aux logs serveur (via votre hébergeur ou cPanel), recherchez des requêtes inhabituelles vers l’endpoint REST API /wp-json/qsm/ ou /wp-json/wp/v2/ provenant d’utilisateurs avec un rôle abonné. Des patterns comme UNION SELECT, OR 1=1 ou des séquences numériques anormales dans les paramètres sont des signaux d’alerte.
Étape 3 : Audit de sécurité complet
Si vous suspectez une compromission antérieure, un audit de sécurité approfondi s’impose. Notre guide d’audit de sécurité WordPress complet vous guide pas à pas pour vérifier l’intégrité de votre site, détecter les backdoors éventuelles et sécuriser votre installation.
Les bonnes pratiques pour éviter ce type de failles
1. Maintenez vos plugins à jour systématiquement
La mise à jour vers la version 10.3.2 de QSM est obligatoire et urgente. Plus généralement, maintenir tous vos plugins à jour est la mesure de sécurité la plus efficace. Selon Patchstack, 97 % des vulnérabilités WordPress exploitées en 2025 ciblaient des plugins et thèmes non mis à jour. Appliquez notre checklist sécurité WordPress 2026 pour ne rien oublier.
2. Limitez les inscriptions ouvertes
Cette vulnérabilité exploitable dès le niveau « Abonné » rappelle un principe fondamental : chaque compte utilisateur est une surface d’attaque potentielle. Si votre site n’a pas besoin d’inscriptions publiques, désactivez-les dans Réglages → Général → Toute personne peut s’inscrire.
3. Utilisez un WAF (Web Application Firewall)
Un WAF comme Cloudflare ou Wordfence peut détecter et bloquer les tentatives d’injection SQL en temps réel, même sur des plugins non patchés. C’est une couche de défense complémentaire indispensable — notre guide sur Cloudflare WAF et WordPress explique comment le configurer efficacement.
4. Surveillez les permissions des rôles
Appliquez le principe du moindre privilège : n’accordez aux utilisateurs que les droits strictement nécessaires. Un simple abonné ne devrait jamais pouvoir affecter la base de données. Auditez régulièrement vos rôles WordPress et supprimez les comptes inutilisés.
5. Activez l’authentification à deux facteurs
Même si un attaquant possède un compte abonné, l’authentification 2FA ralentit considérablement toute tentative d’exploitation. Retrouvez notre guide complet sur l’authentification 2FA WordPress pour mettre en place cette protection rapidement.
FAQ — CVE-2025-67987 et sécurité QSM WordPress
Mon site utilise QSM mais les inscriptions sont fermées. Suis-je protégé ?
Partiellement. Si aucun utilisateur externe ne peut créer de compte, le risque d’exploitation est réduit. Mais si vous avez des auteurs, des éditeurs ou des membres, ils pourraient potentiellement exploiter la faille. La mise à jour vers 10.3.2 reste indispensable.
Comment savoir si mon site a déjà été compromis via cette faille ?
Vérifiez les journaux d’accès serveur pour des patterns d’injection SQL, inspectez la table wp_users pour des comptes administrateurs inconnus, et analysez la table wp_options pour des modifications suspectes. Un scanner de malware comme Wordfence peut également détecter des backdoors installées post-exploitation.
Faut-il désinstaller QSM si on ne peut pas mettre à jour immédiatement ?
Si une mise à jour immédiate est impossible, la désactivation temporaire du plugin est préférable à son maintien en version vulnérable, surtout si votre site accepte des inscriptions publiques. Alternativement, un WAF configuré pour filtrer les injections SQL sur les endpoints REST peut temporairement mitiger le risque.
Cette faille est-elle exploitable sans compte utilisateur (non authentifié) ?
Non. CVE-2025-67987 est une vulnérabilité authentifiée : l’attaquant doit disposer d’au moins un compte abonné pour déclencher la requête vulnérable. Cela réduit le risque sur les sites sans inscription ouverte, mais ne dispense pas de la mise à jour.
Conclusion : Patcher, Surveiller, Protéger
CVE-2025-67987 est un rappel brutal que les plugins les plus populaires ne sont pas exempts de failles critiques — et qu’une simple absence de validation sur un paramètre d’entrée peut mettre en danger 40 000 sites en un instant. La bonne nouvelle : le correctif existe, il est gratuit, et son application prend moins d’une minute.
Action immédiate : Mettez à jour Quiz and Survey Master vers la version 10.3.2 ou supérieure. Ensuite, profitez-en pour auditer l’ensemble de vos plugins et appliquer les pratiques de sécurité décrites dans nos guides. La sécurité WordPress est un processus continu, pas un état ponctuel.
💡 Besoin d’aide pour sécuriser votre site WordPress ? Contactez notre équipe d’experts pour un audit personnalisé ou une remédiation post-compromission.
✍️ À propos de l’auteur
Benjamin Bueno — Expert en cybersécurité WordPress et forensics web. Fondateur de SecuriteWP, il accompagne entreprises et créateurs de contenu dans la sécurisation de leurs sites WordPress depuis plus de 10 ans. Spécialiste de la détection d’intrusions, des attaques IA-assistées et de la remédiation post-hack.
En savoir plus →