CSIRTS // UNIFIED SECURITY ADVISORY FEEDSYS ● ONLINE · POWERED BY INTELFUSIONS.COM

GHSA-2wm4-vwp6-v7xc: Gitea: SSRF via Migration Asset Downloads Bypasses hostmatcher — Reads Internal Files and Cloud Metadata

mediumCVE-2026-59765
Summary Gitea has robust SSRF protection via hostmatcher.NewDialContext() for webhook and migration clone URLs, which validates resolved IPs at the TCP dial level. However, three code paths use raw http.Get() (Go's DefaultClient) which completely bypasses this protection, enabling SSRF to internal services and local file read via the file:// scheme. Vulnerable Code File: modules/uri/uri.go (line 32) -- Core vulnerability func Open(uriStr string) (io.ReadCloser, error) { u, err := url.Parse(uriStr) switch strings.ToLower(u.Scheme) { case "http", "https": f, err := http.Get(uriStr) // RAW http.Get -- no hostmatcher filtering return f.Body, nil case "file": return os.Open(u.Path) // LOCAL FILE READ via file:// scheme } } Callers in migration path: - services/migrations/gitea_uploader.go:340 -- uri.Open(*asset.DownloadURL) for release assets - services/migrations/gitea_uploader.go:586 -- uri.Open(pr.PatchURL) for PR patches File: services/migrations/dump.go (lines 312, 453) // Line 312 -- release asset download resp, err := http.Get(*asset.DownloadURL) // Line 453 -- PR patch download (with self-documenting TODO) resp, err := http.Get(u) // TODO: This probably needs to use the downloader File: routers/web/auth/oauth.go (line 306) func oauth2UpdateAvatarIfNeed(ctx *context.Context, url string, u *user_model.User) { resp, err := http.Get(url) // RAW http.Get -- no hostmatcher Contrast with protected migration clone (same codebase): // services/migrations/migrate.go:526 -- PROTECTED with hostmatcher transport.DialContext = hostmatcher.NewDialContext("migration", allowList, blockList, ...) PoC Step 1: Set up attacker Gitea instance with malicious release asset URLs Create a repo on evil.gitea.attacker.com with a release asset whose download_url points to internal services: Asset DownloadURL set to: http://169.254.169.254/latest/meta-data/iam/security-credentials/role Or: file:///etc/gitea/app.ini (local file read) Step 2: Admin triggers migration from attack

Details

Source
GitHub Security Advisories (INTL · database · site)
Severity
medium
Published
2026-07-21
Last updated
2026-07-21
Exploitation
Not in CISA KEV at last sync

Original advisory: https://github.com/advisories/GHSA-2wm4-vwp6-v7xc

Referenced CVEs

CVECSIRTS overviewExternal
CVE-2026-59765coverage & exploitation statusNVD · CVE.org

Same CVEs, other sources

How other CERTs, PSIRTs and databases cover the vulnerabilities in this advisory.

More from GitHub Security Advisories