CVE-2025-13534
Executive Summary
CVE-2025-13534 is a privilege escalation vulnerability in the ELEX WordPress HelpDesk & Customer Ticketing System plugin (WSDesk), affecting all versions up to and including 3.3.2. The flaw resides in the eh_crm_edit_agent AJAX action, which lacks proper authorization checks. This allows an authenticated attacker with at least Contributor-level access to escalate their privileges from limited "Reply Tickets" permissions to full helpdesk administrator capabilities. Successful exploitation grants unauthorized access to ticket management, settings configuration, agent administration, and sensitive customer data. As a WordPress plugin vulnerability, this issue is specific to the WordPress ecosystem and does not involve the underlying web server software.
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 affects a WordPress plugin distributed through the official WordPress plugin repository and third-party marketplaces. The plugin is not an NPM, PyPI, Go, or Ruby package, but its supply chain risk is significant due to the lack of a known patch. Administrators must manually monitor for updates or consider removing the plugin until a fix is released.
CVSS Breakdown & Threat Level
- CVSS Score: 6.3 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:H/A:L
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: Low (Contributor-level access)
- User Interaction: None
- Scope: Unchanged
- Confidentiality Impact: Low (sensitive customer data exposure)
- Integrity Impact: High (full helpdesk admin privileges)
- Availability Impact: Low (potential disruption of ticket management)
The threat level is elevated due to the low complexity and low privileges required, combined with the high integrity impact. The EPSS score of 0.0% suggests low exploitation likelihood currently, but this may change as details become public.
Deep Dive & Mechanics
The vulnerability is a Missing Authorization (CWE-862) in the eh_crm_edit_agent AJAX action. The plugin uses AJAX handlers for administrative functions but fails to verify that the requesting user has the necessary capabilities (e.g., manage_options or edit_users). The eh_crm_edit_agent action is intended for helpdesk administrators to manage agent permissions, but it is accessible to any authenticated user with Contributor-level access or higher.
The core issue is in the function that registers the AJAX action. It likely uses wp_ajax_ hooks without a capability check, or the check is insufficient. An attacker can craft a POST request to /wp-admin/admin-ajax.php with action=eh_crm_edit_agent and parameters to modify their own role or permissions, escalating from a limited "Reply Tickets" role to a full helpdesk administrator.
Vulnerable vs. Patched Code
Since no patch is available, the vulnerable code is presumed to be in the plugin's main AJAX handler file (e.g., includes/class-ajax.php or similar). The vulnerable code likely resembles:
add_action('wp_ajax_eh_crm_edit_agent', 'eh_crm_edit_agent_callback');
function eh_crm_edit_agent_callback() {
// Missing capability check
$user_id = intval($_POST['user_id']);
$role = sanitize_text_field($_POST['role']);
// Update user role without verifying admin privileges
$user = new WP_User($user_id);
$user->set_role($role);
wp_die();
}
A patched version would include a capability check:
add_action('wp_ajax_eh_crm_edit_agent', 'eh_crm_edit_agent_callback');
function eh_crm_edit_agent_callback() {
if (!current_user_can('manage_options')) {
wp_die('Unauthorized', 403);
}
// ... rest of the function
}
Exploitation & Lab Setup
Red Team
Prerequisites:
- A WordPress site with the ELEX WSDesk plugin version <= 3.3.2.
- An authenticated user account with Contributor-level access (or higher).
Exploitation Steps:
- Log in as the Contributor-level user.
- Obtain a valid WordPress nonce for the AJAX action (if required). This can be extracted from the plugin's JavaScript or by inspecting network requests.
- Send a crafted POST request to
/wp-admin/admin-ajax.php:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target-wordpress-site.com
Content-Type: application/x-www-form-urlencoded
Cookie: [valid WordPress cookies]
action=eh_crm_edit_agent&user_id=[current_user_id]&role=administrator&_ajax_nonce=[nonce]
- The server responds with a success message, and the user's role is escalated to helpdesk administrator (or full WordPress administrator, depending on the plugin's implementation).
- Access the WSDesk admin panel to view all tickets, manage agents, and access sensitive customer data.
Note: No public exploit code is available, but the above steps demonstrate the attack vector.
Blue Team
Detection:
- Monitor AJAX requests to
admin-ajax.phpwithaction=eh_crm_edit_agentfrom non-admin users. - Alert on role changes for users with Contributor-level access or higher.
- Review logs for unusual privilege escalation patterns.
Hunting:
- Search for users who have been assigned the
wsdesk_adminor similar custom role without proper authorization. - Check for sudden changes in user capabilities or role assignments.
Lab Setup:
- Install WordPress and the ELEX WSDesk plugin version 3.3.2.
- Create a test user with Contributor role.
- Use a tool like Burp Suite or cURL to replay the exploit steps.
- Monitor logs and alerts to validate detection rules.
Indicators of Compromise (IOCs)
- Network:
- POST requests to
/wp-admin/admin-ajax.phpwithaction=eh_crm_edit_agent. - Unusual user agent strings or IP addresses making AJAX calls to admin endpoints.
- POST requests to
- Host:
- User role changes in the WordPress database (
wp_usermetatable) for non-admin users. - Presence of new users with
wsdesk_adminoradministratorroles created by low-privilege accounts. - Modified plugin files (if attacker uploads a backdoor).
- User role changes in the WordPress database (
- Logs:
- WordPress debug log entries showing AJAX errors or unauthorized access attempts.
- Web server access logs with repeated
admin-ajax.phprequests from the same user.
Detection Engineering
YARA Rule
rule CVE_2025_13534_WSDesk_PrivEsc {
meta:
description = "Detects exploitation attempts of CVE-2025-13534 in ELEX WSDesk plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-13534"
strings:
$ajax_action = "eh_crm_edit_agent"
$admin_ajax = "admin-ajax.php"
$role_param = "role=administrator"
$user_id_param = "user_id="
condition:
all of them
}
Sigma Rule
title: CVE-2025-13534 - ELEX WSDesk Privilege Escalation via AJAX
id: 8a4b3c2d-1e5f-6a7b-8c9d-0e1f2a3b4c5d
status: experimental
description: Detects AJAX requests to eh_crm_edit_agent action indicating privilege escalation attempt
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-ajax.php'
cs-uri-query|contains: 'action=eh_crm_edit_agent'
condition: selection
falsepositives:
- Legitimate admin actions (rare)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2025-13534 - ELEX WSDesk Privilege Escalation Attempt";
flow:to_server,established;
content:"POST"; http_method;
content:"/wp-admin/admin-ajax.php"; http_uri;
content:"action=eh_crm_edit_agent"; http_client_body;
classtype:attempted-admin;
sid:10000001;
rev:1;
reference:cve,2025-13534;
)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin if not critical to operations, until a patch is released.
- Restrict access to the
admin-ajax.phpendpoint for low-privilege users using a Web Application Firewall (WAF) or server-level rules. - Monitor user role changes and audit logs for suspicious activity.
Long-term Fix:
- Apply the official patch from the vendor when released.
- Implement a custom capability check in the plugin's AJAX handler (if you have development resources):
add_action('wp_ajax_eh_crm_edit_agent', 'patched_eh_crm_edit_agent'); function patched_eh_crm_edit_agent() { if (!current_user_can('manage_options')) { wp_die('Unauthorized', 403); } // Original function code } - Consider replacing the plugin with an alternative that has a better security track record.
Workarounds:
- Use a WordPress security plugin (e.g., Wordfence) to block AJAX requests to sensitive actions from non-admin users.
- Implement a custom .htaccess rule to restrict access to
admin-ajax.phpbased on user roles (advanced).
Valters IT
Securing Digital Frontiers
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.