
Nextcloud 35.0.0 — 委任されたユーザー管理者が、PATCH では正しく拒否される LDAP 昇格管理者を PUT で編集できる
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · nextcloud-ldap-put-isadmin
解説記事: https://abraxaslabs.tech/research/nextcloud-ldap-put-isadmin
Nextcloud Server 35.0.0 - Nextcloud GmbH
PUT /cloud/users/{id} では、委任された Users 管理者が対象ユーザーを編集できますが、その対象がローカルグループ admin に属している場合は例外です。同じパスへの PATCH は正しく isAdmin() を使用します。LDAP で昇格された管理者は isAdmin()===true であり、多くの場合そのローカルグループには属していません。
ヘルプデスク的な Users 権限を持つ悪意のある人物が、実際の LDAP 昇格済みインスタンス管理者を無効化したり、クォータでロックしたり、削除したりできます。新しい PATCH API は正しく拒否します。古い PUT パスは拒否しません。
| ID | CVE 未割当 |
| CWE | CWE-863 |
| CVSS | High: 7.2 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:H/I:H/A:H(委任された Users 管理者であり、インスタンス管理者ではない) |
| 製品 | Nextcloud Server |
| 影響範囲 | 35.0.0 (da02f41) 公式 nextcloud:35.0.0-apache に user_ldap を追加した構成 |
| 認証 | 委任された Users 管理者 対 LDAP 昇格済み管理者 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
LDAP サイトでは、LDAP グループをインスタンス管理者に昇格させています(occ ldap:promote-group)。これらのユーザーは実際の管理者(isAdmin()===true)ですが、ローカルの Nextcloud グループ admin には属していない可能性があります。
また、ある人物に Users 設定の権限(ヘルプデスク)を与えているとします。その人物は完全なインスタンス管理者ではありません。
そのヘルプデスクユーザーは次のことができます。
isInGroup ゲート)canChangePassword() を許可している場合に限りパスワードをリセットする(多くの場合 false。依存しないこと)ローカル admin グループに実際に属しているユーザーには、これらは行えません。LDAP 昇格済み管理者が存在しないサイトでは行えません。より安全な PATCH API はすでにこの違いを認識しています。
プロビジョニングには、同じユーザーに対する 2 つの編集経路があります。UsersController::editUser は PUT です。editUserMultiField は PATCH です。同じファイル内の隣接するメソッドです。「この人物は管理者か」という問いに対して 2 つの異なる答えがあります。
PUT は isInGroup($target, 'admin') をチェックします。PATCH は isAdmin($target) をチェックします。Manager::isAdmin() は LDAP の IIsAdmin を問い合わせ、その後ローカルグループを確認します。occ ldap:promote-group は、それらの uid をローカル admin グループに入れることなく、LDAP グループをインスタンス管理者にします。
公式 nextcloud:35.0.0-apache に osixia/openldap:1.5.0 を追加した環境を構築しました。昇格済みグループ ncadmins に属する LDAP ユーザー ldapadmin は isAdmin()===true であり、ローカル admin には属していません。ローカルの helpdesk は委任された Users 権限を持ち、インスタンス管理者ではありません。
最初に PATCH を送信しました。これは新しい経路です。PUT も同じ結果になることを期待しました。PATCH {"quota":"1 GB"} は 403 を返しました。PUT key=quota&value=1 GB は 200 を返しました。その後 GET するとクォータは 1073741824 になっていました。
cd lab
./run.sh
対象は http://127.0.0.1:18342 のみです(compose DNS ldap:389 上の OpenLDAP)。
SUCCESS NEXTCLOUD-LDAP-PUT-ISADMIN who=delegated-users-admin target=ldapadmin put=200 patch=403 NEXTCLOUD-LDAP-PUT-ISADMIN-WITNESS
PATCH がすでに行っているのと同じ方法で、PUT/disable/delete/wipe に対して isAdmin($target) を使用してください。
occ ldap:promote-group (PR #41650)GNU Affero GPL v3.0。LICENSE を参照してください。ループバックラボ専用です。保証はありません。