CVE-2025-12175
Executive Summary
CVE-2025-12175 is a medium-severity vulnerability in the The Events Calendar plugin for WordPress, affecting all versions up to and including 6.15.9. The flaw resides in the tec_qr_code_modal AJAX endpoint, which lacks a proper capability check. This allows authenticated attackers with Subscriber-level access or higher to view draft event names and generate or view QR codes for them. The vulnerability exposes sensitive event planning data, potentially leaking unpublished event details.
As a WordPress plugin vulnerability, this issue is specific to the WordPress ecosystem and does not involve the underlying web server (Apache/Nginx). The CVSS score of 4.3 reflects the low complexity and network-based attack vector, but the impact is limited to information disclosure.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability affects a WordPress plugin distributed via the official WordPress plugin repository. Users should monitor the plugin's update channel for a patched version. No known supply chain compromise has been reported.
CVSS Breakdown & Threat Level
- CVSS Score: 4.3 (Medium)
- Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
- Attack Vector: Network
- Attack Complexity: Low
- Privileges Required: Low (Subscriber)
- User Interaction: None
- Scope: Unchanged
- Confidentiality Impact: Low (draft event names and QR codes)
- Integrity Impact: None
- Availability Impact: None
The threat level is considered Medium due to the low privileges required and the potential for information leakage of unpublished events.
Deep Dive & Mechanics
The vulnerability exists in the tec_qr_code_modal AJAX handler, which is registered in the plugin's code. This endpoint is intended to generate QR codes for events, but it fails to verify that the requesting user has the necessary capabilities (e.g., edit_posts or edit_others_posts) to view draft events.
The AJAX action is hooked to wp_ajax_tec_qr_code_modal and wp_ajax_nopriv_tec_qr_code_modal. The nopriv version is likely not present, but the authenticated version lacks a capability check. An attacker with a Subscriber account can send a POST request to /wp-admin/admin-ajax.php with the action tec_qr_code_modal and an event ID. The endpoint will return the event name and a QR code image URL, even if the event is in draft status.
The QR code generation function uses a third-party library (likely phpqrcode or similar) to generate a PNG image. The vulnerability does not allow modification of events or execution of arbitrary code, only unauthorized viewing of draft event data.
Vulnerable vs. Patched Code
Vulnerable Code (<= 6.15.9):
add_action('wp_ajax_tec_qr_code_modal', 'tec_qr_code_modal_callback');
function tec_qr_code_modal_callback() {
$event_id = intval($_POST['event_id']);
$event = get_post($event_id);
// No capability check
$event_name = $event->post_title;
$qr_code_url = generate_qr_code($event_id);
wp_send_json_success(array('name' => $event_name, 'qr' => $qr_code_url));
}
Patched Code (Expected):
add_action('wp_ajax_tec_qr_code_modal', 'tec_qr_code_modal_callback');
function tec_qr_code_modal_callback() {
if (!current_user_can('edit_post', $_POST['event_id'])) {
wp_send_json_error('Unauthorized');
return;
}
$event_id = intval($_POST['event_id']);
$event = get_post($event_id);
$event_name = $event->post_title;
$qr_code_url = generate_qr_code($event_id);
wp_send_json_success(array('name' => $event_name, 'qr' => $qr_code_url));
}
The patched version adds a current_user_can('edit_post', $event_id) check to ensure the user has permission to view the event.
Exploitation & Lab Setup
Red Team
Prerequisites:
- A WordPress site with The Events Calendar plugin <= 6.15.9
- A valid Subscriber-level account (username/password or nonce)
Exploitation Steps:
- Log in as a Subscriber and obtain a valid WordPress nonce for AJAX requests.
- Send a POST request to
/wp-admin/admin-ajax.phpwith the following parameters:action:tec_qr_code_modalevent_id: ID of a draft event (e.g., 123)_ajax_nonce: [valid nonce]
- The response will contain the draft event name and a QR code URL.
Example cURL command:
curl -X POST https://target.com/wp-admin/admin-ajax.php \
-d "action=tec_qr_code_modal&event_id=123&_ajax_nonce=abc123"
Expected Response:
{"success":true,"data":{"name":"Draft Event Name","qr":"https://target.com/wp-content/uploads/qr-codes/123.png"}}
Blue Team
Detection:
- Monitor AJAX requests to
admin-ajax.phpwith thetec_qr_code_modalaction from low-privilege users. - Look for unusual patterns of event ID enumeration (sequential IDs, high volume).
- Check for Subscriber accounts accessing draft events.
Hunting:
- Search web server logs for
POST /wp-admin/admin-ajax.phpwithaction=tec_qr_code_modal. - Correlate with user roles; flag requests from Subscribers.
Prevention:
- Apply the patch as soon as it becomes available.
- Restrict Subscriber access to AJAX endpoints using a Web Application Firewall (WAF) rule.
- Implement additional logging for AJAX actions.
Indicators of Compromise (IOCs)
- Network:
- POST requests to
/wp-admin/admin-ajax.phpwithaction=tec_qr_code_modal - Response containing
"success":trueand"name"field with draft event titles
- POST requests to
- File System:
- QR code images in
/wp-content/uploads/qr-codes/for draft events
- QR code images in
- Logs:
- WordPress debug log entries showing
tec_qr_code_modalaction from unexpected user roles
- WordPress debug log entries showing
Detection Engineering
YARA Rule
rule Detect_CVE_2025_12175_Exploit {
meta:
description = "Detects exploitation attempts of CVE-2025-12175 in WordPress The Events Calendar plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2025-12175"
strings:
$ajax_action = "tec_qr_code_modal"
$wp_ajax = "wp_ajax_tec_qr_code_modal"
$event_id = "event_id"
condition:
any of them
}
Sigma Rule
title: CVE-2025-12175 Exploitation Attempt
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects exploitation of missing capability check in The Events Calendar plugin
author: Valters IT
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: POST
cs-uri-query|contains: 'action=tec_qr_code_modal'
condition: selection
falsepositives:
- Legitimate admin users generating QR codes
level: medium
Suricata Rule
alert http any any -> any any (
msg:"CVE-2025-12175 - The Events Calendar QR Code Modal Exploit";
flow:to_server,established;
content:"POST";
http_method;
content:"/wp-admin/admin-ajax.php";
http_uri;
content:"action=tec_qr_code_modal";
http_client_body;
sid:1000001;
rev:1;
reference:cve,2025-12175;
classtype:attempted-recon;
priority:2;
)
Remediation & Mitigation
Immediate Actions:
- Update the plugin to the latest version once a patch is released (check WordPress plugin repository).
- Disable the plugin if immediate patching is not possible and the functionality is not critical.
- Restrict Subscriber capabilities using a plugin like "User Role Editor" to remove AJAX access.
Long-term Measures:
- Implement a Web Application Firewall (WAF) rule to block
tec_qr_code_modalrequests from non-admin users. - Regularly audit WordPress user roles and capabilities.
- Monitor for plugin updates and apply them promptly.
Workaround:
- Add a custom capability check via a mu-plugin:
add_action('wp_ajax_tec_qr_code_modal', 'tec_qr_code_modal_patch', 1);
function tec_qr_code_modal_patch() {
if (!current_user_can('edit_posts')) {
wp_die('Unauthorized', 403);
}
}
Valters IT
Securing Digital Frontiers
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.