CVE-2025-13416
Executive Summary
CVE-2025-13416 is a Missing Authorization vulnerability in the ProfileGrid – User Profiles, Groups and Communities WordPress plugin (versions up to and including 5.9.7.2). The flaw resides in the pm_deactivate_user_from_group() function, which is invoked via the pm_deactivate_user_from_group AJAX action. Due to a missing capability check, any authenticated attacker with Subscriber-level access or above can suspend arbitrary users from groups, including administrators. This allows a low-privileged attacker to disrupt group management and potentially cause denial-of-service conditions for privileged users.
The vulnerability is classified as CWE-862: Missing Authorization and carries a CVSS v3.1 base score of 4.3 (Medium). No public exploit code or proof-of-concept has been released, and the vendor has not yet provided a patch. The EPSS score is 0.0%, indicating a low probability of exploitation in the wild at this time.
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 via the official WordPress plugin repository. Users are advised to monitor the plugin’s update channel and apply any security patches as soon as they become available. Since the plugin is part of the WordPress ecosystem, the risk extends to any site using the vulnerable version.
CVSS Breakdown & Threat Level
| Metric | Value |
|---|---|
| Attack Vector (AV) | Network |
| Attack Complexity (AC) | Low |
| Privileges Required (PR) | Low |
| User Interaction (UI) | None |
| Scope (S) | Unchanged |
| Confidentiality (C) | None |
| Integrity (I) | Low |
| Availability (A) | None |
| Base Score | 4.3 (Medium) |
Threat Level: Medium. The vulnerability requires authentication but allows a low-privileged user to suspend administrators from groups, potentially disrupting group operations.
Deep Dive & Mechanics
The vulnerability exists in the pm_deactivate_user_from_group() function, which is registered as an AJAX handler for the pm_deactivate_user_from_group action. The function is intended to allow group managers or administrators to remove (suspend) a user from a group. However, the code does not perform a proper capability check (e.g., current_user_can('manage_options') or a group-specific permission check). As a result, any authenticated user, including those with only Subscriber privileges, can call this AJAX action and provide a user ID and group ID to suspend any user from any group.
The attack flow:
- Attacker authenticates as a Subscriber.
- Attacker sends a POST request to
/wp-admin/admin-ajax.phpwithaction=pm_deactivate_user_from_group,user_id=<target_user_id>, andgroup_id=<target_group_id>. - The plugin processes the request without verifying the attacker’s permissions.
- The target user is suspended from the specified group.
This can be used to remove administrators from groups, causing disruption to group management and potentially locking out legitimate group managers.
Vulnerable vs. Patched Code
Vulnerable Code (<= 5.9.7.2):
function pm_deactivate_user_from_group() {
$user_id = intval($_POST['user_id']);
$group_id = intval($_POST['group_id']);
// Missing capability check
// ... code to remove user from group ...
wp_die();
}
add_action('wp_ajax_pm_deactivate_user_from_group', 'pm_deactivate_user_from_group');
Patched Code (Hypothetical):
function pm_deactivate_user_from_group() {
// Add capability check
if (!current_user_can('manage_options') && !pm_is_group_admin($group_id)) {
wp_die('Unauthorized', 403);
}
$user_id = intval($_POST['user_id']);
$group_id = intval($_POST['group_id']);
// ... code to remove user from group ...
wp_die();
}
add_action('wp_ajax_pm_deactivate_user_from_group', 'pm_deactivate_user_from_group');
The patch adds a capability check to ensure only users with manage_options (administrators) or group admin privileges can suspend users.
Exploitation & Lab Setup
Red Team (Proof of Concept)
Prerequisites:
- A WordPress site with ProfileGrid plugin version <= 5.9.7.2.
- Valid credentials for a Subscriber-level account.
Exploit Steps:
- Obtain a nonce for the AJAX action (if required). In many cases, the nonce is not checked, but if it is, you can extract it from the page source.
- Send a crafted POST request using
curl:
curl -X POST \
-d "action=pm_deactivate_user_from_group&user_id=1&group_id=2" \
-c cookies.txt \
-b cookies.txt \
http://target-site.com/wp-admin/admin-ajax.php
Replace user_id=1 with the ID of the target user (e.g., an administrator) and group_id=2 with the ID of the group from which to suspend them.
Expected Result: The target user is removed from the group, and the attacker (Subscriber) gains the ability to disrupt group membership.
Blue Team (Detection & Hardening)
Detection:
- Monitor AJAX requests to
admin-ajax.phpwithaction=pm_deactivate_user_from_groupfrom non-admin users. - Alert on any suspension of high-privilege users (e.g., administrators) from groups.
Hardening:
- Apply the vendor patch as soon as it becomes available.
- As a temporary workaround, add a capability check via a custom plugin or code snippet:
add_action('wp_ajax_pm_deactivate_user_from_group', function() {
if (!current_user_can('manage_options')) {
wp_die('Unauthorized', 403);
}
}, 1);
- Restrict AJAX endpoints to specific user roles using a Web Application Firewall (WAF) rule.
Indicators of Compromise (IOCs)
- Log Entries: AJAX requests to
/wp-admin/admin-ajax.phpwithaction=pm_deactivate_user_from_groupfrom IPs not associated with group managers. - User Suspension Events: Unexpected removal of users from groups, especially administrators.
- HTTP Requests:
- POST to
/wp-admin/admin-ajax.php - Body contains
action=pm_deactivate_user_from_group - Parameters:
user_id,group_id
- POST to
Detection Engineering
YARA Rule
rule CVE_2025_13416_ProfileGrid_Missing_Auth {
meta:
description = "Detects exploitation attempts of CVE-2025-13416 in ProfileGrid plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-13416"
strings:
$ajax_action = "pm_deactivate_user_from_group"
$user_id = "user_id"
$group_id = "group_id"
condition:
all of them
}
Sigma Rule
title: ProfileGrid CVE-2025-13416 Exploitation Attempt
id: 8a9b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
status: experimental
description: Detects AJAX requests to pm_deactivate_user_from_group from non-admin users
author: Valters IT
date: 2025/04/10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-method: POST
cs-uri-query|contains: "action=pm_deactivate_user_from_group"
condition: selection
falsepositives:
- Legitimate group manager actions (if capability check is missing)
level: medium
Suricata Rule
alert http any any -> any any (
msg:"CVE-2025-13416 ProfileGrid Missing Authorization Attempt";
flow:to_server,established;
content:"POST";
http_method;
content:"/wp-admin/admin-ajax.php";
http_uri;
content:"action=pm_deactivate_user_from_group";
http_client_body;
classtype:attempted-user;
sid:1000001;
rev:1;
)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin if group suspension functionality is not critical.
- Apply a temporary code fix as described in the Blue Team section to add a capability check.
- Monitor logs for suspicious AJAX requests targeting this endpoint.
Long-Term Fix:
- Update to a patched version of ProfileGrid once released by the vendor.
- Implement role-based access controls for all AJAX actions in custom plugins.
Valters IT Signature:
Report generated by Valters IT DevSecOps AI Assistant | CVE-2025-13416 Analysis
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.