
Nextcloud 35.0.0 — un administrador de Usuarios delegado puede editar mediante PUT a un administrador promovido por LDAP que PATCH rechaza correctamente
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-ldap-put-isadmin
Análisis: https://abraxaslabs.tech/research/nextcloud-ldap-put-isadmin
Nextcloud Server 35.0.0 - Nextcloud GmbH
PUT /cloud/users/{id} permite a un administrador de Usuarios delegado editar un objetivo a menos que ese objetivo esté en el grupo local admin. PATCH en la misma ruta usa correctamente isAdmin(). Los administradores promovidos por LDAP tienen isAdmin()===true y a menudo no están en ese grupo local.
Un actor malicioso con el rol de Usuarios estilo helpdesk puede deshabilitar, bloquear por cuota o eliminar a un administrador real de la instancia promovido por LDAP. La API PATCH más reciente lo rechaza correctamente. La ruta PUT más antigua no lo hace.
| ID | aún sin 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 Usuarios delegado, no administrador de la instancia) |
| Producto | Nextcloud Server |
| Afectado | 35.0.0 (da02f41) oficial nextcloud:35.0.0-apache más user_ldap |
| Autenticación | administrador de Usuarios delegado frente a administrador promovido por LDAP |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
En un sitio con LDAP, promoviste un grupo LDAP a administrador de la instancia (occ ldap:promote-group). Esas personas son administradores reales (isAdmin()===true) pero puede que no estén en el grupo local de Nextcloud llamado admin.
También le diste a alguien el rol de configuración de Usuarios (helpdesk). No es un administrador completo de la instancia.
Ese usuario de helpdesk puede:
isInGroup en habilitar/deshabilitar/eliminar/borrar)canChangePassword() (a menudo falso; no dependas de ello)No pueden hacer esto a alguien que esté realmente en el grupo local admin. No pueden hacer esto en un sitio sin administradores promovidos por LDAP. La API PATCH más segura ya conoce la diferencia.
El aprovisionamiento tiene dos editores para el mismo usuario. UsersController::editUser es PUT. editUserMultiField es PATCH. Mismo archivo. Métodos adyacentes. Dos respuestas diferentes a "¿esta persona es administrador?".
PUT comprueba isInGroup($target, 'admin'). PATCH comprueba isAdmin($target). Manager::isAdmin() consulta el IIsAdmin de LDAP y luego el grupo local. occ ldap:promote-group convierte un grupo LDAP en administrador de la instancia sin poner esos uids en el grupo local admin.
Levanté el oficial nextcloud:35.0.0-apache más osixia/openldap:1.5.0. Usuario LDAP ldapadmin en el grupo promovido ncadmins: isAdmin()===true, no está en el admin local. El helpdesk local es Usuarios delegado, no administrador de la instancia.
Envié PATCH primero. Es la ruta más reciente. Esperaba que PUT coincidiera con ella. PATCH {"quota":"1 GB"} devolvió 403. PUT key=quota&value=1 GB devolvió 200. GET mostró entonces la cuota 1073741824.
cd lab
./run.sh
Dirígete solo a http://127.0.0.1:18342 (OpenLDAP en el DNS de compose ldap:389).
SUCCESS NEXTCLOUD-LDAP-PUT-ISADMIN who=delegated-users-admin target=ldapadmin put=200 patch=403 NEXTCLOUD-LDAP-PUT-ISADMIN-WITNESS
Usar isAdmin($target) en PUT/disable/delete/wipe de la misma forma en que ya lo hace PATCH.
occ ldap:promote-group (PR #41650)GNU Affero GPL v3.0. Consulte LICENSE. Solo laboratorio de loopback. Sin garantía.