CVE-2026-60137 : injection SQL facilitée dans le paramètre author__not_in de wp_query sous WordPress core
SCORE DE MENACE HERMES & COMPROMISSION DU CMS D'ENTREPRISE
Cible :WordPress Core CMS Le CVSS v3.1 classe la CVE-2026-60137 avec un score de 5.9 Moyen (CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N) en raison du prérequis d'un appelant ou plugin tiers transmettant des entrées non validées. Le score de menace Hermes évalue la vulnérabilité à 88 (ELEVE), reflétant son inscription au catalogue CISA KEV des vulnérabilités exploitées et son rôle de maillon critique chaîné avec la confusion de route REST (CVE-2026-63030) aboutissant à une exécution de code à distance non authentifiée.
CVE-2026-60137: WordPress Core Facilitated SQL Injection via WP_Query author__not_inVULNÉRABILITÉ
Software platform affected by security vulnerabilities and agentic attack patterns.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Confirmed security vulnerability in Microsoft Office & 365 Apps documented in Hermes dossier.”
- [vulnerability_report]
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
1. Contexte technique & matrice des versions affectées
Section intitulée « 1. Contexte technique & matrice des versions affectées »WordPress motorise plus de 40% des sites web mondiaux. La classe WP_Query constitue l’interface universelle d’extraction des contenus et articles depuis la base de données relationnelle MySQL/MariaDB.
| Paramètre | Spécification Technique | Contexte Threat Intelligence |
|---|---|---|
| Identifiant CVE | CVE-2026-60137 | Enregistrement officiel NVD & CISA KEV |
| Faiblesse CWE | CWE-89 (SQL Injection) | Défaut de transtypage et d’assainissement de tableau dans le générateur SQL |
| Vecteur réseau | HTTP/HTTPS (80/TCP, 443/TCP) | Requêtes ciblées vers les points de recherche et l’API REST |
| Composant vulnérable | wp-includes/class-wp-query.php | Méthode WP_Query::get_posts() |
| Versions affectées | 6.8.0 à 6.8.5, 6.9.0 à 6.9.4, 7.0.0 à 7.0.1 | Toutes les branches WordPress non patchées |
| Versions corrigées | 6.8.6, 6.9.5, 7.0.2 | Correctifs officiels de sécurité (juillet 2026) |
2. Analyse approfondie du mécanisme de vulnérabilité
Section intitulée « 2. Analyse approfondie du mécanisme de vulnérabilité »Défaillance de transtypage dans WP_Query
Section intitulée « Défaillance de transtypage dans WP_Query »Dans le fichier wp-includes/class-wp-query.php, la génération de la clause SQL relative aux auteurs exclut les identifiants de la manière suivante :
// Logique vulnérable dans WP_Query::get_posts()if ( ! empty( $q['author__not_in'] ) ) { $author__not_in = (array) $q['author__not_in']; $clean_authors = array(); foreach ( $author__not_in as $author_id ) { if ( is_numeric( $author_id ) ) { $clean_authors[] = absint( $author_id ); } else { // Dans certaines structures d'entrées imbriquées, l'échappement addslashes // ne neutralise pas les contextes numériques dépourvus de guillemets $clean_authors[] = $wpdb->_escape( $author_id ); } } $whichauthor .= " AND {$wpdb->posts}.post_author NOT IN (" . implode( ',', $clean_authors ) . ')';}La fonction _escape() (équivalente à addslashes) ne protège que contre les injections brisant les chaînes délimitées par des guillemets. Dans une clause NOT IN (1, 2, ...), l’absence de guillemets permet à un attaquant d’injecter des expressions arithmétiques, des sous-requêtes ou des clauses UNION SELECT sans générer d’erreur de syntaxe.
3. Vecteurs d’attaque & chaîne d’exploitation
Section intitulée « 3. Vecteurs d’attaque & chaîne d’exploitation »L’exploitation autonome de la CVE-2026-60137 requiert un point d’entrée passant $_GET à WP_Query. Les attaquants ont industrialisé son exploitation en la combinant avec la faille de confusion de route :
- Chaînage avec la CVE-2026-63030 : via le point d’entrée REST
/wp-json/batch/v1, les attaquants contournent les filtres frontaux et forcent l’exécution de requêtes internes non assainies. - Exfiltration aveugle temporelle : injection de charges
SLEEP()pour reconstruire bit par bit les jetons de réinitialisation de mot de passe administrateur. - Élévation de privilèges : connexion à l’interface
/wp-admin/puis téléversement d’une extension malveillante contenant un web shell PHP.
4. Règles de détection & détection forensique
Section intitulée « 4. Règles de détection & détection forensique »Règle réseau Suricata
Section intitulée « Règle réseau Suricata »alert http any any -> $HTTP_SERVERS any ( msg:"HERMES EXPLOIT - Injection SQL WordPress WP_Query author__not_in (CVE-2026-60137)"; flow:to_server,established; http.uri; content:"author__not_in"; nocase; pcre:"/author__not_in(\[|\%5b)[^\]]*(\]|\%5d)=(\s*select|\s*union|\s*sleep|\s*0x)/Ui"; classtype:web-application-attack; sid:202660137; rev:1;)Requête de triage SIEM Splunk
Section intitulée « Requête de triage SIEM Splunk »index=web_proxy sourcetype=access_combined(uri_path="*wp-json*" OR uri_path="*/index.php*")(uri_query="*author__not_in*" OR form_data="*author__not_in*")| eval suspect=if(match(uri_query, "(?i)(union|select|sleep|benchmark|information_schema)"), 1, 0)| where suspect=1| stats count earliest(_time) as premiere_vue latest(_time) as derniere_vue by src_ip, dest_ip, uri_path, uri_query5. Guide de remédiation & durcissement
Section intitulée « 5. Guide de remédiation & durcissement »-
Appliquer la mise à jour de maintenance WordPress : Mettre à niveau le cœur de WordPress vers la version 6.8.6, 6.9.5 ou 7.0.2 à l’aide de WP-CLI :
Fenêtre de terminal wp core update --version=7.0.2 -
Validation stricte dans les développements sur-mesure : S’assurer que les thèmes et plugins personnalisés effectuent un transtypage strict :
$safe_authors = array_map( 'absint', (array) $request->get_param( 'author__not_in' ) );$query = new WP_Query( [ 'author__not_in' => $safe_authors ] ); -
Renforcement WAF : Bloquer au niveau du pare-feu applicatif toute requête non authentifiée comportant des valeurs non purement numériques dans
author__not_in.