We are thrilled to announce the latest release of Gitea v1.27.0.
Gitea 1.27.0 brings exciting new features, performance improvements, and quality-of-life enhancements. It also ships a large number of security fixes, so we strongly recommend upgrading as soon as possible — see the Security section for details. Here are some notable changes and features in Gitea 1.27; for the full list, refer to the full release notes.
We are very thankful for the many people who have contributed to the project by sending code patches, reporting issues, translating, and supporting us in many other ways.
This release addresses the following security vulnerabilities. Please upgrade as soon as possible.
CVE-2026-58443: Public-only repository tokens could update private pull-request head branches. Fixed by #38406. Thanks to @ohxorud-dev for reporting the issue, and to @bircni for the patch.
CVE-2026-58433: The team-repository linking endpoint bypassed the RepoAdminChangeTeamAccess organization setting. Fixed by #38324. Thanks to @de3erve for reporting the issue, and to @bircni for the patch.
CVE-2026-58435: Privilege escalation through LFS deploy keys. Fixed by #38322. Thanks to @adrian-doyensec for reporting the issue, and to @bircni for the patch.
CVE-2026-58436: Unauthenticated denial of service via quadratic-time parsing of the Accept-Language header. Fixed by #38323. Thanks to @tonghuaroot for reporting the issue, and to @bircni for the patch.
CVE-2026-58437: Repository visibility could be manipulated via Git push options. Fixed by #38323. Thanks to @prakhar0x01 for reporting the issue, and to @bircni for the patch.
CVE-2026-58439: Branch protection bypass — retargeting a pull request preserved a stale official approval flag. Fixed by #38319. Thanks to @yonatan-pl for reporting the issue, and to @bircni for the patch.
CVE-2026-54481: The internal API HTTP client no longer skips TLS certificate verification. Fixed by #38406. Thanks to @sanil18 for reporting the issue, and to @bircni for the patch.
CVE-2026-55987: OAuth2 sign-in could reactivate an administrator-deactivated account on authentication sources that do not issue refresh tokens. Fixed by #38406. Thanks to @khoadb175 for reporting the issue, and to @bircni for the patch.
CVE-2026-57894: Repository migration followed Git HTTP redirects after URL allow/block validation, enabling internal repository exfiltration. Fixed by #38320. Thanks to @cyberlanc3r for reporting the issue, and to @bircni for the patch.
CVE-2026-58314: Two SSRF issues in repository migration. Fixed by #38406. Thanks to @xclow3n for reporting the issue, and to @bircni for the patch.
CVE-2026-58416: A fork pull-request Actions task could read a third private repository through the collaborative-owner branch. Fixed by #38214. Thanks to @CassianStarck for reporting the issue, and to @bircni for the patch.
CVE-2026-58420: Local file inclusion via a file:// URI in migration restore. Fixed by #38215. Thanks to @isa0-gh for reporting the issue, and to @bircni for the patch.
CVE-2026-58425: OAuth token introspection returned metadata for tokens issued to other clients. Fixed by #38042. Thanks to @bl4cksku11 for reporting the issue, and to @lunny for the patch.
CVE-2026-58427: The private organization member list could be leaked via the /members API endpoint. Fixed by #38213. Thanks to @Razzlemouse for reporting the issue, and to @bircni for the patch.
CVE-2026-58428: The release-attachment extension allowlist could be bypassed through the web release edit form. Fixed by #38314. Thanks to @bl4cksku11 for reporting the issue, and to @lunny for the patch.
CVE-2026-58429: Public-only personal access tokens could bypass scope restrictions on organization and permission endpoints. Fixed by #38323. Thanks to @Pcat2003 for reporting the issue, and to @bircni for the patch.
CVE-2026-58431: The public-only API token restriction was not enforced on team API routes. Fixed by #38323. Thanks to @rmb122 for reporting the issue, and to @bircni for the patch.
CVE-2026-58432: Missing authorization checks allowed access to sensitive resources through user-controlled keys. Fixed by #38318. Thanks to @z3r0s6 for reporting the issue, and to @bircni for the patch.
CVE-2026-58438: Cross-repository IDOR in issue-dependency removal let an attacker tamper with and comment on private repositories they could not access. Fixed by #38324. Thanks to @de3erve for reporting the issue, and to @bircni for the patch.
CVE-2026-58440: Webhooks created by a collaborator kept firing after that collaborator’s repository access was revoked. Fixed by #38324. Thanks to @sec-reex for reporting the issue, and to @bircni for the patch.
CVE-2026-58441: SSRF in restore-repo via an unsanitized clone URL. Fixed by #38324. Thanks to @yoojoon2 for reporting the issue, and to @bircni for the patch.
CVE-2026-58442: Repository-migration SSRF via a multi-answer DNS allow-list bypass. Fixed by #38324. Thanks to @Tomer-PL for reporting the issue, and to @bircni for the patch.
CVE-2026-58444: A personal access token scope-enforcement bypass on the repository home page could disclose private repository contents. Fixed by #38406. Thanks to @StarPlatinu for reporting the issue, and to @bircni for the patch.
CVE-2026-42931: Denial of service via unbounded request-body reading in the npm package tag endpoint. Fixed by #38406. Thanks to @Tricta for reporting the issue, and to @bircni for the patch.
CVE-2026-50105: The RSS/Atom feed handlers bypassed API-token scope and public-only confinement. Fixed by #38406. Thanks to @CassianStarck for reporting the issue, and to @bircni for the patch.
CVE-2026-55982: The OIDC userinfo endpoint returned identity claims without enforcing API-token scopes. Fixed by #38406. Thanks to @ybsun0215 for reporting the issue, and to @bircni for the patch.
CVE-2026-55986: The email-management API bypassed the manage-credentials feature restriction. Fixed by #38406. Thanks to @martijnperdaan52 for reporting the issue, and to @bircni for the patch.
CVE-2026-56443: A residual public-only token scope bypass on limited-visibility owners. Fixed by #38323. Thanks to @JebeenLee and @alecclyde for reporting the issue, and to @bircni for the patch.
CVE-2026-56654: Privilege escalation via access-token scope escalation in the API. Fixed by #38406. Thanks to @AdamKorcz and @ohxorud-dev for reporting the issue, and to @bircni for the patch.
CVE-2026-56657: Denial of service in the SSH key parser. Fixed by #38406. Thanks to @AdamKorcz for reporting the issue, and to @bircni for the patch.
CVE-2026-56755: Denial of service caused by quadratic string concatenation in Debian package uploads. Fixed by #38406. Thanks to @AdamKorcz for reporting the issue, and to @bircni for the patch.
CVE-2026-57886: Cross-repository issue and comment attachment re-linking could expose private attachment content. Fixed by #38406. Thanks to @zulloper for reporting the issue, and to @bircni for the patch.
CVE-2026-57897: Cross-repository information disclosure via the organization-level Actions run/job APIs. Fixed by #38406. Thanks to @prakhar0x01 for reporting the issue, and to @bircni for the patch.
CVE-2026-58507: Private repository existence disclosure via the go-get meta endpoint. Fixed by #38406. Thanks to @prakhar0x01 for reporting the issue, and to @bircni for the patch.
CVE-2026-58508: Two SSRF issues in migration/mirror (DNS rebinding and missing re-validation). Fixed by #38406. Thanks to @AmerMrkaljevic for reporting the issue, and to @bircni for the patch.
CVE-2026-58510: The repository watch-cleanup fix was not applied to the API EditRepo path, leaving stale watches when a repository became private. Fixed by #38406. Thanks to @eddieran for reporting the issue, and to @bircni for the patch.
CVE-2026-59763: Unbounded Arch package file metadata could cause resource amplification during package uploads. Fixed by #38406. Thanks to @kkkh1 for reporting the issue, and to @bircni for the patch.
CVE-2026-58417: The REST API exposed the membership of private organizations. Fixed by #38145. Thanks to @maluff, @Sai2r and @mgelde for reporting the issue, and to @bircni for the patch.
CVE-2026-58434: Private repository metadata remained accessible after access was revoked. Fixed by #38321. Thanks to @ybsun0215 for reporting the issue, and to @bircni for the patch.
CVE-2026-58445: A cross-repository label-ID enumeration oracle in the delete-issue-label API. Fixed by #38406. Thanks to @CassianStarck for reporting the issue, and to @bircni for the patch.
CVE-2026-55984: A null-pointer dereference in the AddTime API could cause an authenticated denial of service. Fixed by #38406. Thanks to @martijnperdaan52 for reporting the issue, and to @bircni for the patch.
CVE-2026-56750: Remember-me tokens were not invalidated correctly, allowing session reuse. Fixed by #38406. Thanks to @AdamKorcz for reporting the issue, and to @bircni for the patch.
CVE-2026-58511: Webhook authorization headers were returned in plaintext via the API. Fixed by #38406. Thanks to @theluckystrike and @APhuongKMA for reporting the issue, and to @bircni for the patch.
This release also includes the following additional security hardening fixes:
Revoked users can no longer read private repository objects or issue titles through the user starred/times API endpoints. Fixed by #38324. Thanks to @sec-reex for reporting the issue, and to @bircni for the patch.
Added a private/internal label for packages and fixed the Composer package source permission check. Fixed by #37610. Thanks to @JoshBolding and @sec-reex for reporting the issue, and to @lunny for the patch.
AWS credentials stored via the API are now encrypted. Fixed by #37679. Thanks to @Exgene for the patch.
Updated github.com/go-git/go-git/v5 to v5.19.1 to pick up an upstream security fix (#37786).
We are grateful to all the security researchers who responsibly disclosed these issues.
You can download it for example from our downloads page. Please read our installation guide for more information on installation. To upgrade, as always, back up your data and then replace the binary or Docker container and restart.
We would like to thank all of our supporters on Open Collective who are helping to sustain the project financially.
As always, the changes are sorted descending by what we deem most important for users and admins, so the most important change comes first.
Are you looking for a seamless, hassle-free solution to manage your Git repositories? Look no further! Gitea Cloud is here to revolutionize your development experience.
Gitea release artifacts are now signed with sigstore instead of the previous GPG flow. If you verify downloaded binaries or Docker images as part of your deployment pipeline, update your verification step to the sigstore-based process.
Thank you to @TheFox0x7 for contributing this change.
⚠️ Improve support for reusable workflows (#37478)
Reusable workflows referenced with uses: are now parsed on the Gitea side rather than on the runner. Each called (child) job is inserted as its own ActionRunJob and dispatched as an independent task, so callee logs surface as separate job entries instead of being inlined into the caller’s “Set up job” step. Review workflows that rely on reusable-workflow behavior after upgrading.
External reusable workflows (uses: https://other-gitea-instance/OWNER/REPO/.gitea/workflows/test.yaml@REF) are no longer supported. To keep using them, clone the repositories to the local instance and reference them there.
Thank you to @Zettat123 for contributing this change.
⚠️ Use a Content-Security-Policy script nonce (#37232)
Inline scripts are now allowed via a per-request CSP nonce instead of a broader policy. Custom templates, themes, or embeds that inject inline <script> tags may stop executing until they are updated to carry the nonce. Review custom front-end customizations after upgrading.
Thank you to @wxiaoguang for contributing this change.
⚠️ X-Content-Type-Options: nosniff is now sent by default (#37354)
All responses now include the X-Content-Type-Options: nosniff header, which stops browsers from MIME-sniffing responses away from their declared Content-Type. If a reverse proxy, embed, or custom asset relied on content sniffing, set X_CONTENT_TYPE_OPTIONS = unset under [security] to remove the header, or override its value as needed.
Workflows called with uses: are now resolved by Gitea itself instead of by the runner. Every called workflow is expanded into its own jobs, which are scheduled as independent tasks: they get their own entries in the run sidebar, their own logs, and their own nodes in the dependency graph, nested under the job that called them. Callee output is no longer inlined into the caller’s “Set up job” step, so a failure inside a reusable workflow points straight at the job that failed. Nested calls (a reusable workflow calling another) work the same way, and outputs, inputs, and matrix jobs propagate across the boundary.
Thank you to @Zettat123 for contributing this feature.
Workflow steps can write Markdown to GITHUB_STEP_SUMMARY, and Gitea renders it on the run Summary view. Summaries are stored in the database rather than as downloadable artifacts, and later polish makes the summary UI richer (#37824).
Thank you to @bircni for contributing this feature.
continue-on-error was previously parsed from YAML but ignored when computing a run’s overall status, so a tolerated job failure could still fail the whole run. Gitea now stores the value per job and treats an allowed failure as success when aggregating the workflow run, matching GitHub Actions.
Thank you to @bircni for contributing this feature.
🚀 🔧 Run post/cleanup steps when a workflow is cancelled (#37275)
Cancelling a run now executes post-run cleanup and always() / cancelled() steps, using a transitional Cancelling job state before the job is finalized as cancelled.
The run view reflects the current job status on the browser tab favicon (and sets a descriptive tab title, #37870), so you can watch a run from another tab.
Thank you to @bircni for contributing this feature.
🚀 List workflows that ran once but were removed from the default branch (#37835)