VersionDrift
Product

Gitea 1.27.3 → 28.3.0

4 releases · 3 breaking changes · 8 security fixes · 60 advisories fixed

8security3breaking1deprecated35feature105fix

Vulnerabilities fixed by this upgrade

  • medium CVE-2026-119625 GET /{user}.rss / .atom leak private activity to a scope-confined API token (2nd incomplete-fix follow-up of GHSA-6cqf-375w-639g, user feed never got the scope-category check the repo feeds did)
  • 6.5 CVE-2026-112887 Gitea Actions task tokens authenticate to the REST API with no token scope, enabling instance-wide private repository enumeration via GET /api/v1/user/repos
  • medium CVE-2026-116474 Actions token can spoof instance-signed commits by adding a GPG key
  • 5.3 CVE-2026-119533 Public project boards disclose private pull request titles and repository names
  • 6.5 CVE-2026-118504 API Issue Mutation Archive Restriction Bypass
  • medium CVE-2026-117677 Helm chart upload: unbounded gzip+tar metadata parse before the package-size quota gate (CWE-409/CWE-400 decompression amplification)
  • 6.5 CVE-2026-117649 Cross-repository issue dependency and timeline read path serializes private issue title/body and attachments without the source repository access check (LoadDepIssueDetails/ToAPIIssue without ACL)
  • 4.3 CVE-2026-118395 Deprecated POST /org/{org}/repos skips rejectPublicOnly; public-only tokens can create private repositories
  • 4.3 CVE-2026-117646 Public-only tokens expose private repositories through profile and organization tabs
  • 6.5 CVE-2026-116289 Public-only PAT scope bypass via Actions runner registration leaks private repository secrets
  • 4.3 CVE-2026-114199 Contribution heatmap discloses private-repository contribution counts to public-only tokens (GetUserHeatmapData never reads ctx.PublicOnly while activity feeds do)
  • 4.3 CVE-2026-119627 Gitea web profile and feed routes bypass public-only token scope for limited-visibility users
  • 4.3 CVE-2026-118394 OIDC userinfo: the public-only token scope is not enforced when the token arrives as a query parameter (residual of CVE-2026-55982)
  • 8.7 CVE-2026-113429 Stored XSS on the Gitea origin through the v3 artifact Content-Encoding header
  • 8.1 CVE-2026-116296 Write collaborators can replace and destroy releases, milestones and labels on archived repositories (archived write-protection bypass)
  • 8.1 CVE-2026-119441 Public-Only Token Bypass on Bulk Organization Repository Deletion
  • 8.1 CVE-2026-117635 Public-only tokens bypass private-resource restrictions on the admin API
  • 7.1 CVE-2026-117685 Public-only package tokens can access private OCI blobs
  • high CVE-2026-120263 Account Takeover via OAuth2 Auto-Linking with Attacker-Controlled Username
  • 8.1 CVE-2026-118386 Actions: fork workflow gets secrets and write token via review commit_id
  • low CVE-2026-107618 Cross-Site Request Forgery on `POST /{owner}/{repo}/topics`
  • 3.5 CVE-2026-97204 DeleteLabel compares one untyped id against whichever namespace the label uses, letting a repo collaborator delete an ID-colliding organisation's labels
  • 6.5 CVE-2026-110324 Private profile information leaks on POST request
  • 6.5 CVE-2026-105964 Gitea Actions Artifact V4 API: unbounded request body read in parseProtobufBody enables memory-exhaustion DoS
  • 4.3 CVE-2026-110311 Draft releases include attachment metadata from other repositories
  • 5.3 CVE-2026-105661 Unauthenticated nil-pointer panic on /{username}/-/repositories for individual users
  • 6.3 CVE-2026-110494 Gitea AddReleaseAttachments missing IssueID check allows issue attachment metadata exposure and deletion via releases
  • 4.3 CVE-2026-107686 Locked issues and comments still accept reactions through the web UI
  • 8.1 CVE-2026-104627 Cross-Session OpenID Credential Linking Enables Account Takeover
  • 7.5 CVE-2026-109553 VerifyCert maps SSH certificate principals onto other users' SSH public keys
  • 6.5 CVE-2026-104633 A migration source reporting max_response_items: 0 makes six paginated loops in the Gitea downloader never terminate, exhausting server memory from one authenticated request
  • 6.5 CVE-2026-105267 POST /{owner}/{repo}/tags/delete requires only Code:Write but destroys Releases and their attachment blobs
  • medium CVE-2026-97626 Web RSS/Atom Accept-header bypass leaks activity feeds of limited/private users and orgs
  • 5.4 CVE-2026-89182 Gitea push-to-create ignores ForcePrivate server policy, allowing non-admin users to publish repositories as public
  • 4.3 CVE-2026-105268 Issue-scoped attachment routes accept comment-scoped attachment ids, letting an issue opener delete or rename other users' comment attachments
  • medium CVE-2026-101023 OAuth access tokens can be exchanged as refresh tokens
  • 8.5 CVE-2026-96594 Stored XSS via Repository Media API
  • 7.1 CVE-2026-86684 Push-mirror API checks local-path permission on the repository owner instead of the caller
  • 8.1 CVE-2026-97208 Gitea push-mirror creation API does not enforce the site-wide DISABLE_NEW_PUSH policy
  • medium CVE-2026-95112 Algorithmic Complexity DoS in Issue Reference Parsing
  • medium CVE-2026-103504 API team demotion does not reset unit permissions
  • medium CVE-2026-79960 Deploy keys impersonate the repository owner in the hook pipeline
  • 4.3 CVE-2026-104636 Raw Git redirect SSRF bypass in push mirrors, WikiRemoteURL, and PR-head fetches
  • 4.3 CVE-2026-96400 Migration SSRF policy regression: ALLOWED_DOMAINS permits reserved addresses despite ALLOW_LOCALNETWORKS=false
  • 4.3 CVE-2026-96589 Incorrect Authorization in Repository Transfer Allows Persistent Unauthorized Read Access
  • 8.1 CVE-2026-96404 Installer Re-run Against an Already-Populated Database Grants an Authenticated Session for an Existing Admin Account Without Password Verification
  • 7.1 CVE-2026-96399 Uncaught Exception and Out-of-bounds Read results in Gitea crash
  • 8.5 CVE-2026-89430 Gitea Push Mirror Host Policy Bypass Enables SSRF and Forced Writes to Internal Git Repositories
  • 8.5 CVE-2026-101029 Migration / pull-mirror SSRF, egress allow-list bypass via multi-answer DNS - 3 findings
  • 7.7 CVE-2026-101027 SSRF via DNS rebinding: MatchHostOrIP short-circuits IP check when hostname matches ALLOWED_DOMAINS
  • high CVE-2026-70357 Migration SSRF via DNS Rebinding — TOCTOU Between DNS Validation and Git Connection
  • 9.0 CVE-2026-95106 Duplicate tree-entry name: Gitea renders the benign blob while checkout and CI run the malicious one
  • 9.0 CVE-2026-103667 Stored XSS in Gitea container registry via unvalidated blob Content-Type (mediaType injection)
  • 9.1 CVE-2026-103059 Built-in SSH server auth bypass via case-insensitive LIKE key lookup
  • 8.7 CVE-2026-94205 Gitea Actions: fork pull request approval bypass via maintainer-triggered pull_request sub-events (ifNeedApprovalWith keys on the event actor, not the pull request author)
  • medium CVE-2026-96580 Uncontrolled resource consumption — unapproved fork-PR workflow with a large static strategy.matrix exhausts server memory at run-creation
  • high CVE-2026-103670 Unapproved fork PR cancels trusted in-progress runs via run-level concurrency
  • 9.0 CVE-2026-104626 Cancelled fork-PR Actions jobs are revived by later approval
  • 9.0 CVE-2026-104632 Untrusted first-time fork PR achieves self-hosted Actions runner RCE without approval via cancel-then-rerun
  • 9.9 CVE-2026-73802 Sandbox Escape to Host RCE: Gitea act_runner Privileged Mode Bypass via Unsanitized container.options

