
Grafana OSS 13.2.3 - Alto - Remoto - SSRF - Git Sync URLValidator è solo ammissione DNS
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-gitsync-dns-rebind
Classe: SSRF Portata: Remota
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
Git Sync URLValidator verifica l'host dell'URL del repository al momento dell'ammissione. nanogit / Test ri-risolvono successivamente senza IP pin. isBlockedIP copre solo loopback, RFC1918, link-local e unspecified. Il letterale 0.0.0.1 non è bloccato. Un hostname pubblico al momento della validazione può fare rebind verso RFC1918 per la GET di clone.
Il Test di un URL Git con rebinding da parte di un Org Admin fa sì che Grafana effettui una GET verso un host interno che il validator era stato scritto per rifiutare.
| ID | nessuna CVE al momento |
| Classe | SSRF (DNS rebind / lacuna 0.0.0.0/8) |
| Portata | Remota (Org Admin repositories:create) |
| CWE | CWE-918 / CWE-367 |
| CVSS | Alto: 7.7 CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:H/I:N/A:N |
| Prodotto | Grafana OSS |
| Affetto | 13.2.3 (6193dc0); Git Sync attivo di default |
| Auth | Org Admin (repositories:create / :write). Non creazione da Viewer/Editor. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
L'attore è un Org Admin, non un estraneo. Un Org Admin può già puntare datasource verso URL interni su OSS. Questo residuo è un bypass del URLValidator di Git Sync che doveva chiudere quella classe per gli URL dei repository.
| Privilegio | Metodo / sink | Recon / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|
| Far effettuare a Grafana una GET verso un URL Git con rebinding | Org Admin POST .../repositories/{name}/test con spec.git.url=http://git.lab/... | Recon (HTTP in uscita dal processo Grafana) | Provato in lab. DNS A1 pubblico, poi A RFC1918. Rebind oracle hits=3, witness nel body |
Raggiungere un URL Git letterale 0.0.0.1 | Stesso Test con http://0.0.0.1:18080/lab/gitsync.git | Recon | Provato in lab non bloccato all'ammissione (status 400 transport, non 422 public-or-allowed) |
| Leggere Git Smart HTTP / body HTTP da quell'host negli errori del Test | gitRepository.Test interpola l'errore di trasporto | Recon | Dedotto dal pin. Il lab ha usato un git advertisement 200 |
| Rebind verso RFC1918 / CGNAT dopo l'ammissione | TOCTOU: valida DNS poi nanogit dial | Recon | Provato in lab per il sidecar RFC1918 172.30.60.3 |
Lettura da Viewer dello spec.*.url memorizzato incluso userinfo | repositories:read | Recon | Dedotto dal pin. Non in questo lab |
Chiusi su questo residuo (provato in lab): loopback letterale 127.0.0.1 422; RFC1918 letterale 10.0.0.1 422; IMDS 169.254.169.254 422. Chiuso: Editor non può creare repo. Non è RCE. Non richiede Grafana Admin. Salta Grafana G2 (IAM SSOSetting k8s authorizer).
L'ammissione in apps/provisioning/pkg/repository/validator.go chiama URLValidator.ValidateURL. isBlockedIP è quattro predicati. Unspecified è solo 0.0.0.0 / ::. Il resto di 0.0.0.0/8 e CGNAT passano. Il clone successivamente usa nanogit.NewHTTPClient(gitConfig.URL) e ri-risolve.
Vicoli ciechi già registrati: trattare gli URL DS di Org Admin come questo residuo (quelli sono intenzionali; questo è il bypass del validator di Git Sync); aspettarsi che IMDS 169.254 passi (bloccato all'ammissione); creazione da Editor (negata); una reverse shell. Teatro.
python3 grafana-gitsync-dns-rebind-Abraxas-Labs.py
oppure:
cd lab
./run.sh
Loopback: Grafana 127.0.0.1:19360, controllo DNS 127.0.0.1:19361, rebind oracle 127.0.0.1:19362. Immagine 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
Fissare l'indirizzo risolto durante clone/Test, oppure ri-validare a ogni dial. Trattare 0.0.0.0/8 e CGNAT come bloccati. Non saltare il DNS su host in allowlist senza pinning.
GNU Affero GPL v3.0. Vedi LICENSE. Solo lab in loopback. Nessuna garanzia.