
Nextcloud 35.0.0 — um admin de Usuários delegado consegue editar via PUT um admin promovido por LDAP que o PATCH recusa corretamente
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-ldap-put-isadmin
Nextcloud Server 35.0.0 - Nextcloud GmbH
PUT /cloud/users/{id} permite que um administrador de Usuários delegado edite um alvo, a menos que esse alvo esteja no grupo local admin. PATCH no mesmo caminho usa corretamente isAdmin(). Administradores promovidos via LDAP têm isAdmin()===true e frequentemente não estão nesse grupo local.
Um ator malicioso com o cargo de Usuários no estilo helpdesk pode desativar, bloquear por cota ou excluir um verdadeiro administrador de instância promovido via LDAP. A API PATCH mais recente recusa corretamente. O caminho PUT mais antigo não.
| ID | ainda sem CVE |
| CWE | CWE-863 |
| CVSS | Alto: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (administrador de Usuários delegado, não administrador de instância) |
| Produto | Nextcloud Server |
| Afetado | 35.0.0 (da02f41) oficial nextcloud:35.0.0-apache mais user_ldap |
| Autenticação | administrador de Usuários delegado vs administrador promovido via LDAP |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Em um site com LDAP, você promoveu um grupo LDAP a administrador de instância (occ ldap:promote-group). Essas pessoas são administradores reais (isAdmin()===true), mas podem não estar no grupo local do Nextcloud chamado admin.
Você também deu a alguém o cargo de configurações de Usuários (helpdesk). Essa pessoa não é um administrador de instância completo.
Esse usuário de helpdesk pode:
isInGroup em enable/disable/delete/wipe)canChangePassword() (frequentemente falso; não dependa disso)Eles não podem fazer isso com alguém que esteja de fato no grupo local admin. Eles não podem fazer isso em um site sem administradores promovidos via LDAP. A API PATCH mais segura já sabe a diferença.
O provisionamento tem dois editores para o mesmo usuário. UsersController::editUser é PUT. editUserMultiField é PATCH. Mesmo arquivo. Métodos adjacentes. Duas respostas diferentes para "esta pessoa é administradora."
PUT verifica isInGroup($target, 'admin'). PATCH verifica isAdmin($target). Manager::isAdmin() consulta o LDAP IIsAdmin e depois o grupo local. occ ldap:promote-group torna um grupo LDAP administrador de instância sem colocar esses uids no grupo local admin.
Eu montei o oficial nextcloud:35.0.0-apache mais osixia/openldap:1.5.0. Usuário LDAP ldapadmin no grupo promovido ncadmins: isAdmin()===true, não está no admin local. O helpdesk local é Usuários delegado, não administrador de instância.
Enviei PATCH primeiro. É a rota mais recente. Eu esperava que PUT correspondesse a ela. PATCH {"quota":"1 GB"} retornou 403. PUT key=quota&value=1 GB retornou 200. O GET então mostrou cota 1073741824.
cd lab
./run.sh
Alvo apenas http://127.0.0.1:18342 (OpenLDAP no DNS do compose ldap:389).
SUCCESS NEXTCLOUD-LDAP-PUT-ISADMIN who=delegated-users-admin target=ldapadmin put=200 patch=403 NEXTCLOUD-LDAP-PUT-ISADMIN-WITNESS
Use isAdmin($target) em PUT/disable/delete/wipe da mesma forma que PATCH já faz.
occ ldap:promote-group (PR #41650)GNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.