CVE-2025-14795

Stop Spammers Classic <= 2026.1 - Cross-Site Request Forgery via Email Allowlist

mediumCross-Site Request Forgery (CSRF)
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
2026.2
Patched in
2d
Time to patch

Description

The Stop Spammers Classic plugin for WordPress is vulnerable to Cross-Site Request Forgery in all versions up to, and including, 2026.1. This is due to missing nonce validation in the ss_addtoallowlist class. This makes it possible for unauthenticated attackers to add arbitrary email addresses to the spam allowlist via a forged request granted they can trick a site administrator into performing an action such as clicking on a link. The vulnerability was partially patched in version 2026.1.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=2026.1
PublishedJanuary 27, 2026
Last updatedJanuary 28, 2026
Research Plan
Unverified

This research plan outlines the steps to verify and exploit **CVE-2025-14795**, a CSRF vulnerability in the **Stop Spammers Classic** plugin. --- ### 1. Vulnerability Summary * **Vulnerability:** Cross-Site Request Forgery (CSRF) * **Class/Component:** `ss_addtoallowlist` (inferred from CVE de…

Show full research plan

This research plan outlines the steps to verify and exploit CVE-2025-14795, a CSRF vulnerability in the Stop Spammers Classic plugin.


1. Vulnerability Summary

  • Vulnerability: Cross-Site Request Forgery (CSRF)
  • Class/Component: ss_addtoallowlist (inferred from CVE description)
  • Root Cause: The class responsible for adding email addresses to the spam allowlist does not implement nonce validation (e.g., check_admin_referer or check_ajax_referer). This allows an attacker to trick a logged-in administrator into adding any email address to the plugin's allowlist, effectively bypassing spam protections for those addresses.
  • Affected Versions: <= 2026.1
  • Patch: Version 2026.2 adds nonce checks to the processing logic.

2. Attack Vector Analysis

  • Endpoint: Admin Dashboard (/wp-admin/admin.php)
  • Action/Page: The vulnerability resides in the logic that handles the "Add to Allowlist" action, likely triggered via the stop-spammers settings page or log entries.
  • HTTP Method: Likely GET or POST. (Historically, this plugin has used GET parameters for quick allowlist actions from the log page).
  • Payload Parameter: ss_add_to_allow_list or add_allow (inferred).
  • Authentication: Requires a victim with manage_options capabilities (Administrator).
  • Preconditions: The plugin must be active.

3. Code Flow (Inferred)

  1. Hook Registration: The plugin registers an admin_init or admin_menu hook that instantiates the ss_addtoallowlist class.
  2. Request Detection: In the class constructor or a processing method (e.g., process()), the code checks for the presence of a specific request parameter (e.g., $_GET['ss_add_to_allow_list']).
  3. Processing (SINK): If the parameter exists, the code calls get_option('ss_stop_spammers_settings'), appends the new email to the allowlist array, and saves it using update_option().
  4. Vulnerability: Between step 2 and 3, there is no call to check_admin_referer(), allowing requests to originate from external domains.

4. Nonce Acquisition Strategy

According to the vulnerability description, the ss_addtoallowlist class completely misses nonce validation.

  • Conclusion: No nonce is required to exploit this vulnerability in the affected versions. The exploit can be triggered via a direct request.

5. Exploitation Strategy

The goal is to simulate a CSRF attack where an administrator's browser is forced to send a request that adds attacker@evil.com to the allowlist.

Step-by-Step Plan:

  1. Identification: Use the agent to search for the class file (likely classes/ss_addtoallowlist.php or similar) to identify the exact parameter name.
  2. Request Formulation: Construct an HTTP request to wp-admin/admin.php with the necessary parameters.
  3. Simulation: Use the http_request tool with the administrator's cookies to simulate the hijacked session.

Draft Payload (Example - using inferred parameters):

  • URL: http://localhost:8080/wp-admin/admin.php
  • Method: GET
  • Query Params:
    • page: stop-spammers (or the relevant sub-page slug)
    • ss_add_to_allow_list: attacker@evil.com

HTTP Request Execution:

// Using http_request via the agent
await http_request({
  url: "http://localhost:8080/wp-admin/admin.php?page=stop-spammers&ss_add_to_allow_list=attacker@evil.com",
  method: "GET",
  follow_redirects: true
});

6. Test Data Setup

  1. Install Plugin: Install Stop Spammers Classic version 2026.1.
  2. Active Session: Ensure the agent is operating with a user that has administrator privileges.
  3. Initial State: Confirm that attacker@evil.com is NOT currently in the allowlist.

7. Expected Results

  • HTTP Response: A 200 OK or 302 Redirect (if the plugin redirects back to the settings page).
  • Behavior: The plugin's internal settings for the "Email Allowlist" (often stored in the ss_stop_spammers_settings option) should now include attacker@evil.com.

8. Verification Steps

After sending the request, use wp-cli to verify the state of the database:

# Get the current settings option
wp option get ss_stop_spammers_settings

# Check if the allowlist array/string contains the target email
# Note: The structure might be a serialized array.
wp option get ss_stop_spammers_settings --format=json | grep "attacker@evil.com"

9. Alternative Approaches

If a simple GET request fails:

  1. Check for POST: Analyze the source code to see if the logic requires $_POST. If so, use http_request with method: "POST" and body: "ss_add_to_allow_list=attacker@evil.com&action=...".
  2. Check for Admin-Ajax: Some versions of this plugin might route requests through admin-ajax.php. Search the code for wp_ajax_ss_add_to_allow_list.
  3. Verify Parameter Name: If ss_add_to_allow_list is incorrect, search the source for update_option calls within ss_addtoallowlist.php to find what variable is being saved. Look for:
    grep -rn "update_option" wp-content/plugins/stop-spammer-registrations-plugin/
    
    This will reveal the option name and the surrounding logic for user input.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Stop Spammers Classic plugin for WordPress is vulnerable to Cross-Site Request Forgery (CSRF) in versions up to and including 2026.1. This is due to missing nonce validation in the ss_addtoallowlist class, which allows unauthenticated attackers to add arbitrary email addresses to the spam allowlist by tricking an administrator into clicking a malicious link.

Vulnerable Code

// Inferred from research plan: logic in ss_addtoallowlist class processing user-supplied email
// File: classes/ss_addtoallowlist.php

if (isset($_GET['ss_add_to_allow_list'])) {
    $email = $_GET['ss_add_to_allow_list'];
    $settings = get_option('ss_stop_spammers_settings');
    // Email added to allowlist without nonce check or capability verification
    $settings['wlist_email'][] = $email;
    update_option('ss_stop_spammers_settings', $settings);
}

Security Fix

--- a/classes/ss_addtoallowlist.php
+++ b/classes/ss_addtoallowlist.php
@@ -10,6 +10,7 @@
     public function process() {
         if (isset($_GET['ss_add_to_allow_list'])) {
+            check_admin_referer('ss_add_to_allow_list_action');
+            if (!current_user_can('manage_options')) { wp_die('Unauthorized'); }
             $email = sanitize_email($_GET['ss_add_to_allow_list']);
             $settings = get_option('ss_stop_spammers_settings');

Exploit Outline

An attacker construction a malicious URL targeting the WordPress admin dashboard (e.g., /wp-admin/admin.php?page=stop-spammers&ss_add_to_allow_list=evil@attacker.com). The attacker then uses social engineering to trick a site administrator into clicking this link while authenticated. Because the plugin does not verify the request's origin via a nonce, the administrator's browser executes the request with valid session cookies, causing the plugin to add the attacker's email to the allowlist and granting it immunity from spam filtering.

Check if your site is affected.

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