
Nextcloud 35.0.0 — يمكن لمسؤول Users المفوَّض تعديل مسؤول مُرقّى من LDAP عبر PUT بينما يرفض PATCH ذلك بشكل صحيح
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 الأقدم فلا يفعل.
| ID | لا يوجد CVE بعد |
| CWE | CWE-863 |
| CVSS | High: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (مسؤول Users مفوَّض، وليس مسؤول النسخة) |
| Product | Nextcloud Server |
| Affected | 35.0.0 (da02f41) النسخة الرسمية nextcloud:35.0.0-apache مع user_ldap |
| Auth | مسؤول Users مفوَّض مقابل مسؤول مرقّى عبر LDAP |
| License | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 فقط |
في موقع LDAP، قمت بترقية مجموعة LDAP إلى مسؤول النسخة (occ ldap:promote-group). هؤلاء الأشخاص مسؤولون حقيقيون (isAdmin()===true) لكنهم قد لا يكونون ضمن مجموعة Nextcloud المحلية المسماة admin.
كما منحت شخصًا ما وظيفة إعدادات Users (مكتب المساعدة). وهو ليس مسؤول نسخة كاملًا.
يمكن لمستخدم مكتب المساعدة هذا أن:
isInGroup على enable/disable/delete/wipe)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 مسؤولة النسخة دون وضع تلك المعرّفات في المجموعة المحلية 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 فقط. دون أي ضمان.