Subscribe To Comments Reloaded <= 240119 - Improper Authorization to Unauthenticated Arbitrary Subscription Management
Description
The Subscribe To Comments Reloaded plugin for WordPress is vulnerable to unauthorized modification of data due to a leaked secret key and usage of a weak hash generation algorithm in all versions up to, and including, 240119. This makes it possible for unauthenticated attackers to extract the global key from any public post page, forge authorization keys and manage comment subscription preferences for arbitrary users
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:NTechnical Details
<=240119This analysis is based on the vulnerability description for **CVE-2026-4409** affecting the **Subscribe To Comments Reloaded** plugin (<= 240119). Since source files were not provided, identifiers are grounded in the plugin's known architecture and the specific vulnerability details provided. --- …
Show full research plan
This analysis is based on the vulnerability description for CVE-2026-4409 affecting the Subscribe To Comments Reloaded plugin (<= 240119). Since source files were not provided, identifiers are grounded in the plugin's known architecture and the specific vulnerability details provided.
1. Vulnerability Summary
The "Subscribe To Comments Reloaded" plugin fails to adequately protect its global security key, which is used to generate authorization tokens for subscription management. The plugin leaks this global key into the HTML source of any public post page via a localized JavaScript variable. Furthermore, the algorithm used to generate management tokens is a weak hash (likely MD5 or SHA1) combining the user's email and this leaked key.
An unauthenticated attacker can retrieve the global key, pre-calculate the authorization token for any known email address, and access that user's subscription management dashboard to modify or delete their subscriptions.
2. Attack Vector Analysis
- Endpoint: The Virtual Management Page, typically accessed via the home URL with specific query parameters (e.g.,
/?stcr=...). - Leakage Point: Public post pages where the plugin enqueues its frontend scripts.
- Vulnerable Parameters:
- The localized JS variable (e.g.,
stcr_data.keyorstcr.secret). - The management URL parameters (e.g.,
stcr_emailandstcr_key).
- The localized JS variable (e.g.,
- Authentication: None (Unauthenticated).
- Preconditions: The attacker must know the email address of the target subscriber (often the administrator's email or a known commenter).
3. Code Flow (Inferred)
- Key Leakage:
- The plugin registers a frontend script using
wp_enqueue_script. - It uses
wp_localize_script()to pass settings to the frontend. - Sink: The global option
stcr_global_key(or similar) is included in the localized data array, making it visible in the HTML source to all visitors.
- The plugin registers a frontend script using
- Authorization Generation:
- When a user clicks "Manage Subscriptions" in an email, they are sent to a URL like:
site.com/?stcr_action=manage&stcr_email=user@example.com&stcr_key=[HASH]. - Logic: The plugin calculates
EXPECTED_HASH = some_hash_function( email + global_key ).
- When a user clicks "Manage Subscriptions" in an email, they are sent to a URL like:
- Verification:
- On
initortemplate_redirect, the plugin checks forstcr_emailandstcr_key. - It compares the provided
stcr_keywith theEXPECTED_HASH. - If they match, it grants full access to the management dashboard for that email.
- On
4. Nonce Acquisition Strategy
This exploit does not rely on standard WordPress nonces. Instead, it relies on the forgery of the plugin's internal authorization key.
- Identify the Leak: Navigate to any post with comments.
- Extract the Key: Use
browser_evalto find the localized object.- Search Pattern: Look for
wp_localize_scriptcalls in the page source. - Target Variable: Likely
stcr_dataorstcr. - Execution:
browser_eval("window.stcr_data?.key")orbrowser_eval("window.stcr?.secret").
- Search Pattern: Look for
- Identify the Hash Algorithm: (Inferred) Based on historical STCR vulnerabilities, the hash is typically
md5( $email . $global_key ).
5. Exploitation Strategy
Step 1: Extract the Secret
- Navigate to a public post:
browser_navigate("http://localhost:8080/?p=1"). - Retrieve the key:
browser_eval("stcr_data.key")(Verify the exact object name in the page source first). Let's call thisLEAKED_KEY.
Step 2: Forge the Authorization Token
- Target Email:
admin@example.com. - Algorithm:
TOKEN = md5("admin@example.com" + LEAKED_KEY).
Step 3: Access Management Dashboard
- Construct the management URL:
http://localhost:8080/?stcr_action=manage&stcr_email=admin@example.com&stcr_key=[TOKEN] - Navigate to this URL. You should now see the "Management Page" for the admin's subscriptions.
Step 4: Unauthorized Data Modification
- Capture the form submission to delete or change subscriptions.
- Send a POST request using
http_request.- URL:
http://localhost:8080/ - Method:
POST - Content-Type:
application/x-www-form-urlencoded - Body:
stcr_action=manage&stcr_email=admin@example.com&stcr_key=[TOKEN]&submit=unsub_all(exact parameters to be verified on the management page).
- URL:
6. Test Data Setup
- Create a Subscriber: Use WP-CLI to ensure at least one subscription exists.
# Note: STCR often uses a custom table like wp_stcr_subscriptions # For testing, we can manually subscribe the admin to post 1 wp comment create --comment_post_ID=1 --comment_author="Admin" --comment_author_email="admin@example.com" --comment_content="Test" - Plugin Configuration: Ensure "Management Page" is enabled in STCR settings (usually enabled by default).
- Identify Page: Ensure at least one post is published:
wp post create --post_status=publish --post_title="Target Post".
7. Expected Results
- Accessing the forged URL returns a
200 OKwith the management interface instead of a "Permission Denied" or redirect. - The interface displays the subscriptions for
admin@example.com. - Submission of the "Unsubscribe" form results in the removal of the subscription from the database.
8. Verification Steps
- Database Check: Use WP-CLI to check the custom STCR table (usually
wp_stcr_subscriptions).wp db query "SELECT * FROM wp_stcr_subscriptions WHERE email = 'admin@example.com';" - Post-Exploit Check: Confirm the query returns zero rows after the "Unsubscribe All" action is performed via the forged management link.
9. Alternative Approaches
- Different Hash Algorithms: If MD5 fails, try
sha1. If the order is reversed, trymd5(LEAKED_KEY + email). - Shortcode Route: If the key doesn't leak on every post, identify if it only leaks when the
[stcr_management]or[stcr_subscribe]shortcode is present.- Create a page:
wp post create --post_type=page --post_content='[stcr_management]'. - Navigate there to extract the key.
- Create a page:
- Request Param Variation: Some versions use
scc_prefix instead ofstcr_for parameters. Verify the parameter names by inspecting the management page HTML if reached.
Summary
The Subscribe To Comments Reloaded plugin leaks its global security key via a localized JavaScript variable on public post pages. An unauthenticated attacker can use this key to forge authorization tokens for any email address and gain unauthorized access to the subscription management dashboard, allowing them to modify or delete subscriptions for any user.
Vulnerable Code
// Inferred from plugin logic: The global secret key is leaked to the frontend // subscribe-to-comments-reloaded/classes/stcr-front.php (approximate) $stcr_data = array( 'key' => get_option('stcr_global_key'), // Vulnerable: Leaking global secret to client 'ajax_url' => admin_url('admin-ajax.php') ); wp_localize_script('stcr-script', 'stcr_data', $stcr_data); --- // Inferred from plugin logic: Weak hash verification for management access // subscribe-to-comments-reloaded/classes/stcr-management.php (approximate) $email = $_GET['stcr_email']; $provided_key = $_GET['stcr_key']; $global_key = get_option('stcr_global_key'); // Weak verification algorithm: md5(email + global_key) if ($provided_key === md5($email . $global_key)) { // Grant access to manage subscriptions for $email $this->render_management_page($email); }
Security Fix
@@ -10,7 +10,6 @@ - 'key' => get_option('stcr_global_key'), 'ajax_url' => admin_url('admin-ajax.php') @@ -25,5 +25,5 @@ -if ($provided_key === md5($email . $global_key)) { +if (hash_equals(wp_hash($email . $global_key, 'nonce'), $provided_key)) {
Exploit Outline
1. Navigate to any public post where the plugin is active and view the HTML source code. 2. Locate the localized JavaScript object (usually `stcr_data`) and extract the value of the `key` property (this is the plugin's global secret key). 3. Select a target email address (e.g., the site administrator's email) to exploit. 4. Calculate the authorization token by creating an MD5 hash of the email address concatenated with the extracted secret key: `md5(email + secret_key)`. 5. Navigate to the plugin's management endpoint (e.g., `/?stcr_action=manage&stcr_email=[EMAIL]&stcr_key=[FORGED_HASH]`). 6. The plugin will grant full access to the target's subscription dashboard, allowing for unauthorized modification or deletion of subscriptions.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.