CVE-2026-59766
MEDIUMCVE-2026-59766 is a medium-severity (CVSS 4.3) vulnerability in code.gitea.io/gitea. O3 Security confirms whether CVE-2026-59766 is actually reachable in your code before you act, and blocks exploitation at runtime until you patch.
Gitea CVE-2026-20800 sibling endpoints not covered: revoked user still reads private repo objects via `/api/v1/user/starred` and private issue titles via `/api/v1/user/times`
Real-World Exposure
code.gitea.io/giteaReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects Go packages — download data is not available via public APIs for these ecosystems.
Description
Summary
CVE-2026-20800 fixed private-info leakage to revoked users only for the notification endpoint. Two sibling endpoints that return data keyed on the caller's own relationship still do not re-check repo access at output time:
GET /api/v1/user/starred—getStarredRepos()computes a per-repo permission but still lists every starred repo (no filtering), so the full repo object (full_name,private,clone_url,ssh_url) of a now-inaccessible private repo is returned.GET /api/v1/user/times—ListMyTrackedTimes()queries byUserIDonly andLoadAttributesbrings in the issue (title,state), leaking private issue titles after revocation.
Steps to reproduce
Using the provided reproduction materials, as a revoked user:
- Control:
GET /api/v1/repos/admin/starred-test→ 404. GET /api/v1/user/starred→ leaksadmin/starred-test,private:true,clone_url.GET /api/v1/user/times→ leaksissue.title = "SECRET: …",state.
(Runtime-confirmed on gitea/gitea:1.25.4. Oracle = planted sentinel title; no real secret exfiltrated.)
Impact
A former collaborator can enumerate private repos they starred and read private issue titles they logged time on, indefinitely after access revocation. Metadata only (no repo content / comment bodies). Low.
Suggested remediation
getStarredRepos: drop (or minimally redact) repos wherepermission.HasAnyUnitAccessOrPublicAccess()is false for the caller.ListMyTrackedTimes: filter tracked-time entries by current repo access.- Optionally clear a user's stars / time entries for a private repo on revocation.
Credit
Reported as part of an incomplete-patch measurement study (responsible disclosure).
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐹Go | code.gitea.io/gitea | all versions | 1.27.0 |
Detection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for code.gitea.io/gitea. O3's reachability analysis confirms whether the vulnerable code path is actually invoked in your application, so you act on real exposure instead of every transitive match.
Fix
Update code.gitea.io/gitea to 1.27.0 or later, then make sure no transitive (indirect) dependency still pins the vulnerable range — O3 confirms CVE-2026-59766 is resolved across your whole dependency graph.
Workarounds
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
How O3 protects you
O3 pinpoints whether CVE-2026-59766 is reachable in your code and exactly where to fix it, then blocks exploitation in production at runtime until the patched version is deployed.
Tailored to CVE-2026-59766. Runtime protection reduces exposure until a permanent patch is applied and verified — it complements patching, it doesn't replace it.
Frequently Asked Questions
Is CVE-2026-59766 in your dependencies?
O3 detects CVE-2026-59766 across Go dependencies and uses function-level reachability to confirm whether the vulnerable code path is actually reachable — not just present. No false positives.