
Grafana OSS 13.2.3 - Élevé - À distance - SSRF - Git Sync URLValidator est limité à la validation DNS à l'admission
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-gitsync-dns-rebind
Classe : SSRF Portée : Distante
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
Git Sync URLValidator vérifie l'hôte de l'URL du dépôt à l'admission. nanogit / Test re-résolvent plus tard sans épinglage d'IP. isBlockedIP ne couvre que loopback, RFC1918, link-local et unspecified. Le littéral 0.0.0.1 n'est pas bloqué. Un nom d'hôte public au moment de la validation peut rebinder vers RFC1918 pour le GET de clone.
Le Test par un Org Admin d'une URL Git rebindante fait que Grafana effectue un GET vers un hôte interne que le validateur était censé refuser.
| ID | pas encore de CVE |
| Classe | SSRF (DNS rebind / faille 0.0.0.0/8) |
| Portée | Distante (Org Admin repositories:create) |
| CWE | CWE-918 / CWE-367 |
| CVSS | Élevé : 7.7 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:N/A:N |
| Produit | Grafana OSS |
| Affecté | 13.2.3 (6193dc0) ; Git Sync activé par défaut |
| Auth | Org Admin (repositories:create / :write). Pas de création par Viewer/Editor. |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
L'acteur est Org Admin, pas un inconnu. Un Org Admin peut déjà pointer des datasources vers des URL internes sur OSS. Ce reliquat est un contournement du URLValidator de Git Sync qui était censé fermer cette classe pour les URL de dépôt.
| Privilège | Méthode / sink | Reconnaissance / intégrité / disponibilité | Prouvé en lab ou déduit |
|---|---|---|---|
| Faire que Grafana effectue un GET vers une URL Git rebindante | Org Admin POST .../repositories/{name}/test avec spec.git.url=http://git.lab/... | Reconnaissance (HTTP sortant depuis le processus Grafana) | Prouvé en lab. DNS A1 public, puis A RFC1918. Oracle de rebind hits=3, témoin dans le corps |
Atteindre une URL Git littérale 0.0.0.1 | Même Test avec http://0.0.0.1:18080/lab/gitsync.git | Reconnaissance | Prouvé en lab non bloqué à l'admission (statut 400 transport, pas 422 public-or-allowed) |
| Lire Git Smart HTTP / le corps HTTP depuis cet hôte dans les erreurs de Test | gitRepository.Test interpole l'erreur de transport | Reconnaissance | Déduit de l'épinglage. Le lab a utilisé une annonce git 200 |
| Rebinder vers RFC1918 / CGNAT après admission | TOCTOU : valider le DNS puis dial nanogit | Reconnaissance | Prouvé en lab pour le sidecar RFC1918 172.30.60.3 |
Lecture par un Viewer du spec.*.url stocké, y compris userinfo | repositories:read | Reconnaissance | Déduit de l'épinglage. Pas ce lab |
Fermé sur ce reliquat (prouvé en lab) : loopback littéral 127.0.0.1 422 ; RFC1918 littéral 10.0.0.1 422 ; IMDS 169.254.169.254 422. Fermé : un Editor ne peut pas créer de dépôts. Pas de RCE. Pas besoin d'être Grafana Admin. Ignorer Grafana G2 (IAM SSOSetting k8s authorizer).
L'admission dans apps/provisioning/pkg/repository/validator.go appelle URLValidator.ValidateURL. isBlockedIP est quatre prédicats. Unspecified n'est que 0.0.0.0 / ::. Le reste de 0.0.0.0/8 et le CGNAT passent. Le clone utilise ensuite nanogit.NewHTTPClient(gitConfig.URL) et re-résout.
Fausses pistes déjà consignées : traiter les URL DS d'Org Admin comme ce reliquat (celles-ci sont intentionnelles ; ceci est le contournement du validateur Git Sync) ; s'attendre à ce que IMDS 169.254 passe (bloqué à l'admission) ; création par Editor (refusée) ; un reverse shell. Du théâtre.
python3 grafana-gitsync-dns-rebind-Abraxas-Labs.py
ou :
cd lab
./run.sh
Loopback : Grafana 127.0.0.1:19360, contrôle DNS 127.0.0.1:19361, oracle de rebind 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
Épingler l'adresse résolue pendant tout le clone/Test, ou re-valider à chaque dial. Traiter 0.0.0.0/8 et le CGNAT comme bloqués. Ne pas ignorer le DNS sur les hôtes en liste blanche sans épinglage.
GNU Affero GPL v3.0. Voir LICENSE. Lab en loopback uniquement. Aucune garantie.