CVE-2026-14326
CVE-2026-14326 — Threat Intelligence Report
Executive Summary
CVE-2026-14326 is an Insecure Direct Object Reference (IDOR) vulnerability — classified under CWE-639 (Authorization Bypass Through User-Controlled Key) — affecting the Timetics WordPress plugin, version 1.0.61 and earlier. The plugin's REST API fails to enforce per-object ownership when appointment records are updated, which permits any user possessing the plugin's custom "staff" role to modify, disable, or reassign (take over) appointments that belong to other staff members.
The vulnerability is remotely exploitable over the network but requires low-privilege authenticated access (CVSS 3.8, High privilege required). As of this report's publication, there is no known patch, no public proof-of-concept exploit, and no evidence of exploitation in the wild. The plugin remains unpatched, putting any WordPress site that uses Timetics with multiple staff accounts at risk of internal data manipulation and scheduling disruption.
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
Technical Analysis
Vulnerability Class — Insecure Direct Object Reference (IDOR) / Missing Object-Level Authorization
The root cause of CVE-2026-14326 falls within CWE-639: the application relies on client-supplied identifiers to reference backend objects — in this case, appointment records — without verifying that the authenticated user is authorized to access or modify the specific object they are targeting.
Affected Component — REST API Appointment Update Endpoint
The Timetics plugin exposes a REST API surface for managing appointments. The vulnerability lies specifically in the appointment update operation. When an authenticated user with the custom "staff" role submits a request to update an appointment, the plugin fails to verify that the appointment's owner (the staff member to whom the appointment is assigned) matches the currently authenticated user.
Attack Surface
The attack surface is limited to WordPress installations running the Timetics plugin through version 1.0.61 that have at least two distinct staff accounts. The vulnerability is reachable via unauthenticated network access to the WordPress REST API — though exploitation itself requires a valid staff-level account, making the attack authenticated.
Technical Detail Constraints
The NVD description and CNA data do not specify the exact REST API route (e.g., /wp-json/timetics/v1/appointments/{id}), the request parameter containing the appointment identifier, or the server-side validation logic that is missing. Consequently, the precise implementation details of the flaw are not available in the provided intelligence data. The mechanism described below is inferred from the vulnerability class and the behavior described in the NVD entry.
Mechanism (Class-Level Inference)
- Timetics assigns each appointment to a specific staff member, storing this association server-side (likely via a foreign key on a custom post type or a custom database table).
- The REST API update endpoint accepts an appointment identifier from the client.
- When a staff user submits an update request, the plugin validates that the caller is a valid user of the "staff" role (role-based authorization) but does not validate that the appointment fetched by the supplied ID belongs to that same user (object-level authorization).
- This missing check allows a staff member to supply any valid appointment ID and modify its contents — redirecting bookings, altering time slots, changing attendee information, or reassigning the appointment to their own calendar.
The NVD description confirms the practical consequences of this flaw: users with the custom staff role can "modify, disable, or take over appointments belonging to other staff members."
Exploitation Scenarios
No public proof-of-concept or exploit code is available for this CVE. The attack chain outlined below is inferred from the vulnerability class (IDOR) and the behavioral description provided in the NVD entry.
Preconditions:
- Target WordPress site runs Timetics through version 1.0.61.
- Attacker holds an account assigned the plugin's custom "staff" role.
- The site uses multiple staff accounts with appointments, so that at least one other staff member has bookings in the system.
Attack Chain Steps:
Reconnaissance / Target Identification: The attacker enumerates manageable WordPress sites running Timetics. They discover the plugin version (e.g., via
readme.txtor version-listed assets). They confirm that the site has >1 staff accounts (e.g., by inspecting the public booking page that lists available staff members). The attacker authenticates to the WordPress admin or uses a valid staff API credential.Endpoint Discovery: The attacker maps the Timetics REST API namespace (e.g., by requesting
GET /wp-json/and examining registered routes). They identify the appointment update endpoint and the expected HTTP method (typicallyPOSTorPUT).Triggering the IDOR Flaw: The attacker issues an authenticated update request against an appointment ID that belongs to a colleague. Because the server does not check whether the appointment's owner matches the authenticated caller, the request is accepted. The attacker modifies appointment attributes (e.g., start time, assigned staff, status, attendee email) to suit their purpose.
Post-Exploitation Impact: The attacker can (a) disable appointments by flipping status flags to "cancelled" or "unavailable," (b) modify appointment data to corrupt scheduling, or (c) take over appointments by changing the assigned staff ID to their own account, accumulating bookings and confusing customers.
Realistic Attack Vectors:
- Scheduling sabotage: Staff A disables all of Staff B's appointments, causing missed customer engagements and loss of revenue.
- Data theft / privacy: By taking over an appointment, Staff A gains access to customer-provided details (names, contact info, meeting notes) that were shared only with Staff B.
- Business disruption: A disgruntled or compromised staff account can systematically disrupt the entire booking calendar.
Impact Assessment
CVSS Rationale (Score: 3.8 / Base Vector: AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:L/A:L):
- Attack Vector: Network (N) — The REST API is remotely reachable.
- Attack Complexity: Low (L) — No special conditions; standard HTTP request.
- Privileges Required: High (H) — Requires a valid staff-level account (not just subscriber/user).
- User Interaction: None (N) — No victim interaction required.
- Scope: Unchanged (U) — The impact is confined to the vulnerable component.
- Confidentiality Impact: None (N) — The description does not indicate direct data exfiltration, though taking over appointments could expose metadata indirectly.
- Integrity Impact: Low (L) — Attackers can modify appointment records, but only within the scope of the plugin's data model.
- Availability Impact: Low (L) — Disabling appointments degrades schedule availability for other staff.
Business Impact:
This vulnerability has a moderate and insider-orientated impact. The most significant risks are:
- Operational Integrity: A malicious or compromised staff member can corrupt the booking calendar, leading to missed appointments, double-bookings, and customer dissatisfaction.
- Data Privacy: Appointment records often contain Personally Identifiable Information (PII) such as customer names, phone numbers, email addresses, and consultation notes. Although the CVSS scores Confidentiality as None (likely because the attacker can only modify rather than bulk-export records), gaining visibility into another staff member's appointment details is a plausible side effect of modifying or taking over said records.
- Reputational Damage: Medium, if scheduling chaos leads to public customer complaints.
Affected Systems & Blast Radius:
The blast radius is confined to a single WordPress instance running the plugin. It does not spread to adjacent servers. However, the potential for sustained, low-noise calendar manipulation makes this a persistent backdoor for insider sabotage — and if a staff account is later compromised by an external actor, the IDOR amplifies that account's reach.
Detection Guidance
Sigma Rule
title: Timetics WordPress Plugin - Appointment Ownership Bypass Attempt
id: 818f0c1c-9a17-4b3e-9f4e-5d6e78a1c2d3
status: experimental
description: Detects REST API requests targeting Timetics appointment update endpoints where the authenticated user does not match the appointment owner. Legitimate staff should only modify their own appointments.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-14326
author: Valters IT Threat Intelligence
date: 2026/02/10
logsource:
category: application
product: wordpress
detection:
selection_action:
http.response.body|contains: "timetics"
http.request.method: ("POST", "PUT", "PATCH")
selection_endpoint:
http.url|contains|all:
- "/wp-json/"
- "timetics"
- "appointment"
selection_idor_pattern:
http.url|contains:
- "appointment_id="
- "/appointments/"
filter_same_user:
http.url|contains: "staff_id=" # Requires correlation with session user if provided in URL
condition: selection_action and selection_endpoint and selection_idor_pattern and not filter_same_user
level: medium
falsepositives:
- Administrative staff managing appointments centrally may legitimately update other staff members' appointments.
- Unknown, no patch version yet available.
tags:
- attack.t1190
- cve.2026-14326
- cwe.639
YARA Rule
rule CVE_2026_14326_Timetics_IDOR_Suspicious_Request
{
meta:
author = "Valters IT Threat Intelligence"
description = "Detects HTTP payloads or log entries containing URL patterns indicative of attempts to exploit the Timetics IDOR vulnerability (CVE-2026-14326)."
date = "2026-02-10"
reference = "https://nvd.nist.gov/vuln/detail/CVE-2026-14326"
cve = "CVE-2026-14326"
cwe = "CWE-639"
severity = "medium"
strings:
$timetics_path = "/rest/v1/appointment" nocase
$timetics_alt = "/wp-json/timetics" nocase
$appointment_id = "appointment_id=" nocase
$update_method = "method=update" nocase
$staff_param = "staff_id=" nocase
condition:
// Match on a URL that references the timetics appointment endpoint
// AND contains an appointment ID parameter, which is the IDOR target.
(uint16(0) == 0x4854 or uint16(0) == 0x5047) and // "HT" or "GP" for HTTP GET/POST etc.
any of ($timetics_path, $timetics_alt) and
any of ($appointment_id) and (any of ($update_method) or #appointment_id > 0)
}
Suricata IDS Rule
alert http any any -> $HOME_NET any (
msg:"CVE-2026-14326 - Timetics WordPress IDOR Appointment Update Attempt";
flow:established,to_server;
http.method; content:"POST"; http.method; content:"PUT"; http.method; content:"PATCH";
http.uri; content:"/wp-json/"; nocase;
http.uri; content:"timetics"; nocase;
http.uri; content:"appointment"; nocase;
http.uri; content:"id="; nocase;
classtype:attempted-admin;
sid:202614326;
rev:1;
severity:2;
metadata: created_at 2026_02_10, cve CVE-2026-14326, cwe CWE-639;
)
Elastic Detection
Elastic EQL query to find requests to the Timetics appointment API that include a numeric ID and a body modifying the assignment, filtered to exclude common administrative source IPs (adjust as needed):
sequence by source.ip
[ network where
network.protocol == "http" and
http.request.method in ("POST", "PUT", "PATCH") and
url.path like "*/wp-json/*timetics*appointment*" and
url.path like "*id=*"
]
For a more targeted hunt on web server access logs indexed in Elasticsearch, use a Lucene query:
http.request.method:("POST" OR "PUT" OR "PATCH")
AND http.request.uri:*/*wp-json*/*timetics*appointment*
AND http.request.uri:*id=*
Splunk SPL Query
index=web sourcetype=access_combined
| where match(uri, "(?i)/wp-json/.*timetics.*appointment") AND match(uri, "(?i)(id=|appointment_id)") AND method IN ("POST", "PUT", "PATCH")
| rex field=uri "appointment(?:s)?/(?<appt_id>[0-9]+)"
| rex field=uri "staff[_-]?id=(?<staff_param>[0-9]+)"
| eval is_idor = if(jsess_user != staff_param, "SUSPICIOUS", "CHECK")
| stats count by src_ip, uri, appt_id, staff_param, is_idor
| where is_idor = "SUSPICIOUS"
Wazuh OSSEC Rule
<group name="wordpress, timetics, cve-2026-14326,">
<rule id="100326" level="10">
<decoded_as>json</decoded_as>
<field name="url">\./wp-json/.</field>
<regex>timetics</regex>
<regex>appointment</regex>
<description>Timetics WordPress appointment update request observed — potential IDOR attempt per CVE-2026-14326</description>
<group>idor,attack,</group>
<mitre>
<id>T1190</id>
</mitre>
</rule>
</group>
Mitigation & Patch Guidance
Patch Confidence: 0/4 — UNPATCHED.
The vendor (Timetics) has not released a version that fixes this issue. The affected version range is "through 1.0.61". There is no vendor advisory, no patch commit, and no security update currently available.
Immediate Mitigations (No Vendor Patch Available):
- Restrict Staff Role Usage: Minimize the number of accounts that are assigned the custom "staff" role. Only grant this role to trusted, internal users.
- Application-Level Firewall (WAF) Rules: Deploy a WAF (e.g., Cloudflare, AWS WAF, Wordfence) in front of the WordPress REST API. Create a rule that blocks or flags
POST/PUT/PATCHrequests to URI paths matching/wp-json/*timetics*appointment*when they originate from non-admin IP ranges or when they include anidparameter that doesn't match the authenticated user's profile — though the latter may be difficult to implement reliably. - Disable REST API for Non-Admins (Temporary): If the Timetics plugin does not strictly require the REST API for front-end bookings, block all REST API calls from users who are not logged in as administrators. This can be done via a code snippet or a plugin like "Disable REST API" but only if it does not break the booking flow. Validate in a staging environment first.
- Monitor Appointment Logs: Enable the WordPress activity log plugin to record all changes to appointment custom post types. Correlate any write operations that originate from a staff account onto an appointment that does not belong to that account.
Patch / Upgrade Steps:
- There is currently no fixed version. Monitor the WordPress Plugin Directory page for Timetics for updates. When a version > 1.0.61 is released, review the changelog for "security fix" concerning object ownership / authorization. Upgrade immediately.
Long-Term Hardening:
- Enforce Object-Level Authorization: The vendor must add ownership checks server-side on the update endpoint — comparing the authenticated user's ID (or the associated "staff" profile ID) against the
post_author(or equivalent key) of the appointment object returned by the supplied ID. Any mismatch must return HTTP 403. - Supplement with WordPress nonces: Ensure all REST API requests are validated against a per-user nonce that is tied to the appointment being accessed.
- Regular Audits: Use a WordPress security scanner (e.g., WPScan) during each plugin update cycle to check for newly disclosed CVEs in Timetics.
References
- NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2026-14326
- CWE-639 (Authorization Bypass Through User-Controlled Key): https://cwe.mitre.org/data/definitions/639.html
- WordPress Plugin Directory — Timetics: https://wordpress.org/plugins/timetics/ (Monitor for future updates/security announcements)
- MITRE ATT&CK — T1190 (Exploit Public-Facing Application): https://attack.mitre.org/techniques/T1190/
Threat Actor Activity: No threat actor campaigns, exploit-in-the-wild evidence, or public proof-of-concept code currently exist for this CVE. The vulnerability is not listed on the CISA Known Exploited Vulnerabilities (KEV) catalog as of the report date. Its technical simplicity (direct IDOR) suggests it could be targeted by opportunistic actors if the plugin gains broader adoption — but as of now, no such activity has been observed. Continued monitoring via the NVD and WordPress security mailing lists is advised.