EmailKit – Email Customizer for WooCommerce & WP <= 1.6.2 - Missing Authorization to Authenticated (Subscriber+) Arbitrary Post Title Modification
Description
The EmailKit – Email Customizer for WooCommerce & WP plugin for WordPress is vulnerable to unauthorized data modification due to a missing capability check on the 'update_template_data' function in all versions up to, and including, 1.6.2. This makes it possible for authenticated attackers, with Subscriber-level access and above, to modify the title of any post on the site, including posts, pages, and custom post types.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=1.6.2Source Code
WordPress.org SVN# Vulnerability Analysis: CVE-2026-1925 (EmailKit – Email Customizer for WooCommerce & WP) ## 1. Vulnerability Summary The **EmailKit – Email Customizer for WooCommerce & WP** plugin (versions <= 1.6.2) is vulnerable to **unauthorized data modification** due to a missing authorization check in the …
Show full research plan
Vulnerability Analysis: CVE-2026-1925 (EmailKit – Email Customizer for WooCommerce & WP)
1. Vulnerability Summary
The EmailKit – Email Customizer for WooCommerce & WP plugin (versions <= 1.6.2) is vulnerable to unauthorized data modification due to a missing authorization check in the update_template_data function. While the function likely verifies a WordPress nonce to prevent CSRF, it fails to verify if the authenticated user has the necessary capabilities (e.g., manage_options or edit_posts) to modify post data. This allows any authenticated user, including those with Subscriber privileges, to change the title of any post, page, or custom post type on the site by providing its ID.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action:
emailkit_update_template_data(inferred prefix based on plugin slug) orupdate_template_data. - Vulnerable Parameter:
post_id(the ID of the target post) andtitle(the new title). - Authentication: Subscriber level or higher is required.
- Preconditions: A valid nonce for the
update_template_dataaction must be obtained.
3. Code Flow (Inferred)
- Entry Point: An authenticated user sends a POST request to
admin-ajax.phpwith the actionemailkit_update_template_data. - Hook Registration: The plugin registers the action via:
add_action('wp_ajax_emailkit_update_template_data', array($this, 'update_template_data')); - Vulnerable Function: The
update_template_datafunction is called. - Missing Check: The function likely calls
check_ajax_referer('emailkit_nonce', 'security')but fails to callcurrent_user_can('manage_options'). - Sink: The function retrieves
post_idandtitlefrom the$_POSTarray and callswp_update_post(array('ID' => $post_id, 'post_title' => $title)). - Impact: The title of the specified
post_idis updated in the database regardless of the user's permissions.
4. Nonce Acquisition Strategy
To exploit this as a Subscriber, we must find where the plugin exposes the nonce.
- Login as Subscriber: Authenticate as a low-privileged user.
- Locate Nonce: The plugin likely uses
wp_localize_scriptto pass a nonce to its template editor. Even if a Subscriber cannot access the EmailKit dashboard menu, the script might be enqueued on all admin pages (common in many plugins) or the nonce might be accessible on the frontend if EmailKit components are used. - Check Admin Pages: Navigate to
/wp-admin/profile.php. - Browser Evaluation: Use the
browser_evaltool to check for common EmailKit global objects.- Inferred JS Variable:
window.emailkit_config?.nonceorwindow.emailkit_obj?.security. - Action String: Likely
emailkit_nonceoremailkit-customizer-nonce.
- Inferred JS Variable:
5. Exploitation Strategy
Step 1: Setup
- Identify a target post ID (e.g., Post ID 1, usually "Hello world!").
- Create a Subscriber user account.
Step 2: Nonce Extraction
- Log in to the WordPress dashboard as the Subscriber.
- Navigate to
/wp-admin/profile.php. - Execute JS to find the nonce:
// Search for any object containing "nonce" or "security" related to emailkit Object.keys(window).filter(key => key.toLowerCase().includes('emailkit')) - Capture the value (e.g.,
emailkit_obj.nonce).
Step 3: Send Exploit Request
Use the http_request tool to send the unauthorized update request.
- Method:
POST - URL:
http://[TARGET]/wp-admin/admin-ajax.php - Headers:
Content-Type: application/x-www-form-urlencoded - Body Parameters:
action:emailkit_update_template_data(verify via grep)security:[EXTRACTED_NONCE]post_id:1(Target Post ID)title:VULNERABLE-TITLE-MODIFIED
Step 4: Verification
- Check if the post title has changed using WP-CLI.
6. Test Data Setup
- Target Post: Ensure a post exists with ID 1.
wp post create --post_title="Original Admin Post" --post_status=publish
- Attacker User: Create a Subscriber user.
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
- Plugin Activation: Ensure
emailkitis active.
7. Expected Results
- Response: The server should return a JSON success response, e.g.,
{"success":true}or1. - Database State: The
post_titlecolumn in thewp_poststable for the target ID should reflect the new title.
8. Verification Steps
- Check Title via WP-CLI:
If the output iswp post get 1 --field=post_titleVULNERABLE-TITLE-MODIFIED, the exploit is successful. - Check via UI:
Navigate to the site's homepage or the specific post URL to see the modified title.
9. Alternative Approaches
- Parameter Names: If
post_idortitledoesn't work, tryid,template_id,name, ortemplate_name(as the function name mentions "template_data"). - REST API: Check if the plugin registers a REST route
emailkit/v1/update-templatewhich might share the same vulnerable logic. - Action Name: If
emailkit_update_template_datais incorrect, grep the plugin directory:grep -rn "wp_ajax_" wp-content/plugins/emailkit/ | grep "update_template_data" - Nonce Check Bypass: If
check_ajax_refereris used with the third parameter set tofalse, the nonce check might be entirely skippable if the result isn't validated.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.