
Grafana OSS 13.2.3 – Hoch – Remote – SSRF – Git Sync URLValidator ist nur Admission-DNS
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-gitsync-dns-rebind
Klasse: SSRF Reichweite: Remote
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
Git Sync URLValidator prüft den Host der Repository-URL bei der Zulassung. nanogit / Test lösen später erneut auf, ohne IP-Pinning. isBlockedIP umfasst nur Loopback, RFC1918, Link-Local und Unspecified. Das Literal 0.0.0.1 ist nicht blockiert. Ein Hostname, der zum Validierungszeitpunkt öffentlich ist, kann für den Clone-GET auf RFC1918 umgebunden werden.
Der Org-Admin-Test einer rebindenden Git-URL veranlasst Grafana, einen internen Host per GET abzurufen, den der Validator eigentlich ablehnen sollte.
| ID | noch keine CVE |
| Klasse | SSRF (DNS-Rebind / 0.0.0.0/8-Lücke) |
| Reichweite | Remote (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 |
| Produkt | Grafana OSS |
| Betroffen | 13.2.3 (6193dc0); Git Sync standardmäßig aktiviert |
| Auth | Org-Admin (repositories:create / :write). Nicht Viewer/Editor-Erstellung. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Der Akteur ist Org-Admin, kein Fremder. Org-Admin kann in OSS bereits DataSources auf interne URLs zeigen lassen. Dieser Rest ist eine Umgehung des Git-Sync-URLValidators, der diese Klasse für Repository-URLs schließen sollte.
| Privileg | Methode / Sink | Recon / Integrität / Verfügbarkeit | Lab-belegt oder abgeleitet |
|---|---|---|---|
| Grafana dazu bringen, eine rebindende Git-URL per GET abzurufen | Org-Admin POST .../repositories/{name}/test mit spec.git.url=http://git.lab/... | Recon (ausgehendes HTTP aus dem Grafana-Prozess) | Lab-belegt. DNS A1 öffentlich, später A RFC1918. Rebind-Oracle hits=3, Witness im Body |
Eine literale 0.0.0.1-Git-URL erreichen | Derselbe Test mit http://0.0.0.1:18080/lab/gitsync.git | Recon | Lab-belegt, bei der Zulassung nicht blockiert (Status 400 Transport, nicht 422 public-or-allowed) |
| Git Smart HTTP / HTTP-Body von diesem Host in Test-Fehler lesen | gitRepository.Test interpoliert Transportfehler | Recon | Aus Pin abgeleitet. Lab nutzte eine 200-Git-Advertisment-Antwort |
| Nach der Zulassung auf RFC1918 / CGNAT umbinden | TOCTOU: DNS validieren, dann nanogit dialen | Recon | Lab-belegt für RFC1918-Sidecar 172.30.60.3 |
Viewer-Lesezugriff auf gespeicherte spec.*.url inklusive Userinfo | repositories:read | Recon | Aus Pin abgeleitet. Nicht dieses Lab |
Geschlossen bei diesem Rest (Lab-belegt): literales Loopback 127.0.0.1 422; RFC1918-Literal 10.0.0.1 422; IMDS 169.254.169.254 422. Geschlossen: Editor kann keine Repos erstellen. Kein RCE. Kein Grafana-Admin erforderlich. Grafana G2 überspringen (IAM SSOSetting k8s authorizer).
Die Zulassung in apps/provisioning/pkg/repository/validator.go ruft URLValidator.ValidateURL auf. isBlockedIP besteht aus vier Prädikaten. Unspecified ist nur 0.0.0.0 / ::. Der Rest von 0.0.0.0/8 und CGNAT passieren. Der Clone verwendet später nanogit.NewHTTPClient(gitConfig.URL) und löst erneut auf.
Bereits dokumentierte Irrwege: Org-Admin-DS-URLs als diesen Rest zu behandeln (jene sind beabsichtigt; dies ist die Umgehung des Git-Sync-Validators); zu erwarten, dass IMDS 169.254 passiert (bei der Zulassung blockiert); Editor-Erstellung (verweigert); eine Reverse Shell. Theater.
python3 grafana-gitsync-dns-rebind-Abraxas-Labs.py
oder:
cd lab
./run.sh
Loopback: Grafana 127.0.0.1:19360, DNS-Kontrolle 127.0.0.1:19361, Rebind-Oracle 127.0.0.1:19362. Image 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
Die aufgelöste Adresse über Clone/Test hinweg pinnen oder bei jedem Dial erneut validieren. 0.0.0.0/8 und CGNAT als blockiert behandeln. DNS bei allowlisteten Hosts nicht überspringen, ohne zu pinnen.
GNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.