
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
Write-up: https://abraxaslabs.tech/research/nextcloud-ldap-put-isadmin
Nextcloud Server 35.0.0 - Nextcloud GmbH
PUT /cloud/users/{id} permite que um admin de Usuários delegado edite um alvo, a menos que esse alvo esteja no grupo local admin. PATCH no mesmo caminho usa corretamente isAdmin(). Admins promovidos via LDAP têm isAdmin()===true e frequentemente não estão nesse grupo local.
Um agente malicioso com a função de Usuários no estilo helpdesk pode desativar, bloquear por cota ou excluir um admin de instância real promovido via LDAP. A API PATCH mais recente recusa corretamente. O caminho PUT mais antigo não.
| ID | sem CVE ainda |
| 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 (admin de Usuários delegado, não admin de instância) |
| Produto | Nextcloud Server |
| Afetado | 35.0.0 (da02f41) oficial nextcloud:35.0.0-apache mais user_ldap |
| Autenticação | admin de Usuários delegado vs admin promovido via LDAP |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Em um site LDAP, você promoveu um grupo LDAP a admin de instância (occ ldap:promote-group). Essas pessoas são admins reais (isAdmin()===true), mas podem não estar no grupo local do Nextcloud chamado admin.
Você também deu a alguém a função de configurações Usuários (helpdesk). Essa pessoa não é um admin 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 realmente no grupo local admin. Eles não podem fazer isso em um site sem admins 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 é admin."
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 admin de instância sem colocar esses uids no grupo local admin.
Eu subi 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 admin 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. GET então mostrou cota 1073741824.
cd lab
./run.sh
Aponte apenas para 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. Consulte LICENSE. Apenas laboratório loopback. Sem garantias.