
Grafana OSS 13.2.3 - Alta - Remoto - SSRF - Git Sync URLValidator é apenas DNS de admissão
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-gitsync-dns-rebind
Classe: SSRF Alcance: Remoto
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
O Git Sync URLValidator verifica o host da URL do repositório na admissão. O nanogit / Test re-resolve depois sem fixação de IP. isBlockedIP cobre apenas loopback, RFC1918, link-local e unspecified. O literal 0.0.0.1 não é bloqueado. Um hostname que é público no momento da validação pode fazer rebind para RFC1918 no GET do clone.
O Test de uma URL Git com rebinding por um Org Admin faz o Grafana fazer GET a um host interno que o validador foi escrito para recusar.
| ID | ainda sem CVE |
| Classe | SSRF (DNS rebind / lacuna 0.0.0.0/8) |
| Alcance | Remoto (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 |
| Produto | Grafana OSS |
| Afetado | 13.2.3 (6193dc0); Git Sync ativo por padrão |
| Autenticação | Org Admin (repositories:create / :write). Não é criação por Viewer/Editor. |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
O ator é Org Admin, não um estranho. Um Org Admin já pode apontar datasources para URLs internas no OSS. Este resquício é um bypass do URLValidator do Git Sync que deveria fechar essa classe para URLs de repositório.
| Privilégio | Método / sink | Recon / integridade / disponibilidade | Comprovado em lab ou inferido |
|---|---|---|---|
| Fazer o Grafana fazer GET a uma URL Git com rebinding | Org Admin POST .../repositories/{name}/test com spec.git.url=http://git.lab/... | Recon (HTTP de saída a partir do processo do Grafana) | Comprovado em lab. DNS A1 público, depois A RFC1918. Oráculo de rebind hits=3, witness no body |
Alcançar uma URL Git literal 0.0.0.1 | Mesmo Test com http://0.0.0.1:18080/lab/gitsync.git | Recon | Comprovado em lab que não é bloqueado na admissão (status 400 de transporte, não 422 public-or-allowed) |
| Ler Git Smart HTTP / corpo HTTP desse host nos erros do Test | gitRepository.Test interpola o erro de transporte | Recon | Inferido a partir do pin. O lab usou um git advertisement 200 |
| Rebind para RFC1918 / CGNAT após a admissão | TOCTOU: valida o DNS e depois o nanogit disca | Recon | Comprovado em lab para o sidecar RFC1918 172.30.60.3 |
Leitura por Viewer do spec.*.url armazenado, incluindo userinfo | repositories:read | Recon | Inferido a partir do pin. Não é este lab |
Fechado neste resquício (comprovado em lab): loopback literal 127.0.0.1 422; RFC1918 literal 10.0.0.1 422; IMDS 169.254.169.254 422. Fechado: Editor não pode criar repositórios. Não é RCE. Não requer Grafana Admin. Ignorar Grafana G2 (IAM SSOSetting k8s authorizer).
A admissão em apps/provisioning/pkg/repository/validator.go chama URLValidator.ValidateURL. isBlockedIP tem quatro predicados. Unspecified é apenas 0.0.0.0 / ::. O restante de 0.0.0.0/8 e CGNAT passa. O clone depois usa nanogit.NewHTTPClient(gitConfig.URL) e re-resolve.
Caminhos errados já registrados: tratar URLs de DS de Org Admin como este resquício (essas são intencionais; isto é o bypass do validador do Git Sync); esperar que o IMDS 169.254 passasse (bloqueado na admissão); criação por Editor (negada); uma reverse shell. Teatro.
python3 grafana-gitsync-dns-rebind-Abraxas-Labs.py
ou:
cd lab
./run.sh
Loopback: Grafana 127.0.0.1:19360, controle de DNS 127.0.0.1:19361, oráculo de rebind 127.0.0.1:19362. Imagem 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
Fixar o endereço resolvido durante o clone/Test, ou revalidar em cada discagem. Tratar 0.0.0.0/8 e CGNAT como bloqueados. Não ignorar o DNS em hosts na allowlist sem fixação.
GNU Affero GPL v3.0. Ver LICENSE. Apenas lab em loopback. Sem garantia.