CVE-2026-25308

Simple Membership <= 4.6.9 - Missing Authorization

mediumMissing Authorization
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
4.7.0
Patched in
106d
Time to patch

Description

The Simple Membership plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in all versions up to, and including, 4.6.9. This makes it possible for authenticated attackers, with Subscriber-level access and above, to perform an unauthorized action.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
None
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=4.6.9
PublishedJanuary 19, 2026
Last updatedMay 4, 2026
Affected pluginsimple-membership

What Changed in the Fix

Changes introduced in v4.7.0

Loading patch diff...

Source Code

WordPress.org SVN
Research Plan
Unverified

# Research Plan: CVE-2026-25308 Missing Authorization in Simple Membership ## 1. Vulnerability Summary The **Simple Membership** plugin for WordPress (up to and including version 4.6.9) contains a missing authorization vulnerability. This flaw allows authenticated users with **Subscriber-level** pr…

Show full research plan

Research Plan: CVE-2026-25308 Missing Authorization in Simple Membership

1. Vulnerability Summary

The Simple Membership plugin for WordPress (up to and including version 4.6.9) contains a missing authorization vulnerability. This flaw allows authenticated users with Subscriber-level privileges to perform actions intended for administrators. Specifically, the plugin fails to perform a current_user_can('manage_options') check on several AJAX handlers and self-action processing routines, relying solely on nonce verification. Because certain nonces are exposed to all authenticated users or the checks are missing entirely, Subscribers can modify membership levels or manipulate member data.

2. Attack Vector Analysis

  • Vulnerable Endpoints:
    1. wp-admin/admin-ajax.php via various swpm_ prefixed actions.
    2. Frontend pages containing the [swpm_profile_form] shortcode (which triggers member data updates).
  • Vulnerable Action: swpm_save_membership_level or the profile update handler in SwpmFrontRegistration (and its parent SwpmRegistration).
  • Payload Parameters:
    • action: swpm_admin_save_membership_level (AJAX) OR the form submission via swpm_edit_profile_submit.
    • membership_level: The target ID to elevate the account to.
    • account_status: active.
  • Authentication: Required (Subscriber
Research Findings
Static analysis — not yet PoC-verified

Summary

The Simple Membership plugin for WordPress is vulnerable to unauthorized privilege escalation via the frontend profile update form. Due to a missing field whitelist and insufficient authorization checks, authenticated users with Subscriber-level access can modify sensitive account fields, such as their membership level and account status, by injecting extra parameters into the profile update request.

Vulnerable Code

/* classes/class.swpm-front-registration.php (approx line 459 in v4.6.9) */

			// ... [The code populates $member_info from $_POST data earlier] ...

			//Update the data in the swpm database.
			$swpm_id = $auth->get( 'member_id' );
			//SwpmLog::log_simple_debug("Updating member profile data with SWPM ID: " . $swpm_id, true);
			$swpm_user_data = array_filter( $member_info );
			$wp_user_info = array();

/* The vulnerability is the lack of filtering on $member_info before it is used to update the database record. */

Security Fix

diff -ru /home/deploy/wp-safety.org/data/plugin-versions/simple-membership/4.6.9/classes/class.simple-wp-membership.php /home/deploy/wp-safety.org/data/plugin-versions/simple-membership/4.7.0/classes/class.simple-wp-membership.php
--- /home/deploy/wp-safety.org/data/plugin-versions/simple-membership/4.6.9/classes/class.simple-wp-membership.php	2025-08-31 06:58:32.000000000 +0000
+++ /home/deploy/wp-safety.org/data/plugin-versions/simple-membership/4.7.0/classes/class.simple-wp-membership.php	2026-01-21 09:27:20.000000000 +0000
@@ -903,7 +903,7 @@
 	wp_register_style("swpm.stripe.style", "https://checkout.stripe.com/v3/checkout/button.css", array(), SIMPLE_WP_MEMBERSHIP_VER);
     }
 
-    public static function enqueue_validation_scripts_v2($handle, $params = null){
+    public static function enqueue_validation_scripts_v2($handle, $params = array()){
 
         if ( ! wp_script_is( $handle, 'registered' ) ) {
             wp_register_script($handle, SIMPLE_WP_MEMBERSHIP_URL . "/js/".$handle.".js", null, SIMPLE_WP_MEMBERSHIP_VER, true);
@@ -947,14 +947,19 @@
             ),
             "pp" => array(
                 "required" => __("You must accept the privacy policy", "simple-membership")
-            )
+            ),
+
+	        // Membership Level related:
+            "membershipLevelAlias" => array(
+	            "required" => __("Membership level name is required", "simple-membership")
+            ),
         );
 
         $ajax_url =  admin_url('admin-ajax.php');
 
         wp_add_inline_script($handle, "var swpmFormValidationAjax = ".wp_json_encode(array(
             'ajax_url' => $ajax_url,
-            'query_args' => $params['query_args'],
+            'query_args' => isset($params['query_args']) ? $params['query_args'] : array(),
         )), "before");
        
         wp_add_inline_script($handle, "var form_id = '".$params['form_id']."';", "before");
@@ -982,7 +987,7 @@
             wp_add_inline_script($handle, "var strong_password_enabled = ".$params['is_strong_password_enabled'].";", "before");
         }
 
-        wp_localize_script($handle, "validationMsg",$validation_messages);
+        wp_localize_script($handle, "validationMsg", $validation_messages);
 
         wp_enqueue_script($handle);
     }  
diff -ru /home/deploy/wp-safety.org/data/plugin-versions/simple-membership/4.6.9/classes/class.swpm-front-registration.php /home/deploy/wp-safety.org/data/plugin-versions/simple-membership/4.7.0/classes/class.swpm-front-registration.php
--- /home/deploy/wp-safety.org/data/plugin-versions/simple-membership/4.6.9/classes/class.swpm-front-registration.php	2025-06-29 03:16:48.000000000 +0000
+++ /home/deploy/wp-safety.org/data/plugin-versions/simple-membership/4.7.0/classes/class.swpm-front-registration.php	2026-01-21 09:27:20.000000000 +0000
@@ -459,6 +459,24 @@
 				$password_also_changed = true;
 			}
 
+			// Only these fields are whitelisted for front end profile update.
+			$accepted_fields = array(
+    			'email',
+				'password',
+    			'first_name',
+    			'last_name',
+    			'phone',
+    			'address_street',
+    			'address_city',
+    			'address_state',
+    			'address_zipcode',
+    			'country',
+    			'company_name',
+			);
+
+			// Remove unwanted fields:
+			$member_info = array_intersect_key($member_info, array_flip($accepted_fields));
+
 			//Update the data in the swpm database.
 			$swpm_id = $auth->get( 'member_id' );
 			//SwpmLog::log_simple_debug("Updating member profile data with SWPM ID: " . $swpm_id, true);

Exploit Outline

1. Login to the WordPress site as a low-privileged user (e.g., Subscriber). 2. Navigate to the frontend profile edit page, which is typically rendered via the [swpm_profile_form] shortcode. 3. Prepare a POST request to update the profile (triggered by the 'swpm_edit_profile_submit' action). 4. In the POST payload, include standard fields (like first_name) but also append unauthorized administrative parameters, such as 'membership_level' set to the ID of a premium level and 'account_status' set to 'active'. 5. Submit the request. Because the vulnerable version (<= 4.6.9) lacks a whitelist for profile fields and doesn't check capabilities for specific field updates, the plugin will process the 'membership_level' change, effectively elevating the attacker's privileges.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.