abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-git-redir-ssrf
技术分析文章:https://abraxaslabs.tech/research/gitea-git-redir-ssrf
Gitea 1.27.3 - Gitea
IsMigrateURLAllowed 只是对你输入的 URL 执行一次性的 net.LookupIP。随后数据会经过 git clone --mirror 处理。HandleGitCmdHTTPRedirection 本应阻止 git 跟随该跳转。但它什么也没做。注释本身就是发现:他们因为 GitLab 在没有 .git 时会返回 301,所以没有设置 http.followRedirects=false。拉取镜像(pull-mirror)的 fetch 调用的是同一个空操作。
已登录用户可以从允许列表中的诱饵主机发起迁移,git 会跟随 302 跳转进入回环地址上的 git HTTP 服务。内部对象会落入他们自己拥有的仓库中。
| ID | 暂无 CVE |
| CWE | CWE-918 |
| CVSS | 高危:7.7 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:N/A:N |
| 产品 | Gitea |
| 受影响版本 | 至 v1.27.3(146cc3e) |
| 认证 | 已认证(默认开放注册) |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
注册账号,从一个看似外部的 URL 发起迁移,该 URL 会 302 跳转到 http://127.0.0.1:.../internal.git。直接迁移到回环地址会被拒绝。但跟随重定向的克隆不会被拒绝。见证文件会落入他们自己的仓库。
不是 file:// 磁盘读取。不是对 /api/internal 使用 X-Gitea-Internal-Auth(git 不会设置该请求头)。不是未认证 RCE。不是元数据 RCE,除非你另外证明 git 存储了响应体。
同一标签下的遗留问题:keys IDOR、hostmatcher 0.0.0.0/8。
v1.27.3 修复了 2026 年 GHSA 浪潮:CVE-2026-60004(diffpatch 钩子 RCE,CISA KEV)、CVE-2026-59774(未认证 Org-mode #+INCLUDE)、fork-PR Actions 门控、反向代理 X-WEBAUTH-USER 默认值。针对这些问题请保持在 1.27.3+。但我还是盯上了那个标签。
CVE-2026-59765 修复了 Go 的 uri.Open。CVE-2026-22874 修复了 Go 的 reservedIPNets。Git 的重定向器仍然是一个 FIXME。更新日志中的“disable HTTP redirects on pull mirror sync”并不是指这个函数。
实验环境将 Gitea 放在 8.8.4.2 上,这样位于 8.8.4.10 的诱饵主机对 hostmatcher 来说看起来是外部的。内部 git HTTP 仅绑定在 Gitea 网络命名空间(netns)的回环地址上(network_mode: service:gitea,端口 9418)。直接迁移到 127.0.0.1 必须失败。跟随重定向的克隆必须成功。redir.py 将 /bait.git 以 302 跳转到 http://127.0.0.1:9418/internal.git。见证文件 WITNESS 包含 GHSA-GITEA-GIT-REDIR-SSRF。
已记录的弯路:ALLOW_LOCALNETWORKS true(这样允许列表就没了);file://;X-Gitea-Internal-Auth;反弹 shell。都是做戏。直接回环迁移被拒绝才是对照基准。
客户端 bug 看起来像产品 bug。一个遮蔽 http.client 的辅助程序从不发送数据包。对 HTTPResponse 调用 .recv() 并不等于 .read()。我提这一点是因为它浪费了时间,而且有一瞬间看起来像是 1.27.3 已经完成了修复。
cd lab
./run.sh
仅针对 http://127.0.0.1:18103。ALLOW_LOCALNETWORKS=false。
negative-loopback status=422 You can not import from disallowed hosts
migrate-bait status=201 clone_addr=http://8.8.4.10/bait.git
fetch raw/WITNESS status=200 GHSA-GITEA-GIT-REDIR-SSRF
SUCCESS Gitea #2 git HTTP redirect SSRF
不要将提交时的 DNS 解析视为边界。强制设置 http.followRedirects=false(并将克隆 URL 规范化为 .git,以便 GitLab 仍能正常工作),或者通过一个在每一跳都重新运行 hostmatcher 的拨号器代理 git HTTP 流量。
HandleGitCmdHTTPRedirection · IsMigrateURLAllowedGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。