CVE-2026-39682

linkPizza-Manager <= 5.5.5 - Missing Authorization

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

Description

The linkPizza-Manager plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 5.5.5. 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<=5.5.5
PublishedFebruary 21, 2026
Last updatedApril 15, 2026
Affected pluginlinkpizza-manager
Research Plan
Unverified

# Exploitation Research Plan: CVE-2026-39682 (linkPizza-Manager Missing Authorization) ## 1. Vulnerability Summary The **linkPizza-Manager** plugin for WordPress is vulnerable to **Missing Authorization** in versions up to and including **5.5.5**. The vulnerability exists because specific functions…

Show full research plan

Exploitation Research Plan: CVE-2026-39682 (linkPizza-Manager Missing Authorization)

1. Vulnerability Summary

The linkPizza-Manager plugin for WordPress is vulnerable to Missing Authorization in versions up to and including 5.5.5. The vulnerability exists because specific functions—likely associated with AJAX handlers or administrative initialization hooks—fail to implement a current_user_can() check. This allows unauthenticated attackers to trigger sensitive actions, such as modifying plugin settings (API keys, tracking IDs) or performing other administrative tasks, by directly calling the vulnerable function via WordPress's AJAX or initial load infrastructure.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php (or potentially any request if hooked to admin_init).
  • Action (Inferred): linkpizza_save_settings or linkpizza_update_options.
  • Vulnerable Hook: wp_ajax_nopriv_linkpizza_save_settings or a similar action registered for logged-out users. Alternatively, it may be a wp_ajax_ action that lacks a capability check but is incorrectly exposed, or an admin_init hook that processes $_POST data without verification.
  • Payload Parameter: lp_api_key, lp_project_id, or generic settings arrays.
  • Authentication: Unauthenticated (PR:N).
  • Preconditions: The plugin must be active. A nonce may be required, though the "Missing Authorization" label often implies that even if a nonce is checked, the permission level of the user is not.

3. Code Flow

  1. Entry Point: The attacker sends a POST request to admin-ajax.php.
  2. Hook Trigger: WordPress processes the action parameter (e.g., linkpizza_save_settings). If registered via add_action( 'wp_ajax_nopriv_linkpizza_save_settings', ... ), it executes the callback.
  3. Vulnerable Function: The callback function (e.g., linkpizza_handle_settings_save()) is invoked.
  4. Missing Check: The function checks if specific $_POST variables are set but fails to call current_user_can( 'manage_options' ).
  5. Sink: The function calls update_option( 'linkpizza_settings', ... ) or similar, updating the plugin configuration with attacker-supplied values.

4. Nonce Acquisition Strategy

If the plugin uses check_ajax_referer() or wp_verify_nonce(), we must obtain a valid nonce. In many cases, these plugins expose nonces to unauthenticated users to support frontend tracking features.

  1. Discovery: Identify if the plugin enqueues scripts on the frontend.
  2. Shortcode Search: Search the plugin for shortcodes: grep -rn "add_shortcode" . (e.g., [linkpizza]).
  3. Page Creation: Create a page containing the shortcode:
    wp post create --post_type=page --post_status=publish --post_title="LP Test" --post_content='[linkpizza]'
    
  4. Extraction: Navigate to the page and use browser_eval to find the localized data:
    • Inferred Variable: window.linkpizza_vars or window.lp_manager_data.
    • Command: browser_eval("window.lp_manager_vars?.nonce")
  5. Bypass Check: If the code uses check_ajax_referer( 'linkpizza_action', 'nonce', false ) without checking the return value, the nonce check is bypassed, and any value will work.

5. Exploitation Strategy

We will attempt to overwrite the LinkPizza API Key, which would allow an attacker to redirect affiliate commission data to their own account.

Step 1: Discover the AJAX Action

Search the plugin source for AJAX registrations:

grep -r "wp_ajax_nopriv" .

Assuming the action is linkpizza_save_settings.

Step 2: Test Unauthenticated Setting Update

Send a POST request to update the API key.

  • URL: http://localhost:8080/wp-admin/admin-ajax.php
  • Method: POST
  • Content-Type: application/x-www-form-urlencoded
  • Parameters:
    • action: linkpizza_save_settings (inferred)
    • lp_api_key: ATTACKER_CONTROLLED_API_KEY
    • nonce: [EXTRACTED_NONCE] (if required)

Step 3: Blind Verification (If response is non-descript)

If the response is 0 or 1, we must verify the database state.

6. Test Data Setup

  1. Plugin Installation: Ensure linkpizza-manager <= 5.5.5 is installed.
  2. Initial Config: Set a legitimate API key via WP-CLI to simulate a configured environment:
    wp option update linkpizza_settings '{"api_key": "LEGIT_KEY_123", "project_id": "PROJECT_456"}'
    
  3. Public Page: Create a page to test for frontend nonce leakage (as described in section 4).

7. Expected Results

  • Response: The HTTP response should indicate success (e.g., a JSON success message {"success":true} or a simple 1).
  • Database Change: The WordPress option linkpizza_settings (or similar) will now contain ATTACKER_CONTROLLED_API_KEY.

8. Verification Steps

After sending the exploit, verify the modification using WP-CLI:

# Check the current value of the settings option
wp option get linkpizza_settings

# Verify if the API key matches the payload
wp option get linkpizza_settings --format=json | jq -r '.api_key'

9. Alternative Approaches

  • admin_init Hook: If no AJAX action is found, search for admin_init hooks that do not check is_admin() or permissions:
    grep -rn "add_action.*admin_init" .
    
    Then, trigger the logic by visiting /wp-admin/admin-post.php or even /wp-admin/index.php with the required parameters, as admin_init runs on all admin pages and admin-ajax.php.
  • Parameter Fuzzing: If the setting key is unknown, look for the update_option call in the vulnerable function to identify the exact key name (e.g., lp_settings, linkpizza_options).
Research Findings
Static analysis — not yet PoC-verified

Summary

The linkPizza-Manager plugin for WordPress (up to version 5.5.5) is vulnerable to unauthorized configuration modification due to a missing authorization check on its settings-saving functionality. This allows unauthenticated attackers to overwrite critical plugin options, such as API keys, by sending unauthenticated requests to the plugin's AJAX handlers or administrative initialization hooks.

Exploit Outline

The exploit targets the plugin's settings update mechanism, which is incorrectly exposed via AJAX or an admin_init hook without proper permission checks. An attacker first searches the site's frontend for localized scripts (such as 'window.lp_manager_vars') to extract a valid nonce if the plugin requires one. They then send an unauthenticated POST request to '/wp-admin/admin-ajax.php' (or a similar administrative endpoint) containing the target 'action' and malicious configuration values, such as an attacker-controlled 'lp_api_key'. Because the backend callback fails to verify the user's capabilities using 'current_user_can()', the plugin updates the 'linkpizza_settings' option in the database with the provided values.

Check if your site is affected.

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