
Grafana OSS 13.2.3 - 높음 - 원격 - SSRF - Git Sync URLValidator는 admission-only 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는 루프백, RFC1918, 링크-로컬, 그리고 미지정 주소만 해당한다. 리터럴 0.0.0.1은 차단되지 않는다. 검증 시점에 공인인 호스트명은 clone GET 시점에 RFC1918로 리바인딩될 수 있다.
리바인딩 Git URL에 대한 Org Admin Test는 Grafana가 검증기가 거부하도록 작성된 내부 호스트에 GET 요청을 보내게 만든다.
| ID | 아직 CVE 없음 |
| 분류 | SSRF (DNS 리바인드 / 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은 OSS에서 이미 데이터소스를 내부 URL로 지정할 수 있다. 이 잔여 취약점은 저장소 URL에 대해 해당 부류를 차단하기 위해 만들어진 Git Sync URLValidator의 우회다.
| 권한 | 메서드 / 싱크 | 정찰 / 무결성 / 가용성 | 랩 검증 또는 추론 |
|---|---|---|---|
| Grafana가 리바인딩 Git URL에 GET 요청을 보내게 함 | Org Admin POST .../repositories/{name}/test with spec.git.url=http://git.lab/... | 정찰 (Grafana 프로세스에서의 아웃바운드 HTTP) | 랩 검증. DNS A1 공인, 이후 A RFC1918. 리바인드 오라클 hits=3, witness in body |
리터럴 0.0.0.1 Git URL에 도달 | 동일한 Test with http://0.0.0.1:18080/lab/gitsync.git | 정찰 | 랩 검증: 승인 시점에 차단되지 않음 (status 400 transport, not 422 public-or-allowed) |
| 해당 호스트에서 Git Smart HTTP / HTTP 본문을 Test 오류로 읽기 | gitRepository.Test가 전송 오류를 보간 | 정찰 | 핀에서 추론. 랩은 200 git advertisement 사용 |
| 승인 후 RFC1918 / CGNAT으로 리바인드 | TOCTOU: DNS 검증 후 nanogit 다이얼 | 정찰 | RFC1918 사이드카 172.30.60.3에 대해 랩 검증 |
userinfo를 포함한 저장된 spec.*.url의 Viewer 읽기 | repositories:read | 정찰 | 핀에서 추론. 이 랩은 아님 |
이 잔여 취약점에서 차단됨 (랩 검증): 리터럴 루프백 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는 네 가지 조건이다. 미지정은 0.0.0.0 / ::만 해당한다. 0.0.0.0/8의 나머지와 CGNAT은 통과한다. 이후 clone은 nanogit.NewHTTPClient(gitConfig.URL)을 사용하고 다시 해석한다.
이미 기록된 잘못된 접근: Org Admin DS URL을 이 잔여 취약점으로 취급 (그것들은 의도된 것; 이것은 Git Sync 검증기 우회); IMDS 169.254가 통과할 것이라 기대 (승인 시점에 차단됨); Editor 생성 (거부됨); 리버스 셸. 연극.
python3 grafana-gitsync-dns-rebind-Abraxas-Labs.py
또는:
cd lab
./run.sh
루프백: 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 전반에 걸쳐 해석된 주소를 고정하거나, 매 다이얼마다 재검증하라. 0.0.0.0/8과 CGNAT을 차단으로 취급하라. 고정 없이 허용 목록 호스트에서 DNS를 건너뛰지 마라.
GNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.