Gogs Allows Cross-Repository Comment Deletion via DeleteComment
Description
Gogs is an open source self-hosted Git service. In versions 0.13.4 and below, the DeleteComment API does not verify that the comment belongs to the repository specified in the URL. This allows a repository administrator to delete comments from any other repository by supplying arbitrary comment IDs, bypassing authorization controls. The DeleteComment function retrieves a comment by ID without verifying repository ownership and the Database function DeleteCommentByID performs no repository validation. This issue has been fixed in version 0.14.0.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
gogs.io/gogsGo | < 0.14.0 | 0.14.0 |
Affected products
1Patches
11b226ca48dc8repo: improve authz for resources (#8119)
3 files changed · +61 −1
internal/route/api/v1/repo/issue_comment.go+22 −0 modified@@ -88,6 +88,17 @@ func EditIssueComment(c *context.APIContext, form api.EditIssueCommentOption) { return } + issue, err := database.GetIssueByID(comment.IssueID) + if err != nil { + c.NotFoundOrError(err, "get issue by ID") + return + } + + if issue.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + if c.User.ID != comment.PosterID && !c.Repo.IsAdmin() { c.Status(http.StatusForbidden) return @@ -112,6 +123,17 @@ func DeleteIssueComment(c *context.APIContext) { return } + issue, err := database.GetIssueByID(comment.IssueID) + if err != nil { + c.NotFoundOrError(err, "get issue by ID") + return + } + + if issue.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + if c.User.ID != comment.PosterID && !c.Repo.IsAdmin() { c.Status(http.StatusForbidden) return
internal/route/api/v1/repo/key.go+17 −1 modified@@ -45,6 +45,11 @@ func GetDeployKey(c *context.APIContext) { return } + if key.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + if err = key.GetContent(); err != nil { c.Error(err, "get content") return @@ -94,7 +99,18 @@ func CreateDeployKey(c *context.APIContext, form api.CreateKeyOption) { // https://github.com/gogs/go-gogs-client/wiki/Repositories-Deploy-Keys#remove-a-deploy-key func DeleteDeploykey(c *context.APIContext) { - if err := database.DeleteDeployKey(c.User, c.ParamsInt64(":id")); err != nil { + key, err := database.GetDeployKeyByID(c.ParamsInt64(":id")) + if err != nil { + c.NotFoundOrError(err, "get deploy key by ID") + return + } + + if key.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + + if err := database.DeleteDeployKey(c.User, key.ID); err != nil { if database.IsErrKeyAccessDenied(err) { c.ErrorStatus(http.StatusForbidden, errors.New("You do not have access to this key")) } else {
internal/route/repo/issue.go+22 −0 modified@@ -926,6 +926,17 @@ func UpdateCommentContent(c *context.Context) { return } + issue, err := database.GetIssueByID(comment.IssueID) + if err != nil { + c.NotFoundOrError(err, "get issue by ID") + return + } + + if issue.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + if c.UserID() != comment.PosterID && !c.Repo.IsAdmin() { c.NotFound() return @@ -959,6 +970,17 @@ func DeleteComment(c *context.Context) { return } + issue, err := database.GetIssueByID(comment.IssueID) + if err != nil { + c.NotFoundOrError(err, "get issue by ID") + return + } + + if issue.RepoID != c.Repo.Repository.ID { + c.NotFound() + return + } + if c.UserID() != comment.PosterID && !c.Repo.IsAdmin() { c.NotFound() return
Vulnerability mechanics
Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
4- github.com/advisories/GHSA-jj5m-h57j-5gv7ghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2026-25120ghsaADVISORY
- github.com/gogs/gogs/commit/1b226ca48dc8b3e95cc1c41229d72819c960a1b7ghsax_refsource_MISCWEB
- github.com/gogs/gogs/security/advisories/GHSA-jj5m-h57j-5gv7ghsax_refsource_CONFIRMWEB
News mentions
0No linked articles in our index yet.