{"id":"CVE-2026-52815","title":"Gogs Vulnerable to Unauthenticated Organization Teams Information Disclosure via API","summary":"Gogs Vulnerable to Unauthenticated Organization Teams Information Disclosure via API","severity":"medium","cwe":["CWE-200"],"vendor":"gogs","product":"gogs.io/gogs","ecosystem":"go","affected":["gogs.io/gogs < 0.14.3"],"patched":["gogs.io/gogs 0.14.3"],"published":"2026-06-23","updated":"2026-06-23","source":"GHSA","sourceUrl":"https://github.com/advisories/GHSA-744x-3838-5r56","references":[{"url":"https://github.com/gogs/gogs/security/advisories/GHSA-744x-3838-5r56"},{"url":"https://github.com/gogs/gogs/pull/8336"},{"url":"https://github.com/gogs/gogs/commit/2ebc0e27069deade992219e10a89fbc44bec8bb9"},{"url":"https://github.com/gogs/gogs/releases/tag/v0.14.3"},{"url":"https://github.com/advisories/GHSA-744x-3838-5r56"}],"tags":["ghsa","go","exploit-available"],"epss":0.01488,"epssPercentile":0.72927,"ingestedAt":"2026-06-29T13:24:35.463Z","exploits":{"nuclei":["CVE-2026-52815"],"checkedAt":"2026-09-23T07:14:13.070Z"},"exploitAvailable":true,"slug":"CVE-2026-52815","body":"## Overview\n\n## Summary\n\nGogs has an unauthenticated information disclosure vulnerability. The `GET /api/v1/orgs/:orgname/teams` endpoint at `internal/route/api/v1/org_team.go:8` returns all teams for any organization without requiring authentication. The route group at `internal/route/api/v1/api.go:380-385` lacks the `reqToken()` middleware, and the `listTeams()` handler performs no authentication check, exposing team IDs, names, descriptions, and permission levels to any unauthenticated caller.\n\n## Affected Versions\n\nGogs (all current versions)\n\n## Vulnerability Details\n\n### Root Cause: Missing reqToken() middleware on org teams route group\n\n`internal/route/api/v1/api.go` lines 380-385:\n\n```go\n// Org teams route group — no reqToken() middleware\nm.Group(\"/:orgname\", func() {\n    m.Get(\"/teams\", org.ListTeams) // No auth required\n}, orgAssignment(true))\n```\n\nThe `orgAssignment(true)` middleware only loads the organization object — it performs no authentication. The `listTeams()` handler at `org_team.go:8` returns all teams unconditionally:\n\n```go\nfunc ListTeams(c *context.APIContext) {\n    org := c.Org.Organization\n    teams, err := database.GetTeamsByOrgID(org.ID)\n    // Returns all teams — no c.IsLogged check, no permission check\n}\n```\n\nCompare with other org endpoints that correctly require authentication:\n\n```go\nm.Group(\"/orgs/:orgname\", func() {\n    // ... other endpoints ...\n}, reqToken(), orgAssignment(true, true)) // reqToken() enforces auth\n```\n\n### Attack Chain\n\n- Attacker sends `GET /api/v1/orgs/target-org/teams` with no authentication\n- `orgAssignment(true)` loads the organization but does not check auth\n- `ListTeams()` queries all teams and returns them\n- Response includes team IDs, names, descriptions, and permission levels (read/write/admin/owner)\n\n## Proof of Concept\n\n```bash\n# List all teams in an organization — no authentication needed\ncurl -s \"http://TARGET:3000/api/v1/orgs/myorg/teams\" | python3 -m json.tool\n\n# Expected: 200 OK with full team list\n# [\n#   {\n#     \"id\": 1,\n#     \"name\": \"Owners\",\n#     \"description\": \"Admin team\",\n#     \"permission\": \"owner\"\n#   },\n#   {\n#     \"id\": 2,\n#     \"name\": \"backend-devs\",\n#     \"description\": \"Backend development team\",\n#     \"permission\": \"write\"\n#   }\n# ]\n```\n\n## Impact\n\nAn unauthenticated attacker can:\n\n- Enumerate all teams within any organization, including private/internal teams\n- Discover team permission levels (read/write/admin/owner), aiding privilege escalation planning\n- Map organizational structure and identify high-value targets (admin/owner teams)\n- Harvest team IDs for use in other API calls that may have weaker authorization checks\n\n## Suggested Remediation\n\n```go\nm.Group(\"/:orgname\", func() {\n    m.Get(\"/teams\", org.ListTeams)\n}, reqToken(), orgAssignment(true))\n```\n\nAdd `reqToken()` middleware to the org teams route group, consistent with other authenticated org endpoints. Additionally, `ListTeams()` should verify the authenticated user is a member of the organization.\n\n## Affected packages\n\n- `gogs.io/gogs < 0.14.3`\n\n## Remediation\n\nUpgrade to a patched release:\n\n- `gogs.io/gogs 0.14.3`","depth":"twilight","depthScore":40,"depthScoreParts":{"impact":27.5,"likelihood":0.3,"exploitation":12,"ransomware":0},"changes":[{"seq":5303,"id":"CVE-2026-52815","ts":1788887264125,"field":"exploit_available","old":"false","new":"true"},{"seq":4186,"id":"CVE-2026-52815","ts":1788886378920,"field":"exploit_available","old":"true","new":"false"},{"seq":2947,"id":"CVE-2026-52815","ts":1788883043737,"field":"exploit_available","old":"false","new":"true"},{"seq":1976,"id":"CVE-2026-52815","ts":1788882448216,"field":"exploit_available","old":"true","new":"false"},{"seq":1062,"id":"CVE-2026-52815","ts":1788881883852,"field":"exploit_available","old":"false","new":"true"}]}