
Grafana OSS 13.2.3 — высокий — удалённый — SSRF — Git Sync URLValidator выполняет проверку DNS только при допуске
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · grafana-gitsync-dns-rebind
Класс: SSRF Достижимость: Удалённая
Grafana OSS 13.2.3 (6193dc0) - Grafana Labs
Git Sync URLValidator проверяет хост URL репозитория при приёме. nanogit / Test выполняют повторное разрешение позже без фиксации IP. isBlockedIP охватывает только loopback, RFC1918, link-local и unspecified. Литерал 0.0.0.1 не блокируется. Имя хоста, являющееся публичным на момент валидации, может быть перепривязано к RFC1918 для GET при клонировании.
Проверка Org Admin перепривязывающегося Git URL заставляет Grafana выполнить GET внутреннего хоста, который валидатор был написан отклонять.
| ID | CVE пока нет |
| Класс | SSRF (DNS rebind / пробел 0.0.0.0/8) |
| Достижимость | Удалённая (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 |
| Продукт | Grafana OSS |
| Затронуто | 13.2.3 (6193dc0); Git Sync включён по умолчанию |
| Аутентификация | Org Admin (repositories:create / :write). Не создание Viewer/Editor. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Действующее лицо — Org Admin, а не посторонний. Org Admin и так может направить datasources на внутренние URL в OSS. Этот остаток — обход URLValidator Git Sync, который должен был закрыть этот класс для URL репозиториев.
| Привилегия | Метод / sink | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|
| Заставить Grafana выполнить GET перепривязывающегося Git URL | Org Admin POST .../repositories/{name}/test с spec.git.url=http://git.lab/... | Разведка (исходящий HTTP из процесса Grafana) | Доказано в лаборатории. DNS A1 публичный, позже A RFC1918. Оракул перепривязки hits=3, свидетель в теле |
Достичь литерального 0.0.0.1 Git URL | Тот же Test с http://0.0.0.1:18080/lab/gitsync.git | Разведка | Доказано в лаборатории, не блокируется при приёме (статус 400 transport, а не 422 public-or-allowed) |
| Прочитать Git Smart HTTP / HTTP тело с этого хоста в ошибки Test | gitRepository.Test интерполирует ошибку транспорта | Разведка | Выведено из фиксации. В лаборатории использовалась 200 git advertisement |
| Перепривязка к RFC1918 / CGNAT после приёма | TOCTOU: валидация DNS, затем dial nanogit | Разведка | Доказано в лаборатории для RFC1918 sidecar 172.30.60.3 |
Чтение Viewer сохранённого spec.*.url, включая userinfo | repositories:read | Разведка | Выведено из фиксации. Не эта лаборатория |
Закрыто на этом остатке (доказано в лаборатории): литеральный loopback 127.0.0.1 422; литеральный RFC1918 10.0.0.1 422; IMDS 169.254.169.254 422. Закрыто: Editor не может создавать репозитории. Не RCE. Grafana Admin не требуется. Пропуск Grafana G2 (IAM SSOSetting k8s authorizer).
Приём в apps/provisioning/pkg/repository/validator.go вызывает URLValidator.ValidateURL. isBlockedIP — это четыре предиката. Unspecified — только 0.0.0.0 / ::. Остаток 0.0.0.0/8 и CGNAT проходят. Клонирование позже использует nanogit.NewHTTPClient(gitConfig.URL) и выполняет повторное разрешение.
Уже зафиксированные ложные пути: трактовка Org Admin DS URL как этого остатка (они предназначены; это обход валидатора Git Sync); ожидание, что IMDS 169.254 пройдёт (блокируется при приёме); создание Editor (отказано); reverse shell. Театр.
python3 grafana-gitsync-dns-rebind-Abraxas-Labs.py
или:
cd lab
./run.sh
Loopback: Grafana 127.0.0.1:19360, управление DNS 127.0.0.1:19361, оракул перепривязки 127.0.0.1:19362. Образ 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
Зафиксируйте разрешённый адрес на протяжении clone/Test или повторно валидируйте при каждом dial. Считайте 0.0.0.0/8 и CGNAT заблокированными. Не пропускайте DNS на хостах из allowlist без фиксации.
GNU Affero GPL v3.0. См. LICENSE. Только loopback-лаборатория. Без гарантий.