
Grafana OSS 13.2.3 - Alta - Remota - SSRF - Git Sync URLValidator es solo DNS de admisión
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-gitsync-dns-rebind
Clase: SSRF Alcance: Remoto
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
Git Sync URLValidator comprueba el host de la URL del repositorio en la admisión. nanogit / Test vuelven a resolver más tarde sin fijar la IP. isBlockedIP solo cubre loopback, RFC1918, link-local y no especificada. El literal 0.0.0.1 no está bloqueado. Un nombre de host que es público en el momento de la validación puede reasignarse a RFC1918 para el GET del clonado.
Que un Org Admin pruebe una URL de Git con rebinding hace que Grafana haga GET a un host interno que el validador fue escrito para rechazar.
| ID | aún sin CVE |
| Clase | SSRF (DNS rebind / hueco en 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 |
| Producto | Grafana OSS |
| Afectado | 13.2.3 (6193dc0); Git Sync activado por defecto |
| Auth | Org Admin (repositories:create / :write). No creación por Viewer/Editor. |
| Licencia | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
El actor es Org Admin, no un desconocido. Un Org Admin ya puede apuntar datasources a URLs internas en OSS. Este residuo es un bypass del URLValidator de Git Sync que estaba destinado a cerrar esa clase para las URLs de repositorio.
| Privilegio | Método / sink | Recon / integridad / disponibilidad | Probado en lab o inferido |
|---|---|---|---|
| Hacer que Grafana haga GET a una URL de Git con rebinding | Org Admin POST .../repositories/{name}/test con spec.git.url=http://git.lab/... | Recon (HTTP saliente desde el proceso de Grafana) | Probado en lab. DNS A1 público, después A RFC1918. Oráculo de rebind hits=3, testigo en el body |
Alcanzar una URL de Git literal 0.0.0.1 | Mismo Test con http://0.0.0.1:18080/lab/gitsync.git | Recon | Probado en lab que no se bloquea en la admisión (status 400 de transporte, no 422 público-o-permitido) |
| Leer Git Smart HTTP / body HTTP desde ese host en los errores de Test | gitRepository.Test interpola el error de transporte | Recon | Inferido a partir del pin. El lab usó un anuncio git 200 |
| Rebind a RFC1918 / CGNAT tras la admisión | TOCTOU: validar DNS y luego marcar nanogit | Recon | Probado en lab para el sidecar RFC1918 172.30.60.3 |
Lectura por Viewer del spec.*.url almacenado, incluido userinfo | repositories:read | Recon | Inferido a partir del pin. No en este lab |
Cerrado en este residuo (probado en lab): loopback literal 127.0.0.1 422; RFC1918 literal 10.0.0.1 422; IMDS 169.254.169.254 422. Cerrado: Editor no puede crear repos. No es RCE. No requiere Grafana Admin. Se omite Grafana G2 (IAM SSOSetting k8s authorizer).
La admisión en apps/provisioning/pkg/repository/validator.go llama a URLValidator.ValidateURL. isBlockedIP son cuatro predicados. No especificada es solo 0.0.0.0 / ::. El resto de 0.0.0.0/8 y CGNAT pasan. El clonado posterior usa nanogit.NewHTTPClient(gitConfig.URL) y vuelve a resolver.
Caminos equivocados ya registrados: tratar las URLs de DS de Org Admin como este residuo (esas son intencionadas; esto es el bypass del validador de Git Sync); esperar que IMDS 169.254 pase (bloqueado en la admisión); creación por Editor (denegada); una reverse shell. Teatro.
python3 grafana-gitsync-dns-rebind-Abraxas-Labs.py
o:
cd lab
./run.sh
Loopback: Grafana 127.0.0.1:19360, control DNS 127.0.0.1:19361, oráculo de rebind 127.0.0.1:19362. Imagen 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
Fijar la dirección resuelta durante el clonado/Test, o revalidar en cada marcado. Tratar 0.0.0.0/8 y CGNAT como bloqueados. No omitir el DNS en hosts en allowlist sin fijar la IP.
GNU Affero GPL v3.0. Ver LICENSE. Solo lab en loopback. Sin garantía.