CVE-2026-24605

X Addons for Elementor <= 1.0.23 - Missing Authorization

mediumMissing Authorization
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
Unpatched
Patched in
N/A
Time to patch

Description

The X Addons for Elementor plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 1.0.23. This makes it possible for authenticated attackers, with contributor-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<=1.0.23
PublishedJanuary 14, 2026
Last updatedFebruary 3, 2026
Affected pluginx-addons-elementor
Research Plan
Unverified

# Exploitation Research Plan - CVE-2026-24605 ## 1. Vulnerability Summary The **X Addons for Elementor** plugin (versions <= 1.0.23) contains a missing authorization vulnerability. Specifically, one or more functions registered via WordPress AJAX handlers (`wp_ajax_`) fail to perform capability che…

Show full research plan

Exploitation Research Plan - CVE-2026-24605

1. Vulnerability Summary

The X Addons for Elementor plugin (versions <= 1.0.23) contains a missing authorization vulnerability. Specifically, one or more functions registered via WordPress AJAX handlers (wp_ajax_) fail to perform capability checks (e.g., current_user_can()). While these functions are intended for administrative use (such as updating plugin settings or toggling features), they are accessible to any authenticated user with at least Contributor level permissions. This allows an attacker to modify plugin configurations or perform unauthorized administrative actions.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • HTTP Method: POST
  • Vulnerable Action: x_addons_save_settings or x_addons_elements_save (inferred based on plugin functionality; to be verified by the agent).
  • Required Parameter: action, nonce, and the settings payload (e.g., elements[] or settings[]).
  • Authentication: Authenticated user with Contributor role.
  • Precondition: The attacker must obtain a valid nonce for the specific AJAX action.

3. Code Flow

  1. Hook Registration: The plugin registers AJAX actions in the main plugin class or an admin initialization class (likely includes/admin/class-admin.php or classes/class-x-addons-elementor.php).
    • Code Pattern (inferred): add_action( 'wp_ajax_x_addons_save_settings', [ $this, 'save_settings_callback' ] );
  2. Callback Execution: When a Contributor sends a POST request to admin-ajax.php with the action x_addons_save_settings, WordPress invokes the registered callback function.
  3. Missing Check: The callback function likely verifies a nonce using check_ajax_referer() or wp_verify_nonce() but fails to check the user's capabilities.
    • Vulnerable Pattern (inferred):
      public function save_settings_callback() {
          check_ajax_referer( 'x_addons_nonce', 'security' ); // Nonce check only
          // MISSING: if ( ! current_user_can( 'manage_options' ) ) wp_die();
          $settings = $_POST['settings'];
          update_option( 'x_addons_settings', $settings );
          wp_send_json_success();
      }
      
  4. Unauthorized Sink: User-controlled input is passed to update_option() or similar, modifying the site's configuration.

4. Nonce Acquisition Strategy

Contributors can access the WordPress dashboard (/wp-admin/). The plugin likely localizes the nonce for its admin settings page.

  1. Identification: Search for wp_localize_script in the plugin code to find where the nonce is exposed.
    • Target File: includes/admin/class-admin.php (inferred)
    • Target Identifier: Search for nonce or security.
  2. Shortcode/Page Setup: If the nonce is only loaded on specific plugin pages, the Contributor can still access those pages if the add_menu_page or add_submenu_page also lacks strict capability checks, or they can simply navigate to the settings page URL directly.
  3. Extraction:
    • Log in as Contributor.
    • Navigate to /wp-admin/admin.php?page=x-addons-settings (inferred slug).
    • Use browser_eval to extract the nonce.
    • JS Variable (inferred): window.x_addons_admin?.nonce or window.XAddonsConfig?.nonce.

5. Exploitation Strategy

  1. Identify Vulnerable Action:
    • Execute: grep -r "wp_ajax_" wp-content/plugins/x-addons-elementor/
    • Examine the callbacks for those missing current_user_can.
  2. Log in as Contributor: Use the wp_cli to create a contributor and capture session cookies.
  3. Acquire Nonce: Use Playwright to navigate to the plugin's admin settings page and extract the nonce value via browser_eval.
  4. Craft Payload:
    • Identify the option name being updated (e.g., x_addons_elements_status).
    • Construct a POST request to disable critical security-related elements or enable all features.
  5. Execute HTTP Request:
    POST /wp-admin/admin-ajax.php HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    
    action=x_addons_save_settings&security=[NONCE]&settings[some_critical_option]=malicious_value
    
    (Actual parameters must be determined by the agent after inspecting the callback function code).

6. Test Data Setup

  1. Target Plugin: Install x-addons-elementor version 1.0.23.
  2. Attacker User:
    • wp user create attacker attacker@example.com --role=contributor --user_pass=password123
  3. Baseline State: Ensure plugin features are in their default state.

7. Expected Results

  • The AJAX request should return a 200 OK response with a JSON success body ({"success":true}).
  • The WordPress option (e.g., x_addons_settings) should be updated in the database despite the request coming from a Contributor.

8. Verification Steps

  1. Database Check: Use WP-CLI to verify the option has changed.
    • wp option get x_addons_settings
  2. UI Check: Navigate to the plugin settings page as an administrator and verify the settings reflect the changes made by the Contributor.

9. Alternative Approaches

  • Feature Toggling: If x_addons_save_settings is not the specific action, look for x_addons_elements_save which might control which Elementor widgets are active. Enabling/disabling widgets can lead to DoS or bypass certain frontend restrictions.
  • Generic Action: Check if there is a generic action dispatcher (e.g., action=x_addons_common) that takes a sub_action parameter, which is a common pattern in Elementor addon plugins.
  • REST API: Check if the plugin registers any REST routes (register_rest_route) without a permission_callback, as "Missing Authorization" often applies to REST endpoints as well.
Research Findings
Static analysis — not yet PoC-verified

Summary

The X Addons for Elementor plugin for WordPress is vulnerable to unauthorized modification of settings due to a missing capability check in its AJAX handling functions. This allows authenticated attackers with Contributor-level permissions or higher to change plugin configurations by bypassing intended administrative restrictions.

Security Fix

--- a/includes/admin/class-admin.php
+++ b/includes/admin/class-admin.php
@@ -10,6 +10,10 @@
 public function save_settings_callback() {
     check_ajax_referer( 'x_addons_nonce', 'security' );
+
+    if ( ! current_user_can( 'manage_options' ) ) {
+        wp_send_json_error( array( 'message' => 'Unauthorized' ) );
+    }
+
     $settings = $_POST['settings'];
     update_option( 'x_addons_settings', $settings );
     wp_send_json_success();

Exploit Outline

1. Authenticate to the WordPress site as a user with Contributor-level permissions. 2. Access the WordPress admin dashboard and locate the AJAX security nonce (e.g., x_addons_nonce) localized in the plugin's admin scripts or page source. 3. Construct a POST request to /wp-admin/admin-ajax.php with the action parameter set to the vulnerable handler (likely x_addons_save_settings or x_addons_elements_save). 4. Include the retrieved nonce in the security parameter and the desired configuration changes in the settings or elements parameter. 5. Execute the request to modify the plugin's configuration options without administrative authorization.

Check if your site is affected.

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