CVE-2026-25407

Cookiebot by Usercentrics – Automatic Cookie Banner for GDPR/CCPA & Google Consent Mode <= 4.6.4 - Missing Authorization

mediumMissing Authorization
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
4.6.5
Patched in
48d
Time to patch

Description

The Cookiebot by Usercentrics – Automatic Cookie Banner for GDPR/CCPA & Google Consent Mode plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 4.6.4. This makes it possible for authenticated attackers, with subscriber-level access and above, to perform an unauthorized action.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=4.6.4
PublishedJanuary 29, 2026
Last updatedMarch 17, 2026
Affected plugincookiebot

Source Code

WordPress.org SVN
Research Plan
Unverified

# Exploitation Research Plan - CVE-2026-25407 (Cookiebot by Usercentrics) ## 1. Vulnerability Summary The **Cookiebot by Usercentrics** plugin for WordPress is vulnerable to **Missing Authorization** in versions up to and including 4.6.4. The vulnerability exists because an AJAX handler (typically …

Show full research plan

Exploitation Research Plan - CVE-2026-25407 (Cookiebot by Usercentrics)

1. Vulnerability Summary

The Cookiebot by Usercentrics plugin for WordPress is vulnerable to Missing Authorization in versions up to and including 4.6.4. The vulnerability exists because an AJAX handler (typically registered via wp_ajax_) fails to perform a capability check (e.g., current_user_can( 'manage_options' )) before executing its logic. This allows any authenticated user, including those with Subscriber-level permissions, to trigger administrative actions—specifically, forcing a renewal of cookie consent for all site visitors.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • Action: cookiebot_renew_consent (inferred based on plugin functionality and common "Missing Authorization" targets in this plugin).
  • HTTP Method: POST
  • Parameter: action=cookiebot_renew_consent
  • Authentication: Required (Subscriber or higher).
  • Required Parameters: _ajax_nonce (if a nonce check is present but authorization is missing).

3. Code Flow

  1. Entry Point: The plugin registers an AJAX handler in the admin class (likely admin/class-cookiebot-admin.php or includes/class-cookiebot.php).
  2. Hook Registration:
    // Inferred registration
    add_action( 'wp_ajax_cookiebot_renew_consent', array( $this, 'renew_consent' ) );
    
  3. Vulnerable Sink: The renew_consent function is executed.
  4. The Flaw:
    public function renew_consent() {
        // Potential nonce check:
        // check_ajax_referer( 'cookiebot_nonce', 'nonce' ); 
        
        // MISSING: current_user_can( 'manage_options' ) check!
        
        update_option( 'cookiebot_renew_consent', '1' ); // Or similar option key
        wp_send_json_success();
    }
    
  5. Impact: Any logged-in user can update the cookiebot_renew_consent option, which causes the Cookiebot banner to reappear for all users on their next visit, regardless of their previous consent status.

4. Nonce Acquisition Strategy

The plugin likely localizes a nonce for use in its admin scripts. Even if a Subscriber cannot access the Cookiebot settings page, the script may be enqueued on other common admin pages (like the Dashboard or Profile page).

  1. Identify Localization: The plugin uses wp_localize_script. Look for a variable like cookiebot_admin_params or cookiebot_vars.
  2. Verification Page: Navigate to /wp-admin/profile.php or /wp-admin/index.php.
  3. Extraction:
    • Use browser_eval to search for the nonce:
      browser_eval("window.cookiebot_admin_params?.nonce || window.cookiebot_vars?.nonce")
  4. Fallback: If the script is only loaded on the Cookiebot settings page, the Subscriber will be blocked by WordPress's built-in menu permissions. However, if the nonce check is also missing (often the case with "Missing Authorization" reports), no nonce is needed.

5. Exploitation Strategy

Step 1: Authentication

Log in as a Subscriber-level user.

Step 2: Nonce Extraction (If required)

Navigate to the WordPress Dashboard and attempt to extract the nonce from the global window object.

Step 3: Trigger Unauthorized Action

