
Grafana OSS 13.2.3 - High - Remote - SSRF - Git Sync URLValidator はアドミッション専用 DNS
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-gitsync-dns-rebind
クラス: SSRF 到達性: リモート
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
Git Sync の URLValidator は、受け入れ時にリポジトリ URL のホストをチェックする。nanogit / Test は後で IP を固定せずに再解決する。isBlockedIP はループバック、RFC1918、リンクローカル、および unspecified のみである。リテラルの 0.0.0.1 はブロックされない。検証時にパブリックだったホスト名は、クローン GET のために RFC1918 にリバインドできる。
Org Admin がリバインドする Git URL を Test すると、Grafana はバリデータが拒否するよう書かれていた内部ホストに GET を実行する。
| ID | CVE 未採番 |
| クラス | SSRF (DNS リバインド / 0.0.0.0/8 のギャップ) |
| 到達性 | リモート (Org Admin repositories:create) |
| CWE | CWE-918 / CWE-367 |
| CVSS | High: 7.7 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:N/A:N |
| 製品 | Grafana OSS |
| 影響 | 13.2.3 (6193dc0); Git Sync はデフォルトで有効 |
| 認証 | Org Admin (repositories:create / :write)。Viewer/Editor の create ではない。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
アクターは Org Admin であり、部外者ではない。Org Admin は OSS 上で既にデータソースを内部 URL に向けることができる。この残存問題は、リポジトリ URL に対してそのクラスを塞ぐことを目的としていた Git Sync URLValidator のバイパスである。
| 権限 | メソッド / シンク | 偵察 / 完全性 / 可用性 | ラボ実証または推測 |
|---|---|---|---|
| Grafana にリバインドする Git URL を GET させる | Org Admin POST .../repositories/{name}/test と spec.git.url=http://git.lab/... | 偵察 (Grafana プロセスからの外向き HTTP) | ラボ実証。DNS A1 はパブリック、後に A は RFC1918。リバインドオラクル hits=3、body に witness |
リテラルの 0.0.0.1 Git URL に到達 | 同じ Test で http://0.0.0.1:18080/lab/gitsync.git | 偵察 | ラボ実証: 受け入れ時にブロックされない (ステータス 400 transport、422 public-or-allowed ではない) |
| そのホストから Git Smart HTTP / HTTP body を Test エラーに読み込む | gitRepository.Test が transport エラーを補間 | 偵察 | ピンから推測。ラボでは 200 の git advertisement を使用 |
| 受け入れ後に RFC1918 / CGNAT にリバインド | TOCTOU: DNS を検証してから nanogit がダイヤル | 偵察 | RFC1918 サイドカー 172.30.60.3 でラボ実証 |
保存された spec.*.url (userinfo を含む) を Viewer が読み取る | repositories:read | 偵察 | ピンから推測。このラボではない |
この残存問題で塞がれているもの (ラボ実証): リテラルのループバック 127.0.0.1 は 422; RFC1918 リテラル 10.0.0.1 は 422; IMDS 169.254.169.254 は 422。塞がれている: Editor はリポジトリを作成できない。RCE ではない。Grafana Admin は不要。Grafana G2 (IAM SSOSetting k8s authorizer) はスキップ。
apps/provisioning/pkg/repository/validator.go の受け入れ処理は URLValidator.ValidateURL を呼び出す。isBlockedIP は 4 つの述語である。unspecified は 0.0.0.0 / :: のみ。0.0.0.0/8 の残りと CGNAT は通過する。クローンは後で nanogit.NewHTTPClient(gitConfig.URL) を使用し、再解決する。
既に記録済みの誤った道: Org Admin の DS URL をこの残存問題として扱うこと (それらは意図されたものであり、これは Git Sync バリデータのバイパスである); IMDS 169.254 が通過すると期待すること (受け入れ時にブロックされる); Editor の create (拒否される); リバースシェル。茶番である。
python3 grafana-gitsync-dns-rebind-Abraxas-Labs.py
または:
cd lab
./run.sh
ループバック: Grafana 127.0.0.1:19360、DNS コントロール 127.0.0.1:19361、リバインドオラクル 127.0.0.1:19362。イメージ grafana/grafana:13.2.3。
SUCCESS GRAFANA-GITSYNC-DNS-REBIND how=live actor=org-admin path=rebind dns_lookups=4 negatives=3 GRAFANA-GITSYNC-DNS-REBIND-WITNESS
クローン/Test を通じて解決済みアドレスを固定するか、ダイヤルごとに再検証する。0.0.0.0/8 と CGNAT をブロック対象として扱う。固定せずに許可リスト済みホストで DNS をスキップしない。
GNU Affero GPL v3.0。LICENSE を参照。ループバックラボのみ。無保証。