
Nextcloud 35.0.0 — يمكن لمسؤول Users المفوَّض تعديل مسؤول مُرقّى من LDAP عبر PUT بينما يرفض PATCH ذلك بشكل صحيح
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-ldap-put-isadmin
التحليل المكتوب: https://abraxaslabs.tech/research/nextcloud-ldap-put-isadmin
Nextcloud Server 35.0.0 - Nextcloud GmbH
يسمح PUT /cloud/users/{id} لمسؤول Users المفوَّض بتحرير هدف ما، إلا إذا كان ذلك الهدف ضمن المجموعة المحلية admin. أما PATCH على المسار نفسه فيستخدم isAdmin() بشكل صحيح. المسؤولون المرفَّعون عبر LDAP يكون لديهم isAdmin()===true وغالبًا لا يكونون ضمن تلك المجموعة المحلية.
يمكن لجهة فاعلة خبيثة تملك وظيفة Users على نمط مكتب المساعدة أن تعطّل أو تقيّد الحصة أو تحذف مسؤولًا حقيقيًا مرفَّعًا عبر LDAP. واجهة PATCH الأحدث ترفض ذلك بشكل صحيح. أما مسار PUT الأقدم فلا يفعل.
| المعرّف | لا يوجد CVE بعد |
| CWE | CWE-863 |
| CVSS | مرتفع: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (مسؤول Users مفوَّض، وليس مسؤول النسخة) |
| المنتج | Nextcloud Server |
| المتأثر | 35.0.0 (da02f41) صورة nextcloud:35.0.0-apache الرسمية مع user_ldap |
| المصادقة | مسؤول Users مفوَّض مقابل مسؤول مرفَّع عبر LDAP |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
في موقع يعتمد على LDAP، قمت بترقية مجموعة LDAP إلى مسؤول نسخة (occ ldap:promote-group). هؤلاء الأشخاص مسؤولون حقيقيون (isAdmin()===true) لكنهم قد لا يكونون ضمن مجموعة Nextcloud المحلية المسماة admin.
كما منحت شخصًا ما وظيفة إعدادات Users (مكتب المساعدة). وهو ليس مسؤول نسخة كاملًا.
يمكن لمستخدم مكتب المساعدة هذا أن:
isInGroup في التفعيل/التعطيل/الحذف/المحو)canChangePassword() (غالبًا false؛ لا تعتمد عليه)لا يمكنهم فعل ذلك بشخص موجود فعليًا في المجموعة المحلية admin. ولا يمكنهم فعل ذلك في موقع لا يحتوي على مسؤولين مرفَّعين عبر LDAP. واجهة PATCH الأكثر أمانًا تعرف الفرق بالفعل.
في عملية التزويد يوجد محرران للمستخدم نفسه. UsersController::editUser هو PUT. وeditUserMultiField هو PATCH. الملف نفسه. الدالتان متجاورتان. إجابتان مختلفتان عن سؤال "هل هذا الشخص مسؤول."
يتحقق PUT من isInGroup($target, 'admin'). ويتحقق PATCH من isAdmin($target). تسأل Manager::isAdmin() واجهة LDAP IIsAdmin ثم المجموعة المحلية. ويجعل occ ldap:promote-group مجموعة LDAP مسؤولة نسخة دون وضع تلك المعرّفات (uids) في المجموعة المحلية admin.
قمت بتشغيل صورة nextcloud:35.0.0-apache الرسمية مع osixia/openldap:1.5.0. مستخدم LDAP ldapadmin في المجموعة المرفَّعة ncadmins: isAdmin()===true، وليس في المجموعة المحلية admin. أما helpdesk المحلي فهو Users مفوَّض، وليس مسؤول نسخة.
أرسلت PATCH أولًا. فهو المسار الأحدث. توقعت أن يطابقه PUT. أعاد PATCH {"quota":"1 GB"} الرمز 403. وأعاد PUT key=quota&value=1 GB الرمز 200. ثم أظهر GET الحصة 1073741824.
cd lab
./run.sh
استهدف فقط http://127.0.0.1:18342 (OpenLDAP على DNS الخاص بـ compose ldap:389).
SUCCESS NEXTCLOUD-LDAP-PUT-ISADMIN who=delegated-users-admin target=ldapadmin put=200 patch=403 NEXTCLOUD-LDAP-PUT-ISADMIN-WITNESS
استخدم isAdmin($target) في PUT/disable/delete/wipe بالطريقة نفسها التي يستخدمها PATCH بالفعل.
occ ldap:promote-group (PR #41650)GNU Affero GPL v3.0. راجع LICENSE. مختبر loopback فقط. دون أي ضمان.