Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
PR:L confirmed by Contributor-level requirement; AC:L reflects straightforward POST bypass once authenticated, despite Pro plugin dependency.
Primary rating from Vendor (Wordfence).
CVSS VectorVendor: Wordfence
Lifecycle Timeline
2DescriptionCVE.org
The Subscriptions for WooCommerce plugin for WordPress is vulnerable to Privilege Escalation in versions up to, and including, 2.0.0. This is due to the save_meta_boxes() function persisting the _wps_plan_user_role membership plan meta from $_POST without an allowlist that excludes privileged roles - the only validations applied, sanitize_key() and wp_roles()->is_role(), both accept 'administrator' as a valid value, and the UI's disabled attribute on the role dropdown is a client-side-only control trivially bypassed via DevTools or a direct POST request; additionally, because the wps_membership_plan custom post type is registered with capability_type => 'post', any user who can edit posts satisfies the current_user_can('edit_post', $post_id) guard in save_meta_boxes(). This makes it possible for authenticated attackers, with Contributor-level access and above, to escalate their privileges to Administrator by storing 'administrator' as the role granted on membership acquisition, which the Pro companion plugin then applies via add_role() during membership lifecycle events. Successful exploitation requires the Subscriptions for WooCommerce Pro companion plugin to be active, as it is the component that reads the stored _wps_plan_user_role meta via get_post_meta() and calls add_role() to apply the role during membership lifecycle events.
Articles & Coverage 1
AnalysisAI
Privilege escalation in the Subscriptions for WooCommerce WordPress plugin (versions up to and including 2.0.0) allows authenticated Contributors to elevate their accounts to Administrator by poisoning a membership plan's stored role meta. The save_meta_boxes() function accepts the _wps_plan_user_role POST parameter with no server-side allowlist blocking privileged roles; the only guards applied - sanitize_key() and wp_roles()->is_role() - both pass 'administrator' as valid. Full exploitation requires the companion Pro plugin to be active, as it is the component that reads the stored meta and calls add_role() during membership lifecycle events. No public exploit has been identified at time of analysis, though Wordfence has published full technical detail and the vulnerable source lines are publicly browsable.
Technical ContextAI
The affected component is the wps_membership_plan custom post type (CPT) handler in class-wps-membership-plan-cpt.php. Because the CPT is registered with capability_type => 'post', WordPress maps its edit capability to the standard edit_post check - meaning any user with Contributor access (who can edit their own posts) satisfies the current_user_can('edit_post', $post_id) guard at line ~L477. The UI renders the role selection dropdown with the HTML disabled attribute (meta-box-plan-details.php ~L102), which is a client-side-only control; it is trivially removed via browser DevTools or bypassed by crafting a direct HTTP POST. save_meta_boxes() at ~L483 then writes the attacker-supplied role string directly to _wps_plan_user_role post meta. The Pro companion plugin subsequently reads this meta via get_post_meta() and calls WordPress's native add_role() function during membership lifecycle events (activation, renewal, etc.), applying the stored role - including 'administrator' - to the member's user account. Root cause class is CWE-269: Improper Privilege Management, specifically a missing server-side blocklist for privileged role values. Affected CPE: cpe:2.3:a:wpswings:subscriptions_for_woocommerce:*:*:*:*:*:*:*:* through version 2.0.0.
RemediationAI
A fix has been committed to the plugin repository (WordPress.org SVN changeset 3624543, referenced at https://plugins.trac.wordpress.org/changeset?reponame=&old=3624543%40subscriptions-for-woocommerce&new=3624543%40subscriptions-for-woocommerce); however, the exact released version number of the patched build is not confirmed in the available input data - administrators should update to the latest available version beyond 2.0.0 via the WordPress plugin dashboard and verify the installed version exceeds 2.0.0. If an immediate update is not possible, the primary compensating control is to remove Contributor-level (and above, below Administrator) untrusted user accounts, since exploitation requires at minimum Contributor access to edit posts. As a secondary control, deactivating the Subscriptions for WooCommerce Pro companion plugin blocks the add_role() call that applies the escalated role, preventing the full impact - though this disables Pro subscription functionality as a side effect. There is no safe way to block the vulnerability at the WAF layer without risking false positives on legitimate plan edits; a server-side role allowlist fix in save_meta_boxes() is the only correct remediation.
Remote code execution in Subscriptions for WooCommerce WordPress plugin (before 2.0.1) is reachable by any authenticated
Payment integrity bypass in the Subscriptions for WooCommerce plugin (versions before 2.0.1) enables financial fraud by
Insecure Direct Object Reference (IDOR) in the Subscriptions for WooCommerce WordPress plugin before 2.0.1 allows any au
An authentication bypass vulnerability exists in WP Swings Subscriptions for WooCommerce plugin versions up to and inclu
Arbitrary plugin installation in the WP Swings Subscriptions for WooCommerce plugin (versions up to and including 2.0.0)
The Subscriptions for WooCommerce plugin contains a critical authentication bypass vulnerability in the subscription can
The Subscriptions for WooCommerce WordPress plugin before 2.0.3 does not verify the security token on the request that c
The Subscriptions for WooCommerce WordPress plugin before 2.0.3 does not correctly validate the shared secret protecting
Same weakness CWE-269 – Improper Privilege Management
View allSame technique Privilege Escalation
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-51687
GHSA-x6w6-m8vc-m6cp