Breaking changes

  • breaking BREAKING in 28.0.0
  • breaking Fix(git)!: route Git network operations through an internal proxy and update egress settings () in 28.0.0
  • breaking Feat(actions)!: add RUN_RETENTION_DAYS to delete old action runs () in 28.0.0

Security changes

  • security Fixes CVE-2026-57894: Repository Migration Follows Git HTTP Redirects After URL Allow/Block Validation, Enabling Internal Git Repository Exfiltration in 28.0.0
  • security SECURITY in 28.0.0
  • security Fix(deps): update module golang.org/x/image to v0.45.0 [security] () in 28.0.0
  • security Fix(deps): update module golang.org/x/mod to v0.40.0 [security] () in 28.0.0
  • security Fix(deps): update dependency mermaid to v11.16.1 [security] () in 28.0.0
  • security Fix(deps): update module github.com/getkin/kin-openapi to v0.144.0 [security] () in 28.0.0
  • security Fix(deps): update dependency js-yaml to v5.2.2 [security] () in 28.0.0
  • security Fix(deps): update module google.golang.org/grpc to v1.82.1 [security] () in 28.0.0

Deprecations

  • deprecated Enhance(packages/npm): expand version metadata and support npm deprecate () in 28.0.0

Every release in between

featureImprove hover border of colored button groups (#39861) (#39899)
feature(webhook) Mention release assets in notifications (#39631) (#39912)
feature(project) Filter project milestones by linked issues (#39958) (#39984)
fix(pulls) Tolerate invalid stored review commit_id (#39849) (#39857)
fix(api) Skip label lookup in ListIssues when no labels filter given (#39890) (#39893)
fixPrevent system users from watching a repository (#39886) (#39895)
fixOff-by-one errors in code comment patches (#39887) (#39904)
fixUse clear error message when failed to parse git version (#39898) (#39903)
fix(packages) Reject newline-bearing rubygems dependency metadata (#39782) (#39900)
fixEnforce public-only token scope on more routes (#39690) (#39853)
fix(api) Return 4xx for invalid fork repository names (#39909) (#39919)
fix(lfs) Send the default branch as ref in batch download requests (#39891) (#39920)
fix(api) Keep milestone due date when it is omitted in edit request (#39869) (#39921)
fix(oauth2) Decode form-encoded client credentials in HTTP Basic auth (#39926) (#39931)
fix(issues) Keep one row per issue when sorting by exclusive label order (#39364) (#39928)
fix(api) Check unit read permission in issue sub-resource endpoints (#39885) (#39938)
fix(migrations) Use cursor pagination for GitHub issue migration too (#39888) (#39941)
fix(feed) Hide release notes in tags feed without releases access (#39944) (#39949)
fix(api) Adding issue labels by name attaches both the repo and the org label (#39873) (#39951)
fix(actions) Bound requested artifact retention (#39894) (#39946)
fix(actions) Drop untrusted Content-Encoding from v1 artifact uploads (#39855) (#39996)
fixGet valid UTF-8 for diff_hunk and composer readme (#39932) (#40000)
fix(diff) Load both blobs of renamed files for diff rendering (#39969) (#39992)
fix(migrations) Update gitea sdk to fix nil pointer panic (#39999)
fixFix OneDev migration with OneDev 16.8 and newer (#40017) (#40026)
fix(git) Default to the gc maintenance strategy (#40022) (#40029)
fixReplace null char with space for issue/comment content (#40014) (#40034)
fix(issue) Prevent redirect to external tracker when built-in tracker is enabled (#39997) (#40031)
fix(markup) Keep commit title emoji inside links (#39986) (#40032)
fix(repo) Use the viewed ref's editorconfig in file view, blame and editor (#39973) (#40019)
fix(deps) Update module golang.org/x/net to v0.62.0 [security] (#40050) (#40051)
fixSize mermaid iframe by the diagram's aspect ratio (#40046) (#40052)
fix(feed) Require code read access for the repo home branch feed (#39964) (#40067)
fixAdd missing access checks and size limits (#39942) (#40085)
fix(user) Answer the follow of a bot user with the profile card (#39980) (#40086)
fix(repo) Honor ALLOW_FORK_INTO_SAME_OWNER for organizations (#40025) (#40094)
fix(ui) Ignore code line anchors below 1, show JS errors in vite dev mode (#39432) (#40087)
fix(pull) Refuse review comments on locked pull requests (#39960) (#40084)
fix(api) Answer 409 when repository files already exist on disk (#40095) (#40098)
fix(mail) Preserve outer spacing in notification emails (#40104) (#40111)
+16 more items in the release notes
feature(oauth) Pre-register a builtin OAuth2 application for gitea-vscode (#39785) (#39801)
featureAllow custom watches to bypass on-mention email restriction (#39652) (#39837)
fixVarious bugs (#39661) (#39667)
fix(markup) Display MathML has no space below it (#39663) (#39668)
fixCorrect websocket notification for change password page (#39671) (#39670)
fix(webhook) Keep line breaks in Telegram rich messages (#39650) (#39677)
fixCorrect "go get" URL ssh scheme, fix form binding (#39674, #39528) (#39676)
fixOIDC discovery advertises unsupported id_token response_type (#39498) (#39689)
fix(deps) Update module golang.org/x/net to v0.60.0 [security] (#39695) (#39701)
fix(git) Leave reflog expiry to git's defaults (#39703) (#39711)
fix(actions) Settle cancelled reusable workflow runs stuck in cancelling (#39706) (#39717)
fix(git) Match git config values exactly when syncing (#39728) (#39729)
fix(actions) Harden log cursor, activity type and actor filter handling (#39721) (#39731)
fix(packages) Copy selected Debian installation values (#39718) (#39734)
fix(auth) Prevent competing remember-me token rotations (#39686) (#39688)
fix(packages/npm) Restore former tarball URLs (#39681) (#39749)
fix(issues) Allow selecting a tag in the issue Branch/Tag dropdown (#39747) (#39753)
fixValidate "state" for OpenID (#39642) (#39744)
fixCorrect label deletion and release attachment load (#39743) (#39752)
fix(markup) Resolve and proxy srcset links of elements (#39708) (#39756)
fix(lfs) Validate OID before building filesystem object path (#39762) (#39766)
fix(markup) Restore code copy newline strip and fix copying rendered blocks (#39755) (#39765)
fix(user) Don't match a commit with an empty author email to a user (#39777) (#39780)
fix(gitdiff) Unquote C-quoted paths from git diff-tree --raw (#39781) (#39783)
fix(actions) Fix schedule cleanup and default branch switch (#39740) (#39786)
fixSkip commit-graph write when fetching remote commits (#39798)
fix(webauthn) Accept unsolicited client extension outputs from WebKit clients (#39792) (#39806)
fix(pull) Fix code context of review comments on unchanged lines (#39799) (#39805)
fix(pull) Don't auto-detect empty pull requests as manually merged (#39807) (#39812)
fix(actions) Keep folded block scalars intact across serialization (#39787) (#39817)
fix(actions) Bound request body size in artifacts v4 twirp handlers (#39818) (#39822)
fixPrevent Gitea from crashing by notification panic (#39835)
fix(pull) Recover PRs whose recorded merge commit never reached the base repo (#39831) (#39840)
fixUse correct template variable on milestone page (#39834) (#39843)
fix(mailer) Reject incoming email tokens of users who cannot sign in (#39833) (#39841)
fixAdd missing checks to several handlers and models (#39839) (#39847)
feature(packages/npm) Improve npm client compatibility (#39434) (#39522)
fix(actions) Keep runs order after auto refresh (#39479) (#39481)
fixNpm route (#39488) (#39490)
fixCopy new access token to clipboard (#39496) (#39499)
fix(markup) Skip post-processing inside MathML (#39497) (#39502)
fix(markup) Don't escape ambiguous characters in MathML (#39493) (#39505)
fixAdd missing checks to several API and web handlers (#39501) (#39507)
fixHandle git branch name with special chars correctly (#39483) (#39515)
fixTrace git command correctly (#39520) (#39524)
fix(git) Reindex go-git storage when a concurrent repack removes packs (#39510) (#39534)
fix(oauth2) Allow users to approve scope changes (#38942) (#39521)
fix(api) Add index tiebreaker to commit status ordering (#39508) (#39525)
fix(git) Avoid unnecessary timers during language stats (#39531) (#39535)
fixUse READ COMMITTED transactions on MySQL and MariaDB (#39506) (#39537)
fix(markup) Use installed math fonts for MathML in Chromium (#39491) (#39547)
fix(git) Tolerate concurrent repacks in go-git storage (#39536) (#39556)
fixMake image captcha work with csp (#39555)
fixUse READ_COMMITTED_SNAPSHOT on MSSQL (#39512) (#39558)
fixMake navbar stopwatch button can show popup (#39562)
fix(actions) Restore pushes to protected branches (#39564) (#39567)
fix(api) Allow bots with pending password changes (#39551) (#39566)
fix(user) Restore organizations tab on user profile (#39577) (#39581)
fix(markup) Link team mentions that use a different org name case (#39436) (#39588)
fix(httpcache) Raw files return 304 after a change when the new commit is older (#39435) (#39591)
fix(git) Return no submodule web link when the URL cannot be parsed (#39274) (#39592)
fix(pull) Fetch PR head refs instead of pushing them (#39603) (#39607)
fixMigrate broken team authorize access mode (#39579) (#39580)
fix(actions) Refresh reusable caller status when children are skipped (#39589) (#39609)
fixMake "edit pr title & target branch" get correct branch (#39612) (#39621)
fix(egress) Expose more ranges as restricted rather than reserved (#39560) (#39624)
fix(web) Normalize content for edit history diff and fix comment history dropdown (#39616) (#39627)
fixCorrect RemoveWithRetry error handling (#39619) (#39626)
fix(pull) Refresh commits behind when an AGit pull request is updated (#39613) (#39625)
fix(models) Chunk commit status queries to avoid SQLite expression depth limit (#39611) (#39638)
fixShow "merge" form for empty PR (#39640) (#39645)
securityFixes CVE-2026-57894: Repository Migration Follows Git HTTP Redirects After URL Allow/Block Validation, Enabling Internal Git Repository Exfiltration
breakingBREAKING
breakingFix(git)!: route Git network operations through an internal proxy and update egress settings ()
breakingFeat(actions)!: add RUN_RETENTION_DAYS to delete old action runs ()
securitySECURITY
featureFeat(actions): update actionslib, support self:, misc fixes ()
featureFeat(api): list all packages for site administrators ()
featureFeat: manage bot accounts from the admin UI, API and CLI ()
featureFeat(user): Personal access tokens can be regenerated ()
featureFeat(actions): support $/ prefix in reusable workflow uses: ()
featureFeat(actions): add force-cancel workflow run API ()
featureFeat(licenses): support REUSE specification in licenses ()
featureFeat(api): add project APIs ()
featureFeat(webhook): fire repository event on repo rename ()
featureFeat: admin impersonates a user ()
featureFeat(actions): add build queue view ()
featureFeat(setting): add shared [redis] section as default for redis-backed subsystems ()
featureFeat(repo): prioritize well-known READMEs and optimize discovery ()
featureFeat(actions): implement adaptive auto-refresh for workflow runs list ()
featureFeat(auth): add disable-2fa command ()
featureFeat: Add audit logging ()
featureFeat(repo): add quick repository switcher to repo header ()
featureFeat(repo): support file exclusion logic in .gitea/template in template generation ()
featureFeat(web): Add org removal functionality to admin user details page ()
featureFeat: add watch options ()
featureFeat: add deploy tokens ()
featureFeat(diff): Add search and extension filter to diff sidebar ()
featureFeat: Replace SSE with WebSocket for UI notifications ()
featureFeat(actions): Add artifact preview in Actions run view ()
featureFeat(packages): add support for uploading helm provenance files ()
featureFeat: Add support for dynamic matrix evaluation in Gitea Actions workflows ()
featureFeat: Add max-parallel Support for Gitea Actions ()
featureFeat(actions): Add Actions API endpoints for workflow run management and logs ()
featureFeat: Add block on pending codeowner reviews branch protection ()
deprecatedEnhance(packages/npm): expand version metadata and support npm deprecate ()
securityFix(deps): update module golang.org/x/image to v0.45.0 [security] ()
securityFix(deps): update module golang.org/x/mod to v0.40.0 [security] ()
securityFix(deps): update dependency mermaid to v11.16.1 [security] ()
securityFix(deps): update module github.com/getkin/kin-openapi to v0.144.0 [security] ()
securityFix(deps): update dependency js-yaml to v5.2.2 [security] ()
+198 more items in the release notes
See how far your stack has drifted from upstream. Release data from vendors’ own sources · feed under CC BY 4.0 · Code under AGPL-3.0 Settings Feed status