
Nextcloud 35.0.0 — un administrateur délégué des utilisateurs peut modifier via PUT un administrateur promu par LDAP, ce que PATCH refuse correctement
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-ldap-put-isadmin
Nextcloud Server 35.0.0 - Nextcloud GmbH
PUT /cloud/users/{id} permet à un administrateur Utilisateurs délégué de modifier une cible, sauf si cette cible appartient au groupe local admin. PATCH sur le même chemin utilise correctement isAdmin(). Les administrateurs promus via LDAP ont isAdmin()===true et ne sont souvent pas dans ce groupe local.
Un acteur malveillant disposant du rôle Utilisateurs de type helpdesk peut désactiver, bloquer le quota ou supprimer un véritable administrateur d'instance promu via LDAP. La nouvelle API PATCH refuse correctement. L'ancien chemin PUT ne le fait pas.
| ID | pas encore de CVE |
| CWE | CWE-863 |
| CVSS | Élevé : 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (administrateur Utilisateurs délégué, pas administrateur d'instance) |
| Produit | Nextcloud Server |
| Affecté | 35.0.0 (da02f41) officiel nextcloud:35.0.0-apache plus user_ldap |
| Auth | administrateur Utilisateurs délégué vs administrateur promu via LDAP |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Sur un site LDAP, vous avez promu un groupe LDAP au rang d'administrateur d'instance (occ ldap:promote-group). Ces personnes sont de véritables administrateurs (isAdmin()===true) mais elles peuvent ne pas appartenir au groupe local Nextcloud nommé admin.
Vous avez également attribué à quelqu'un le rôle de paramètres Utilisateurs (helpdesk). Cette personne n'est pas un administrateur d'instance complet.
Cet utilisateur helpdesk peut :
isInGroup sur enable/disable/delete/wipe)canChangePassword() (souvent faux ; ne pas s'y fier)Il ne peut pas faire cela à quelqu'un qui appartient réellement au groupe local admin. Il ne peut pas faire cela sur un site sans administrateurs promus via LDAP. L'API PATCH plus sûre connaît déjà la différence.
Le provisioning dispose de deux éditeurs pour le même utilisateur. UsersController::editUser est PUT. editUserMultiField est PATCH. Même fichier. Méthodes adjacentes. Deux réponses différentes à « cette personne est-elle administrateur ».
PUT vérifie isInGroup($target, 'admin'). PATCH vérifie isAdmin($target). Manager::isAdmin() interroge LDAP IIsAdmin puis le groupe local. occ ldap:promote-group rend un groupe LDAP administrateur d'instance sans placer ces uid dans le groupe local admin.
J'ai déployé l'image officielle nextcloud:35.0.0-apache plus osixia/openldap:1.5.0. L'utilisateur LDAP ldapadmin dans le groupe promu ncadmins : isAdmin()===true, pas dans le groupe local admin. Le helpdesk local est Utilisateurs délégué, pas administrateur d'instance.
J'ai envoyé PATCH en premier. C'est la route la plus récente. Je m'attendais à ce que PUT s'aligne. PATCH {"quota":"1 GB"} a renvoyé 403. PUT key=quota&value=1 GB a renvoyé 200. GET a ensuite affiché le quota 1073741824.
cd lab
./run.sh
Cible uniquement http://127.0.0.1:18342 (OpenLDAP sur le DNS compose ldap:389).
SUCCESS NEXTCLOUD-LDAP-PUT-ISADMIN who=delegated-users-admin target=ldapadmin put=200 patch=403 NEXTCLOUD-LDAP-PUT-ISADMIN-WITNESS
Utiliser isAdmin($target) sur PUT/disable/delete/wipe de la même manière que PATCH le fait déjà.
occ ldap:promote-group (PR #41650)GNU Affero GPL v3.0. Voir LICENSE. Lab en boucle locale uniquement. Aucune garantie.