
Gitea 권한 우회에 대한 개념 증명(Proof-of-concept) 랩으로, write:organization 권한을 가진 공개 전용 PAT가 POST /api/v1/orgs를 통해 비공개 조직을 생성합니다.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-public-only-pat-org
Gitea 1.27.3 - Gitea
PAT에 public-only를 설정하는 것은 해당 토큰이 비공개 리소스에 접근할 수 없다는 약속이어야 한다. POST /user/repos에는 rejectPublicOnly가 있다. POST /orgs에는 tokenRequiresScopes와 reqToken이 있다. rejectPublicOnly는 없다. DEFAULT_ALLOW_CREATE_ORGANIZATION은 기본값이 true이다.
write:organization 권한이 있는 public-only PAT가 비공개 조직을 생성한다. 같은 토큰으로는 비공개 사용자 저장소를 생성할 수 없다.
| ID | 아직 CVE 없음 |
| CWE | CWE-863 |
| CVSS | Medium: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N |
| 제품 | Gitea |
| 영향받는 버전 | v1.27.3 (146cc3e)까지 |
| 인증 | org write 권한이 있는 public-only PAT |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
탈취되었거나 과도하게 발급된 public-only PAT 중 write:organization도 가진 것을 사용한다. 비공개 조직을 생성한다. 그 조직은 토큰이 만들 수 없어야 했던 은신처이다. 같은 토큰으로는 여전히 비공개 사용자 저장소를 생성할 수 없으며, 이 버그가 다른 사람의 기존 비공개 git을 열어주지는 않는다.
무결성 문제이지 비공개 git 덤프가 아니다. 피해자가 의도적으로 "public-only"를 발급한 경우에 유용하다. CI, 봇, 비공개 조직을 만들 수 없다고 생각한 계약자 토큰 등.
조직 저장소 생성은 조직 가시성만 확인한다. 더 이상 사용되지 않는 POST /org/{org}/repos는 public-only를 완전히 건너뛴다. 나는 조직 생성을 랩에서 확인했다. 그것으로 충분하다.
hostmatcher 0.0.0.0/8 랩과 같은 잔여 점검 작업이었다. GHSA 물결 이후의 v1.27.3, 그리고 형제 핸들러에는 이미 있는 게이트를 여전히 건너뛰는 핸들러들. 가시성과 토큰 스코프 버그가 그 물결의 주제였다. api.go에서 rejectPublicOnly를 grep했다. 사용자 저장소 생성에는 있다. 조직 생성에는 없다.
스코프가 public-only,write:organization,write:repository,write:user인 PAT를 발급했다. 비공개 조직 생성은 201을 반환했다. 같은 토큰으로 비공개 사용자 저장소 생성은 403 this endpoint is not available for public-only tokens를 반환했다. 그 403이 대조군이다. 둘 다 201이었다면 미들웨어가 완전히 사라진 것이다. 둘 다 403이었다면 신고할 것이 없었을 것이다.
이미 기록된 잘못된 방향들: 조직 HTTP 201을 충분하다고 간주하기 (GET에서 visibility=private 확인); 비공개 사용자 저장소 생성 성공 (그렇다면 rejectPublicOnly가 사라진 것 - 랩에서는 403이 필요함); 기존 비공개 git 내용 읽기; 리버스 셸. 쇼에 불과하다.
cd lab
./run.sh
오직 http://127.0.0.1:18132만 대상으로 한다. Compose가 DEFAULT_ALLOW_CREATE_ORGANIZATION=true를 설정한다.
token-scopes=public-only,write:organization,write:repository,write:user
org-create status=201
org-visibility='private'
user-repo-create status=403 this endpoint is not available for public-only tokens
SUCCESS GITEA-PUBLIC-ONLY-PAT
POST /orgs에 rejectPublicOnly()를 추가하고, 조직 저장소 생성도 public-only에 민감한 것으로 취급해야 한다. public-only 조직 생성은 비공개 사용자 저장소 생성이 이미 그러하듯 403을 반환해야 한다.
api.go (rejectPublicOnly, POST /orgs, POST /user/repos)GNU Affero GPL v3.0. LICENSE 참조. 루프백 랩 전용. 보증 없음.