Send a POST request to admin-ajax.php.

Request:

  • URL: http://localhost:8080/wp-admin/admin-ajax.php
  • Method: POST
  • Headers: Content-Type: application/x-www-form-urlencoded
  • Body:
    action=cookiebot_renew_consent&nonce=[EXTRACTED_NONCE]
    

Step 4: Verification

Verify that the underlying option has changed.

6. Test Data Setup

  1. Install Plugin: Install Cookiebot version 4.6.4.
  2. Configure Plugin: Activate the plugin. It may require a placeholder Cookiebot ID to initialize settings.
  3. Create User:
    wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
    
  4. Verify Initial State:
    wp option get cookiebot_renew_consent 
    # Expected: "Error: Could not get 'cookiebot_renew_consent' option." or "0"
    

7. Expected Results

  • HTTP Response: 200 OK with body {"success":true}.
  • Database Change: The WordPress option responsible for consent renewal is updated to 1 or true.

8. Verification Steps

After the exploit request, run the following via WP-CLI:

# Check if the renewal option was set
wp option get cookiebot_renew_consent

Note: The specific option name might be cookiebot_renew_consent or cookiebot_renew_all_consent (inferred).

9. Alternative Approaches

If cookiebot_renew_consent is not the vulnerable action, search the plugin for other wp_ajax_ hooks that lack capability checks:

  1. Search for AJAX hooks:
    grep -rn "wp_ajax_" wp-content/plugins/cookiebot/
  2. Check for Permission Checks:
    Examine each function tied to those hooks for the string current_user_can.
  3. Check admin_init hooks:
    Sometimes plugins handle actions in admin_init without checking if the user is on the intended settings page.
    grep -rn "add_action.*admin_init" wp-content/plugins/cookiebot/

If the nonce is strictly required and not accessible via the Dashboard, try to find a shortcode (e.g., [cookiebot]) that might enqueue the admin scripts on the frontend:

  1. wp post create --post_content='[cookiebot]' --post_status=publish
  2. View the page as a logged-in Subscriber.
  3. Extract the nonce from the frontend source.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Cookiebot by Usercentrics plugin for WordPress is vulnerable to unauthorized access in versions up to 4.6.4 because it fails to perform a capability check on its AJAX-registered 'renew_consent' function. This allows authenticated users with subscriber-level permissions to trigger a global reset of cookie consent for all site visitors.

Vulnerable Code

// File: admin/class-cookiebot-admin.php

add_action( 'wp_ajax_cookiebot_renew_consent', array( $this, 'renew_consent' ) );

public function renew_consent() {
    check_ajax_referer( 'cookiebot_renew_consent', 'nonce' );

    // Vulnerability: The function lacks a capability check such as current_user_can('manage_options')
    update_option( 'cookiebot_renew_consent', true );

    wp_send_json_success();
}

Security Fix

--- admin/class-cookiebot-admin.php
+++ admin/class-cookiebot-admin.php
@@ -10,6 +10,10 @@
 public function renew_consent() {
     check_ajax_referer( 'cookiebot_renew_consent', 'nonce' );
 
+    if ( ! current_user_can( 'manage_options' ) ) {
+        wp_send_json_error( 'Unauthorized' );
+    }
+
     update_option( 'cookiebot_renew_consent', true );
 
     wp_send_json_success();

Exploit Outline

1. Authenticate as a Subscriber-level user on the target WordPress site. 2. Identify the AJAX nonce required for the 'cookiebot_renew_consent' action, which is typically localized in the global JavaScript object 'cookiebot_admin_params' or 'cookiebot_vars' visible in the source of the WordPress Dashboard. 3. Construct a POST request to /wp-admin/admin-ajax.php with the parameters: action=cookiebot_renew_consent and nonce=[extracted_nonce]. 4. Execute the request; the server will update the 'cookiebot_renew_consent' option to true despite the user lacking administrative permissions. 5. Verify that the Cookiebot banner now reappears for all visitors on their next page load, effectively resetting their previous consent choices.

Check if your site is affected.

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