
Nextcloud 35.0.0 — delegierter Benutzer-Administrator kann einen LDAP-hochgestuften Administrator per PUT bearbeiten, was PATCH korrekt verweigert
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} erlaubt einem delegierten Benutzeradministrator, ein Zielkonto zu bearbeiten, sofern dieses Zielkonto nicht in der lokalen Gruppe admin ist. PATCH auf demselben Pfad verwendet korrekt isAdmin(). Über LDAP hochgestufte Administratoren haben isAdmin()===true und sind oft nicht in dieser lokalen Gruppe.
Ein böswilliger Akteur mit der helpdesk-artigen Benutzerrolle kann einen echten, über LDAP hochgestuften Instanzadministrator deaktivieren, per Quota sperren oder löschen. Die neuere PATCH-API verweigert dies korrekt. Der ältere PUT-Pfad tut es nicht.
| ID | noch keine CVE |
| CWE | CWE-863 |
| CVSS | Hoch: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H (delegierter Benutzeradministrator, kein Instanzadministrator) |
| Produkt | Nextcloud Server |
| Betroffen | 35.0.0 (da02f41) offizielles nextcloud:35.0.0-apache plus user_ldap |
| Auth | delegierter Benutzeradministrator vs. über LDAP hochgestufter Administrator |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Auf einer LDAP-Site haben Sie eine LDAP-Gruppe zum Instanzadministrator hochgestuft (occ ldap:promote-group). Diese Personen sind echte Administratoren (isAdmin()===true), aber sie befinden sich möglicherweise nicht in der lokalen Nextcloud-Gruppe namens admin.
Sie haben außerdem jemandem die Einstellungsrolle Benutzer (Helpdesk) gegeben. Diese Person ist kein vollständiger Instanzadministrator.
Dieser Helpdesk-Benutzer kann:
isInGroup-Prüfung bei Aktivieren/Deaktivieren/Löschen/Wipe)canChangePassword() erlaubt (oft false; nicht darauf verlassen)Sie können dies nicht bei jemandem tun, der tatsächlich in der lokalen Gruppe admin ist. Sie können dies nicht auf einer Site ohne über LDAP hochgestufte Administratoren tun. Die sicherere PATCH-API kennt den Unterschied bereits.
Die Bereitstellung hat zwei Editoren für denselben Benutzer. UsersController::editUser ist PUT. editUserMultiField ist PATCH. Dieselbe Datei. Benachbarte Methoden. Zwei unterschiedliche Antworten auf die Frage „Ist diese Person ein Administrator?“
PUT prüft isInGroup($target, 'admin'). PATCH prüft isAdmin($target). Manager::isAdmin() fragt LDAP IIsAdmin und dann die lokale Gruppe. occ ldap:promote-group macht eine LDAP-Gruppe zum Instanzadministrator, ohne diese UIDs in die lokale Gruppe admin aufzunehmen.
Ich habe das offizielle nextcloud:35.0.0-apache plus osixia/openldap:1.5.0 aufgesetzt. LDAP-Benutzer ldapadmin in der hochgestuften Gruppe ncadmins: isAdmin()===true, nicht in lokalem admin. Lokaler helpdesk ist delegierter Benutzeradministrator, kein Instanzadministrator.
Ich habe zuerst PATCH gesendet. Das ist die neuere Route. Ich erwartete, dass PUT damit übereinstimmt. PATCH {"quota":"1 GB"} gab 403 zurück. PUT key=quota&value=1 GB gab 200 zurück. GET zeigte danach Quota 1073741824.
cd lab
./run.sh
Nur http://127.0.0.1:18342 anvisieren (OpenLDAP auf Compose-DNS ldap:389).
SUCCESS NEXTCLOUD-LDAP-PUT-ISADMIN who=delegated-users-admin target=ldapadmin put=200 patch=403 NEXTCLOUD-LDAP-PUT-ISADMIN-WITNESS
Verwende isAdmin($target) bei PUT/disable/delete/wipe auf dieselbe Weise, wie es PATCH bereits tut.
occ ldap:promote-group (PR #41650)GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.