
Grafana OSS 13.2.3 - 高 - リモート - 招待参加 - SignUpStep2 がコードなしで保留中の組織招待に参加する
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-signup-invite-join
クラス: 権限の置き忘れ 到達性: リモート
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
users.allow_sign_up が true で、users.verify_email_enabled がデフォルトの false のままの場合、招待されたメールアドレスを使って未認証の POST /api/user/signup/step2 を実行するとアカウントが作成され、applyUserInvite がそのアドレスに対するすべての InvitePending 行を invite.Role で紐付ける。この経路では30文字の招待コードは一切要求されない。ロールは Admin になり得る。
招待されたメールアドレスを知っていればよい。招待コードは不要。Admin として組織に参加できる。
| ID | CVE 未採番 |
| クラス | 権限の置き忘れ |
| 到達性 | リモート (未認証 HTTP。users.allow_sign_up=true が必要) |
| CWE | CWE-862 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N |
| 製品 | Grafana OSS |
| 影響を受けるバージョン | 13.2.3 (6193dc0)。オープンサインアップ経路 |
| 認証 | 未認証。メール検証はデフォルトでオフ。標準の defaults.ini ではサインアップはオフ。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
招待されたアドレスが必要 (招待メール、推測、または別の漏洩経路)。メールボックスは不要で、招待コードも不要。既存の Grafana アカウントも不要。
| 権限 | メソッド / シンク | 偵察 / 完全性 / 可用性 | ラボで実証済みか推測か |
|---|---|---|---|
| 招待されたメールアドレスでアカウントを作成 | 未認証の POST /api/user/signup/step2 に code="" | 完全性 (アカウント作成) | ラボで実証済み。セッション /api/user の login=invitee |
| 招待ロールで招待された組織に参加 (このラボでは Admin) | GetTempUsersQuery{Email, InvitePending} からの applyUserInvite | 完全性 (組織メンバーシップ + ロール) | ラボで実証済み。/api/user/orgs の role=Admin。sqlite org_user は Admin |
| 保留中の招待を完了させ、本来の招待者が使えなくする | updateTempUserStatus(..., TmpUserCompleted) | 完全性 (招待の消費) | ラボで実証済み。保留リストは空。sqlite の temp status=Completed |
| Viewer/Editor 招待でも同様に参加 | invite.Role がそのままコピーされる | 完全性 | 推測。ラボでは Admin を使用 |
| ログイン後にその組織を Org Admin として読み書き | Org Admin API (datasources、dashboards、users) | 偵察 + 完全性 | 推測。ラボは role=Admin で停止 |
| ネガティブコントロール | 別のメールアドレスで空のコードでサインアップ | n/a | ラボで実証済み。invite-org-role=none |
この置き忘れで塞がれているもの: サインアップがオフのデフォルトインストール。メール検証オンの経路 (その経路は form.Code をチェックする)。complete-invite のメールバインド (CVE-2022-39306 クラス、依然として存在)。Grafana Admin (isGrafanaAdmin)。未認証 RCE ではない。Grafana G2 (IAM SSOSetting k8s authorizer) は対象外。
Grafana OSS 13.2.3 に固定した。デフォルトの OSS はこの基準では空振りだった。それでもオープンサインアップ経路に注目した。POST /api/user/signup/step2 は未認証である。SignUpStep2 はユーザーを作成し、その後メールアドレスで保留中の招待を読み込む。form.Code は VerifyEmailEnabled が true の場合にのみ要求される。
すでに記録済みの誤った道: CVE-2022-39306 の再申請 (complete-invite は依然としてメールをバインドする)。標準の defaults.ini をこの置き忘れとみなすこと (そこではサインアップはオフ)。OSS での SCIM 未認証 (k8s クライアントが nil)。リバースシェル。茶番。
python3 grafana-signup-invite-join-Abraxas-Labs.py
または:
cd lab
./run.sh
対象は http://127.0.0.1:19350 のみ。イメージは grafana/grafana:13.2.3 で、GF_USERS_ALLOW_SIGN_UP=true を設定し、メール検証はオフのまま。
SUCCESS GRAFANA-SIGNUP-INVITE-JOIN version=13.2.3 invite-org=2 invite-code-len=30 step2-code-sent=empty step2-redirect=redirect-to-select-org api-role=Admin sqlite-role=Admin temp-status=Completed control-invite-org-role=none GRAFANA-SIGNUP-INVITE-JOIN-WITNESS
サインアップ時の applyUserInvite の前に、保留中の招待コードまたはメールボックスの証明を要求する。メールアドレスの一致だけで InvitePending 行を紐付けてはならない。
signup.go · org_invite.goGNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。