
Nextcloud 35.0.0 — делегированный администратор Users может PUT-редактировать администратора, повышенного через LDAP, тогда как 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} позволяет делегированному администратору пользователей редактировать цель, если только эта цель не входит в локальную группу admin. PATCH по тому же пути корректно использует isAdmin(). Администраторы, повышенные через LDAP, имеют isAdmin()===true и часто не входят в эту локальную группу.
Злоумышленник с ролью пользователей в стиле службы поддержки может отключить, заблокировать по квоте или удалить настоящего администратора экземпляра, повышенного через LDAP. Более новый API 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 (делегированный администратор пользователей, не администратор экземпляра) |
| Продукт | Nextcloud Server |
| Затронуто | 35.0.0 (da02f41) официальный nextcloud:35.0.0-apache плюс user_ldap |
| Аутентификация | делегированный администратор пользователей против администратора, повышенного через LDAP |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
На сайте с LDAP вы повысили LDAP-группу до администратора экземпляра (occ ldap:promote-group). Эти люди — настоящие администраторы (isAdmin()===true), но они могут не состоять в локальной группе Nextcloud с именем admin.
Вы также дали кому-то роль в настройках Пользователи (служба поддержки). Он не является полным администратором экземпляра.
Этот пользователь службы поддержки может:
isInGroup при включении/отключении/удалении/очистке)canChangePassword() (часто false; не полагайтесь на это)Они не могут сделать это с тем, кто действительно входит в локальную группу admin. Они не могут сделать это на сайте без администраторов, повышенных через LDAP. Более безопасный API PATCH уже знает разницу.
В провижининге есть два редактора для одного и того же пользователя. UsersController::editUser — это PUT. editUserMultiField — это PATCH. Один и тот же файл. Соседние методы. Два разных ответа на вопрос «является ли этот человек администратором».
PUT проверяет isInGroup($target, 'admin'). PATCH проверяет isAdmin($target). Manager::isAdmin() сначала спрашивает LDAP IIsAdmin, затем локальную группу. occ ldap:promote-group делает LDAP-группу администратором экземпляра, не помещая эти uid в локальную группу admin.
Я развернул официальный nextcloud:35.0.0-apache плюс osixia/openldap:1.5.0. LDAP-пользователь ldapadmin в повышенной группе ncadmins: isAdmin()===true, не в локальной admin. Локальный helpdesk — делегированный пользователями, не администратор экземпляра.
Сначала я отправил 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 на compose DNS 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. Без гарантий.