abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-git-redir-ssrf
Gitea 1.27.3 - Gitea
IsMigrateURLAllowed 是对你输入的 URL 执行的一次性 net.LookupIP。随后字节流会经过 git clone --mirror。HandleGitCmdHTTPRedirection 本应阻止 git 跟随该跳转。但它什么也没做。注释本身就是发现:他们没有设置 http.followRedirects=false,因为 GitLab 在没有 .git 时会返回 301。拉取镜像的 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。变更日志中的“在拉取镜像同步时禁用 HTTP 重定向”并不是这个函数。
实验环境将 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。仅限回环实验环境。无担保。