Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain confined API token from CI config or shared credential
-
DeliveryAuthenticate via HTTP Basic auth to Gitea feed endpoint
-
ExploitRequest private repo RSS/Atom feed URL (e.g., /owner/repo/rss/branch/main)
-
ExecutionScope check absent - server returns HTTP 200
-
ImpactExtract private commit metadata and release notes from feed response
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V14 - Data Protection Data exposure prevention
MITRE ATT&CK
2 techniques across 2 tactics: Collection, Discovery The technique list with ATT&CK links and the kill-chain view is part of the Basic plan and up. |
| Exploitation Conditions | The attacker must hold a valid Gitea personal access token belonging to an account that already has repository read access ( |
| Impact | The official CVSS 3.1 score of 4.3 (AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N) accurately reflects the actual impact boundary: network-reachable with no special configuration required, but gated behind a valid authenticated token (PR:L) and limited to metadata-only confidentiality loss (C:L) - no raw file blobs are exposed. The vulnerability is not listed in CISA KEV, indicating no confirmed widespread exploitation at time of analysis. No EPSS score was provided in the source data, so exploitation probability is not quantifiable from available signals. A detailed proof-of-concept is embedded in the GHSA advisory itself, lowering the barrier for exploitation. Real-world risk is meaningfully higher for organizations relying on confined tokens in CI pipelines or third-party integrations, because this breaks the specific security property those deployments are designed around. For Gitea instances where all users are fully trusted and no token-delegation patterns are in use, the practical risk is low despite the public PoC. |
| Exploit ScenarioDerived | An attacker holds a Gitea personal access token scoped to |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Jul 21, 2026
RSS/Atom feed handlers in Gitea prior to v1.27.0 expose private repository content - commit metadata, release notes, tag names, and cross-repo activity streams - to holders of confined API tokens that are explicitly blocked from the same data via download routes. The bypass breaks the token-confinement guarantee introduced by PR #37698 for raw/archive/download handlers, which was never extended to the sibling feed endpoints despite those endpoints accepting identical token-based Basic auth. A working proof-of-concept is documented in the GHSA advisory verified against the official gitea/gitea:1.26.2 Docker image; the vulnerability is not confirmed in CISA KEV, and the primary realistic threat is a leaked or lower-trust token used in CI or third-party integrations circumventing its intended scope restrictions.
RemediationAI
Upgrade to Gitea v1.27.0 or later, which resolves the confinement bypass per GHSA-6cqf-375w-639g (https://github.com/go-gitea/gitea/security/advisories/GHSA-6cqf-375w-639g) and the v1.27.0 release (https://github.com/go-gitea/gitea/releases/tag/v1.27.0). If an immediate upgrade is not feasible, a compensating control is to block feed-route paths at the reverse proxy layer - specifically patterns matching /*.rss, /*.atom, /rss/*, /atom/*, and /releases.rss for authenticated requests - which eliminates the exposed surface at the cost of breaking legitimate feed consumers such as dashboards or notification systems. An alternative is to revoke or replace confined tokens used in CI/third-party integrations with session-based authentication until the patch is applied; this trades operational friction for elimination of the specific threat vector (leaked confined tokens). There is no known server-side Gitea configuration toggle to disable token auth selectively on feed routes without code changes.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 3 packages in go, euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
Gitea enforces API-token scoping through CheckTokenScopes / CheckRepoScopedToken in services/context/permission.go, which rejects tokens marked *public-only* or lacking the repository scope category before serving private content. PR #37698 wired this check into the raw, media, archive, and release-attachment download handlers. The feed handlers - ShowBranchFeed in routers/web/feed/branch.go, handleRepoHomeFeed in view_home.go, ShowReleaseFeed in routers/web/repo/release.go, and showUserFeed in routers/web/feed/profile.go - are registered under webAuth.AllowBasic, making them reachable via API-token HTTP Basic authentication, but a grep for CheckTokenScopes, CheckRepoScopedToken, and IsApiToken across those files returns nothing. CWE-200 (Exposure of Sensitive Information to an Unauthorized Actor) is the root cause class: authorization boundary enforcement is applied inconsistently across route siblings. The affected package is the Go module code.gitea.io/gitea (CPE: pkg:go/code.gitea.io_gitea), all versions prior to 1.27.0.
Know when Gitea gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N
Feed endpoints are network-reachable via HTTP Basic token auth (PR:L); only metadata is disclosed, not file content, so C:L; no integrity or availability impact applies.
Primary rating from Vendor (https://github.com/go-gitea/gitea).
CVSS VectorVendor: https://github.com/go-gitea/gitea
DescriptionCVE.org
Summary
Gitea's RSS/Atom feed handlers accept API-token Basic auth but perform no token-scope or public-only enforcement. A personal access token that is correctly blocked (HTTP 403) from a private repository on /raw, /media, /archive, and /releases/download/... - because it is marked *public-only* or lacks the repository scope category - still returns that repository's private content through the feed routes. This is a token-confinement bypass and appears to be an incomplete fix of #37698, which added that scope enforcement to the download handlers but not to the sibling feed handlers.
This is not a cross-user access bug: the requesting account must still legitimately have repo read access (RepoAssignment + reqUnitCodeReader are enforced). What is bypassed is the guarantee that a *confined* token cannot reach private content - which is exactly the property #37698 was shipped to provide for downloads, and which matters when such a token is handed to a third-party service/CI, leaked, or used in a lower-trust integration.
Details
#37698 added context.CheckTokenScopes / CheckRepoScopedToken (services/context/permission.go) to the raw / media / archive / attachment download handlers, so a public-only or wrong-scope-category token cannot read private-repo content even when the owning user otherwise has access.
The feed handlers are registered with webAuth.AllowBasic (so they accept token Basic auth) but call no scope / public-only check. A grep for CheckTokenScopes / CheckRepoScopedToken / IsApiToken across routers/web/feed/ and the release feed handlers returns nothing.
Affected routes (all token-reachable via webAuth.AllowBasic, none call the scope check):
| Route | Handler | Private data exposed |
|---|---|---|
GET /{owner}/{repo}.rss / .atom | repo.Home → handleRepoHomeFeed (view_home.go) | last-10 commits: SHA, full message, author name + email |
GET /{owner}/{repo}/rss/branch/*, /atom/branch/* | feed.RenderBranchFeed* → ShowBranchFeed (routers/web/feed/branch.go) | same commit data, any branch |
GET /{owner}/{repo}/releases.rss / .atom | ReleasesFeedRSS/Atom (routers/web/repo/release.go) → ShowReleaseFeed | private release names, notes, descriptions |
GET /{owner}/{repo}/tags.rss / .atom | TagsListFeedRSS/Atom → ShowReleaseFeed | private tag names + messages |
GET /{user}.rss / .atom | showUserFeed (routers/web/feed/profile.go), `includePrivate = self \ | \ |
Inconsistency that pins this down: the branch-feed routes sit in the same route group as /raw, /media, /archive (all of which call checkDownloadTokenScope), and releases.rss sits next to /releases/attachments/{uuid} and /releases/download/... (both go through ServeAttachment → scope check). Only the feeds were missed. The API equivalents (ListReleases / ListTags) are scope-gated via tokenRequiresScopes.
Two distinct confinement bypasses:
- Public-only bypass. A token created with the *public-only* option is blocked (403) from a
private repo on /raw, /archive, /releases/download/..., but returns private commit / release data via .../releases.rss, .../rss/branch/*, /{owner}/{repo}.rss, and the owner's private activity via /{user}.rss.
- Scope-category bypass. A token scoped to only e.g.
read:issue(noread:repository) is
rejected by the download handlers but reads repository commit/release content via the feeds.
PoC
Verified live against the official gitea/gitea:1.26.2 Docker image (sqlite, feeds enabled).
Setup: non-admin user alice; private repo alice/secret with a commit "SECRET-COMMIT-MARKER ..." (file secret.txt) and a release "Private Release" / body "SECRET-RELEASE-MARKER ...". Two confined personal access tokens, both sent via HTTP Basic so the auth method is identical across download and feed - only the route differs:
- Token A: scopes
["public-only", "read:repository"] - Token B: scopes
["read:issue"]
# Token A - download is correctly blocked, feeds leak private content:
curl -u alice:$TOKEN_A https://<host>/alice/secret/raw/branch/main/secret.txt
# => 403 (fix works)
curl -u alice:$TOKEN_A https://<host>/alice/secret/rss/branch/main
# => 200, <title>SECRET-COMMIT-MARKER ...</title>
curl -u alice:$TOKEN_A https://<host>/alice/secret/releases.rss
# => 200, SECRET-RELEASE-MARKER ...
curl -u alice:$TOKEN_A "https://<host>/alice.rss"
# => 200, private activity
# Token B - wrong scope category, same split:
curl -u alice:$TOKEN_B https://<host>/alice/secret/raw/branch/main/secret.txt
# => 403
curl -u alice:$TOKEN_B https://<host>/alice/secret/rss/branch/main
# => 200, private commit leakedAnonymous baseline returns 404 on the repo feeds (data is genuinely private) and a marker-free 200 on /alice.rss (public activity only) - confirming the leak is gated only by the missing token check.
Impact
Information disclosure of private commit metadata (SHA, message, author name+email), release/tag notes, and the owner's private activity stream, to the holder of a confined token that was specifically configured *not* to reach private content. Not raw file blobs (feeds don't serve file contents). Requires a token belonging to an account that already has repo read access, so the realistic threat is a leaked / shared / lower-trust token rather than an anonymous attacker - which is precisely the threat model #37698 addressed for downloads.
Suggested remediation
Add a token-scope check at the top of each feed handler, mirroring checkDownloadTokenScope:
if context.CheckRepoScopedToken(ctx, ctx.Repo.Repository, auth_model.Read); ctx.Written() {
return
}for ShowBranchFeed, ShowRepoFeed, ShowFileFeed, ShowReleaseFeed (repo feeds). For the user feed, gate includePrivate behind a non-public-only token (or require the user / repository scope) so a confined token can't pull private activity.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.
Remote code execution in Gitea (self-hosted Git service) via a code-injection flaw (CWE-94) allows attackers to run arbi
Broken access control in Gitea's Composer package registry (versions up to and including 1.26.1) lets remote attackers r
Gitea before 1.16.7 does not escape git fetch remote. Rated high severity (CVSS 7.5), this vulnerability is remotely exp
The git hook feature in Gitea 1.1.0 through 1.12.5 might allow for authenticated remote code execution in customer envir
Improper Neutralization of Input During Web Page Generation (XSS or 'Cross-site Scripting') vulnerability in Gitea Gitea
Authenticated command injection in Dokploy (self-hostable PaaS) versions 0.29.3 through 0.29.12 lets a low-privileged us
Reverse-proxy authentication bypass in the official Gitea Docker image (versions up to and including 1.26.2) allows any
Path traversal in Gitea's Org-mode (`.org`) markup renderer allows an attacker who can get Org-mode content rendered by
Container escape in Gitea act_runner (Docker backend, through act 0.262.0) lets an authenticated user with workflow-exec
models/repo_mirror.go in Gitea before 1.7.6 and 1.8.x before 1.8-RC3 mishandles mirror repo URL settings, leading to rem
Server-side request forgery and internal repository exfiltration in Gitea before 1.27.0 lets a low-privileged authentica
Authorization bypass in Gitea versions 1.22.3 through 1.26.1 allows holders of `public-only` access tokens or OAuth gran
Same weakness CWE-200 – Information Exposure
View allSame technique Information Disclosure
View allVendor StatusVendor
SUSE
Severity: Moderate| Product | Status |
|---|---|
| SUSE Linux Enterprise Server 16.1 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.1 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Package Hub 15 SP6 | Affected |
| openSUSE Leap 15.5 | Affected |
| openSUSE Leap 15.6 | Affected |
EUVD-2026-58136
GHSA-6cqf-375w-639g
NVD
CVE.org
EPSS
Exploit-DB