
CVE-2026-16540 — Simply Schedule Appointments < 1.6.12.6 बिना प्रमाणीकरण के अपॉइंटमेंट डेटा का खुलासा और सामूहिक विलोपन
purge एंडपॉइंट के माध्यम से अप्रमाणित अपॉइंटमेंट डेटा खुलासा और सामूहिक विलोपन| फ़ील्ड | विवरण |
|---|---|
| CVE | CVE-2026-16540 |
| प्लगइन | Simply Schedule Appointments |
| प्रभावित संस्करण | < 1.6.12.6 |
| समाधान संस्करण | 1.6.12.6 |
| सक्रिय इंस्टॉल | ~70,000 |
| CVSS 3.1 | 6.5 (मध्यम) — CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:L/A:N |
| CWE | CWE-863 (गलत प्राधिकरण) |
| OWASP | A5: भंग एक्सेस नियंत्रण |
| WPVDB | c3829294-c388-4151-9e25-a3eac7b1f1c6 |
| शोधकर्ता | Suleyman Huseynov (@huseyn0vs__) |
| प्रकटीकरण | 2026-07-22 |
Simply Schedule Appointments में GET /wp-json/ssa/v1/appointments/purge REST एंडपॉइंट एक प्राधिकरण जाँच (get_items_permissions_check) लागू करता है जो एक अपॉइंटमेंट के स्वामित्व को सिद्ध करने वाले id_token को मान्य करती है। हालाँकि, हैंडलर (purge_appointments()) यह पूरी तरह से अनदेखा कर देता है कि टोकन किस अपॉइंटमेंट का है और इसके बजाय दी गई शर्तों से मेल खाने वाले साइट-व्यापी सभी अपॉइंटमेंट पर कार्य करता है।
एक अप्रमाणित हमलावर जो सार्वजनिक बुकिंग फ़ॉर्म के माध्यम से कोई भी एक अपॉइंटमेंट बुक करता है, उसे एक id_token प्राप्त होता है। उस टोकन का उपयोग करके, हमलावर यह कर सकता है:
विलोपन कमिटेड ट्रांज़ैक्शन में 6 आश्रित डेटाबेस तालिकाओं में कैस्केड होता है, और इसमें कोई मूल पूर्ववत (undo) कार्यक्षमता नहीं होती।
फ़ाइल: includes/class-appointment-model.php
अनुमति द्वार और हैंडलर पूरी तरह से अलग-अलग दायरों में कार्य करते हैं:
// Route registration
register_rest_route( $namespace, '/' . $base . '/purge', array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'purge_appointments' ),
'permission_callback' => array( $this, 'get_items_permissions_check' ),
),
) );
अनुमति जाँच — id_token के माध्यम से एक अपॉइंटमेंट के स्वामित्व को मान्य करती है:
public function get_items_permissions_check( $request ) {
// ...
if ( true === $this->id_token_permissions_check( $request ) ) {
return true; // grants access if caller proves ownership of one appointment
}
// ...
}
हैंडलर — टोकन के अपॉइंटमेंट को अनदेखा करता है और साइट-व्यापी रूप से कार्य करता है:
public function purge_appointments( WP_REST_Request $request ) {
$params = $request->get_params();
// No customer_id or appointment_id scoping — deletes ALL matching appointments
if ( isset( $params['purge_past_appointments'] ) && 'true' === $params['purge_past_appointments'] ) {
$conditions[] = $wpdb->prepare( 'end_date < %s', $date_modified_max->format( 'Y-m-d' ) );
}
$sql = 'SELECT * FROM ' . $this->get_table_name()
. ' WHERE ' . implode( ' OR ', $conditions )
. ' ORDER BY id ASC LIMIT 5000';
$list = $wpdb->get_results( $sql, ARRAY_A );
// Cascade-deletes across 6 tables in committed transactions
}
id_token एक HMAC-MD5 है जो एकल अपॉइंटमेंट के id और date_created से व्युत्पन्न होता है। इस टोकन का होना केवल यह सिद्ध करता है कि कॉलर ने एक विशिष्ट अपॉइंटमेंट बुक किया था — यह किसी भी प्रकार का साइट-व्यापी विशेषाधिकार प्रदान नहीं करता।
1. Attacker visits the booking page and books any free appointment
→ receives confirmation email containing: appointment_id + id_token
2. GET /wp-json/ssa/v1/appointments/purge
?id=<appointment_id>
&token=<id_token>
&purge_past_appointments=true
3. Permission check passes (valid token for attacker's own appointment)
4. Handler selects ALL past appointments site-wide → returns PII in response
→ permanently deletes them across 6 tables (on premium editions)
PoC 2026-08-05 को प्रकाशित किया जाएगा समन्वित प्रकटीकरण एम्बार्गो के बाद।
एम्बार्गो तिथि के बाद poc/ निर्देशिका देखें।
| परिदृश्य | परिणाम |
|---|---|
| डेटा खुलासा | सभी ग्राहकों के नाम, ईमेल, फ़ोन नंबर, अपॉइंटमेंट विवरण |
| सामूहिक विलोपन (प्रीमियम) | 6 तालिकाओं में सभी ऐतिहासिक/भविष्य के अपॉइंटमेंट स्थायी रूप से नष्ट |
| कोई पुनर्प्राप्ति मार्ग नहीं | पूर्ण डेटाबेस बैकअप पुनर्स्थापना की आवश्यकता |
| तिथि | घटना |
|---|---|
| 2026-07-10 | भेद्यता की खोज हुई |
| 2026-07-10 | WPScan को प्रस्तुत किया गया |
| 2026-07-22 | CVE-2026-16540 आवंटित |
| 2026-07-22 | WPScan पर सार्वजनिक खुलासा |
| 2026-08-05 | PoC प्रकाशित |