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,且通常不在该本地组中。
拥有类似 helpdesk 的用户管理权限的恶意行为者,可以禁用、锁定配额或删除真正的 LDAP 提升实例管理员。较新的 PATCH API 会正确拒绝。较旧的 PUT 路径则不会。
| ID | 暂无 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(被委派的用户管理员,而非实例管理员) |
| 产品 | Nextcloud Server |
| 受影响版本 | 35.0.0(da02f41)官方 nextcloud:35.0.0-apache 加上 user_ldap |
| 认证 | 被委派的用户管理员 vs LDAP 提升的管理员 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
在 LDAP 站点上,你将某个 LDAP 组提升为实例管理员(occ ldap:promote-group)。这些人是真正的管理员(isAdmin()===true),但他们可能不属于名为 admin 的本地 Nextcloud 组。
你还将用户设置权限(helpdesk)授予了某人。他们并非完整的实例管理员。
该 helpdesk 用户可以:
isInGroup 门控)canChangePassword()(通常为 false;不要依赖此项)他们无法对真正位于本地 admin 组中的人执行这些操作。他们无法在没有 LDAP 提升管理员的站点上执行这些操作。更安全的 PATCH API 已经知道其中的区别。
用户配置对同一用户有两个编辑器。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
在 PUT/禁用/删除/擦除操作中使用 isAdmin($target),与 PATCH 已有的做法相同。
occ ldap:promote-group(PR #41650)GNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。