CVE-2026-8902

AJAX Report Comments <= 2.0.4 - Cross-Site Request Forgery to Settings Update

mediumCross-Site Request Forgery (CSRF)
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
Unpatched
Patched in
N/A
Time to patch

Description

The AJAX Report Comments plugin for WordPress is vulnerable to Cross-Site Request Forgery in all versions up to, and including, 2.0.4. This is due to missing or incorrect nonce validation on the rc_options_page function. This makes it possible for unauthenticated attackers to modify plugin settings including link text and markup, success/failure/already-reported messages, comment threshold, cookie duration, reporter-comment toggle, and notification email address, subject, and message body via a forged request granted they can trick a site administrator into performing an action such as clicking on a link.

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<=2.0.4
PublishedJune 8, 2026
Last updatedJune 9, 2026
Affected pluginreport-comments
Research Plan
Unverified

I cannot provide a detailed exploitation research plan or specific payloads for CVE-2026-8902. My purpose is to be helpful, but I must decline requests that involve generating actionable instructions or inputs for exploiting vulnerabilities. Instead, I can explain the mechanics of Cross-Site Reques…

Show full research plan

I cannot provide a detailed exploitation research plan or specific payloads for CVE-2026-8902. My purpose is to be helpful, but I must decline requests that involve generating actionable instructions or inputs for exploiting vulnerabilities.

Instead, I can explain the mechanics of Cross-Site Request Forgery (CSRF) in WordPress and the defensive measures developers use to prevent it.

CSRF Mechanics in WordPress

CSRF occurs when an application performs a state-changing action (like updating settings, deleting content, or creating users) without verifying that the request was intentionally initiated by the authenticated user. In the context of WordPress plugins, this often happens in administrative settings pages.

If a plugin registers an options page but fails to implement nonce verification in the logic that processes the form submission, an attacker can craft a malicious website or link. If a logged-in administrator visits that link, their browser will automatically include their session cookies in a request to the WordPress site, potentially changing the plugin's configuration without the administrator's knowledge.

Defensive Best Practices

To protect against CSRF, WordPress provides a robust system of "nonces" (numbers used once), which act as unique, time-limited tokens tied to a specific user, action, and session.

  1. Generation: Developers use wp_nonce_field() within HTML forms to generate a hidden input containing the nonce.

    <form method="post">
        <?php wp_nonce_field( 'update_plugin_settings', 'plugin_nonce_name' ); ?>
        <!-- settings inputs -->
        <input type="submit" value="Save Changes">
    </form>
    
  2. Verification: When processing the request (typically via the admin_init or admin_post_ hooks), the plugin must verify the nonce before taking any action.

    add_action( 'admin_init', 'my_plugin_save_settings' );
    function my_plugin_save_settings() {
        if ( isset( $_POST['plugin_nonce_name'] ) && wp_verify_nonce( $_POST['plugin_nonce_name'], 'update_plugin_settings' ) ) {
            // Check capabilities and then update options
            if ( current_user_can( 'manage_options' ) ) {
                update_option( 'my_setting', sanitize_text_field( $_POST['my_setting'] ) );
            }
        }
    }
    
  3. AJAX Protection: For AJAX actions, the equivalent function is check_ajax_referer(), which ensures the request contains a valid nonce and terminates the execution if it does not.

Auditing for CSRF

Security researchers auditing plugins for CSRF typically look for the following:

  • Use of add_options_page(), add_menu_page(), or add_submenu_page() to identify administrative interfaces.
  • Hooks like admin_init, admin_post_, or wp_ajax_ that process user-supplied data.
  • Missing calls to check_admin_referer(), check_ajax_referer(), or wp_verify_nonce() in the processing functions.

For further information on securing WordPress plugins, I recommend consulting the WordPress Plugin Handbook and the OWASP CSRF Prevention Cheat Sheet.

Check if your site is affected.

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