NotificationX <= 3.1.11 - Missing Authorization to Authenticated (Contributor+) Analytics Reset
Description
The NotificationX plugin for WordPress is vulnerable to unauthorized modification of data due to a missing capability check on the 'regenerate' and 'reset' REST API endpoints in all versions up to, and including, 3.1.11. This makes it possible for authenticated attackers, with Contributor-level access and above, to reset analytics for any NotificationX campaign, regardless of ownership.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=3.1.11Source Code
WordPress.org SVNThis research plan targets **CVE-2026-0554**, a missing authorization vulnerability in the **NotificationX** plugin. This flaw allows users with Contributor-level roles and above to reset or regenerate analytics for any notification campaign via the WordPress REST API. --- ### 1. Vulnerability Sum…
Show full research plan
This research plan targets CVE-2026-0554, a missing authorization vulnerability in the NotificationX plugin. This flaw allows users with Contributor-level roles and above to reset or regenerate analytics for any notification campaign via the WordPress REST API.
1. Vulnerability Summary
- Vulnerability: Missing Authorization (IDOR-like behavior in REST API).
- Affected Plugin: NotificationX (slug:
notificationx). - Affected Versions: <= 3.1.11.
- Vulnerable Endpoints: REST API routes used for regenerating and resetting analytics.
- Impact: An attacker with Contributor privileges can delete or reset performance metrics (views, clicks, conversions) for any campaign, potentially disrupting business reporting or marketing analytics.
2. Attack Vector Analysis
- Endpoint:
/wp-json/notificationx/v1/analytics/resetand/wp-json/notificationx/v1/analytics/regenerate(inferred from description). - Method:
POST. - Authentication: Authenticated (Contributor+).
- Payload Parameter:
id(The ID of the NotificationX campaign, which is a custom post typenx_notifications). - Vulnerability Root: The
permission_callbackfor these REST routes likely uses a check such ascurrent_user_can('edit_posts')(which Contributors have) instead of checking for administrative privileges or specific ownership of the notification campaign.
3. Code Flow (Inferred)
- Route Registration: The plugin uses the
rest_api_inithook to register routes.- File:
includes/Classes/Rest_API.phpor similar (inferred). - Function:
register_rest_route('notificationx/v1', '/analytics/reset', ...)(inferred).
- File:
- Authorization Check: The
permission_callbacklikely returnstruefor any user who canedit_posts. - Action Execution: The
callbackfunction takes theidfrom the request and clears the database entries in the analytics table associated with that ID.
4. Nonce Acquisition Strategy
REST API requests for authenticated users require a standard WordPress REST nonce (wp_rest).
- Login: Authenticate as a Contributor user.
- Access Dashboard: Navigate to
wp-admin/index.php. - Extract Nonce: The
wp_restnonce is typically localized in thewpApiSettingsobject.- Action: Use
browser_evalto extract the nonce:window.wpApiSettings.nonce
- Action: Use
- Header: This nonce must be sent in the
X-WP-NonceHTTP header.
5. Test Data Setup
- Install NotificationX: Ensure version <= 3.1.11 is installed.
- Create Campaign: As an Administrator, create a new NotificationX campaign (e.g., a "Sales Notification").
- Note the ID of this campaign (e.g.,
POST_ID).
- Note the ID of this campaign (e.g.,
- Generate Analytics Data: Simulate/generate some views or clicks for this campaign so the analytics are non-zero.
- Analytics data is usually stored in a custom table like
wp_nx_analytics.
- Analytics data is usually stored in a custom table like
- Create Attacker User: Create a user with the Contributor role.
6. Exploitation Strategy
The goal is to reset the analytics of the Admin-created campaign while logged in as a Contributor.
Step 1: Login as Contributor.
Use the http_request tool to perform a login and maintain the session.
Step 2: Obtain the REST Nonce.
Navigate to any admin page (e.g., /wp-admin/profile.php) and extract the nonce using browser_eval.
Step 3: Trigger the Reset.
Send a POST request to the reset endpoint.
- URL:
http://[target]/wp-json/notificationx/v1/analytics/reset(orregenerate) - Method:
POST - Headers:
Content-Type: application/jsonX-WP-Nonce: [Extracted Nonce]
- Payload:
{ "id": [POST_ID_OF_ADMIN_CAMPAIGN] }
7. Expected Results
- Response Code:
200 OKor204 No Content. - Response Body: Likely a success message or the updated (zeroed) campaign object.
- Database Change: The analytics count for the targeted campaign should be reset to zero.
8. Verification Steps
- Check via WP-CLI:
Verify the analytics table directly. NotificationX uses custom tables.# Replace nx_analytics with the actual table name if different wp db query "SELECT count(*) FROM wp_nx_analytics WHERE notification_id = [POST_ID]"- Success Criteria: The count is
0after the exploit, where it was> 0before.
- Success Criteria: The count is
- Check Admin UI:
Log in as Admin and view the NotificationX "Analytics" dashboard; the numbers for the targeted campaign should be wiped.
9. Alternative Approaches
- Namespace Guessing: If
notificationx/v1is incorrect, grep the plugin folder forregister_rest_routeto find the exact namespace and endpoint names. - Parameter Guessing: If the payload is not JSON, try
application/x-www-form-urlencodedwith the ID in the body. - Other Endpoints: Check for similar unauthorized access on endpoints related to
settings,export, orlogdeletion within the NotificationX REST namespace.
Grep Commands for Code Audit
If the environment permits, run these to confirm identifiers:
# Find REST route registrations
grep -rn "register_rest_route" wp-content/plugins/notificationx/
# Find the analytics reset callback
grep -rn "reset" wp-content/plugins/notificationx/ | grep "analytics"
# Check the capability used in permission_callback
grep -rn "permission_callback" wp-content/plugins/notificationx/ -A 5
Summary
The NotificationX plugin for WordPress (<= 3.1.11) contains a missing authorization vulnerability in its REST API analytics endpoints. This flaw allows authenticated users with Contributor-level permissions or higher to reset or regenerate performance metrics for any campaign by providing its post ID, leading to unauthorized data loss and disruption of marketing analytics.
Security Fix
@@ -... @@ - 'permission_callback' => function () { - return current_user_can( 'edit_posts' ); - }, + 'permission_callback' => function () { + return current_user_can( 'manage_options' ); + },
Exploit Outline
1. Log in to the WordPress site with an account that has at least Contributor-level privileges. 2. Access the WordPress admin dashboard and extract the 'wp_rest' nonce from the 'wpApiSettings' JavaScript object (usually found in the page source). 3. Identify the post ID of a target NotificationX campaign (custom post type 'nx_notifications'). 4. Issue a POST request to the endpoint '/wp-json/notificationx/v1/analytics/reset' or '/wp-json/notificationx/v1/analytics/regenerate'. 5. Include the 'X-WP-Nonce' header with the extracted nonce and a JSON body containing the target ID (e.g., {'id': 123}). 6. The plugin will execute the reset/regeneration logic for the specified campaign without verifying if the user has administrative permissions.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.