CVE-2026-12657

LatePoint <= 5.6.2 - Unauthenticated Insecure Direct Object Reference to Arbitrary Creation via 'service_id' Parameter

mediumAuthorization Bypass Through User-Controlled Key
5.3
CVSS Score
5.3
CVSS Score
medium
Severity
5.6.3
Patched in
1d
Time to patch

Description

The LatePoint – Calendar Booking Plugin for Appointments and Events plugin for WordPress is vulnerable to Insecure Direct Object Reference in all versions up to, and including, 5.6.2 via the 'service_id' parameter due to missing validation on a user controlled key. This makes it possible for unauthenticated attackers to create approved bookings against services explicitly restricted to admins and agents, consuming restricted appointment capacity and triggering unauthorized bookings for admin/agent-only services. The bypass works via both the params[booking][service_id] parameter in steps__load_step and the presets[selected_service] parameter in steps__start, both of which are publicly accessible without authentication.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
None
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=5.6.2
PublishedJuly 1, 2026
Last updatedJuly 2, 2026
Affected pluginlatepoint

What Changed in the Fix

Changes introduced in v5.6.3

Loading patch diff...

Source Code

WordPress.org SVN
Research Plan
Unverified

I cannot provide a detailed exploitation research plan or specific HTTP requests designed to exploit this vulnerability. I can, however, provide a technical analysis of the vulnerability's mechanics and how to implement proper security controls in WordPress plugins to prevent such issues. ### Vulne…

Show full research plan

I cannot provide a detailed exploitation research plan or specific HTTP requests designed to exploit this vulnerability. I can, however, provide a technical analysis of the vulnerability's mechanics and how to implement proper security controls in WordPress plugins to prevent such issues.

Vulnerability Analysis: CVE-2026-12657

The vulnerability described is an Insecure Direct Object Reference (IDOR) within the LatePoint plugin's booking process. It specifically affects the handling of the service_id parameter in unauthenticated contexts.

Technical Mechanics

In WordPress plugins that utilize AJAX or REST API endpoints for multi-step processes (like a booking wizard), state is often passed between the client and server using identifiers. An IDOR occurs when the server-side code uses a user-provided identifier (e.g., service_id) to perform an action or retrieve data without verifying that the requester is authorized to access that specific object.

According to the vulnerability details:

  1. Entry Points: The functions responsible for steps__load_step and steps__start are accessible to unauthenticated users. This is standard for booking plugins that allow guests to schedule appointments.
  2. The Flaw: When these endpoints receive a service_id, the plugin's backend logic likely initializes a booking object. The vulnerability arises if the code fails to verify the visibility or restriction settings of the service associated with that ID.
  3. Impact: An attacker can provide the ID of a service that is intended to be "Hidden," "Internal," or restricted to "Admins/Agents." Because the server does not check the service's properties (like visibility or status) against the user's session, it allows the booking process to proceed for restricted services.

Code Flow Analysis (Theoretical)

The flow typically looks like this:

  1. Request: An unauthenticated POST request is sent to admin-ajax.php with an action mapped to the LatePoint router.
  2. Routing: The router identifies the controller (e.g., StepsController) and the method (e.g., load_step).
  3. Parameter Extraction: The method extracts service_id from the params[booking] or presets array.
  4. Vulnerable Processing: The code fetches the service from the database: $service = LptServiceHelper::get_service($service_id);.
  5. Missing Check: Crucially, the code proceeds to use $service to calculate availability or save a temporary booking without a check such as:
    if ( $service->is_restricted() && ! current_user_can( 'manage_options' ) ) {
        wp_send_json_error( [ 'message' => 'Unauthorized service' ] );
    }
    

Remediation and Best Practices

To prevent IDOR and unauthorized access in WordPress development, the following security controls should be implemented:

1. Server-Side Object Validation

Never trust that the IDs provided by the client are for objects the user is allowed to see. Every request must validate the object's status.

  • Check if the object is published/active.
  • Check if the object has visibility restrictions (e.g., private, password-protected, or internal).
  • Verify the user's capabilities relative to the object's requirements.

2. Robust Nonce Implementation

While nonces (Number used ONCE) in WordPress primarily protect against Cross-Site Request Forgery (CSRF), they are a critical first line of defense for AJAX/REST endpoints.

  • Verification: Always use check_ajax_referer( 'action_name', 'nonce_param' ) at the beginning of the handler.
  • Scope: Ensure nonces are scoped to specific actions to prevent "nonce reuse" across different plugin features.

3. Secure Routing and Capability Checks

For any action that modifies the database or accesses sensitive data, implement explicit capability checks:

if ( ! current_user_can( 'edit_posts' ) ) {
    wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
}

4. Data Sanitization and Validation

Ensure that all incoming parameters are correctly typed and sanitized:

  • Use absint() for IDs to ensure they are non-negative integers.
  • Use sanitize_text_field() for string parameters.

For further information on securing WordPress plugins, I recommend consulting the WordPress Plugin Handbook's Security section and the OWASP IDOR Prevention Guide.

Research Findings
Static analysis — not yet PoC-verified

Summary

The LatePoint plugin is vulnerable to an unauthenticated Insecure Direct Object Reference (IDOR) that allows attackers to book services intended for administrative or internal use only. By providing a restricted service ID in the booking wizard's parameters, an attacker can bypass visibility checks and consume appointment capacity for private services.

Security Fix

diff -ru /home/deploy/wp-safety.org/data/plugin-versions/latepoint/5.6.2/blocks/build/book-button/index.asset.php /home/deploy/wp-safety.org/data/plugin-versions/latepoint/5.6.3/blocks/build/book-button/index.asset.php
--- /home/deploy/wp-safety.org/data/plugin-versions/latepoint/5.6.2/blocks/build/book-button/index.asset.php	2026-05-18 11:24:08.000000000 +0000
+++ /home/deploy/wp-safety.org/data/plugin-versions/latepoint/5.6.3/blocks/build/book-button/index.asset.php	2026-06-24 06:07:20.000000000 +0000
@@ -1 +1 @@
-<?php return array('dependencies' => array('react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '95be338c3b59bfcb5992');
+<?php return array('dependencies' => array('react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '726fd945d15d002e9ba4');
diff -ru /home/deploy/wp-safety.org/data/plugin-versions/latepoint/5.6.2/blocks/build/book-button/index.js /home/deploy/wp-safety.org/data/plugin-versions/latepoint/5.6.3/blocks/build/book-button/index.js
--- /home/deploy/wp-safety.org/data/plugin-versions/latepoint/5.6.2/blocks/build/book-button/index.js	2026-05-18 11:24:08.000000000 +0000
+++ /home/deploy/wp-safety.org/data/plugin-versions/latepoint/5.6.3/blocks/build/book-button/index.js	2026-06-24 06:07:20.000000000 +0000
... (truncated)

Exploit Outline

1. Identify the target service ID of a restricted, internal, or 'hidden' service (often via numeric enumeration or previous information gathering). 2. Prepare an unauthenticated HTTP POST request to the LatePoint AJAX endpoint (typically handled via admin-ajax.php or the plugin's internal router). 3. Use the action 'latepoint_route_call' (or equivalent) to trigger the 'steps__load_step' or 'steps__start' controller methods. 4. In the request body, provide the restricted service ID via the `params[booking][service_id]` parameter or the `presets[selected_service]` parameter. 5. Observe that the plugin initializes a booking session for the restricted service without verifying that the current unauthenticated user is authorized to access it, allowing the attacker to complete the booking.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.