abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-stargazers-hidden
Gitea 1.27.3 - Gitea
受限用户和私有用户本应从匿名查看者眼中消失。GetInfo 已经对它们返回 404。关注者列表已经在 SQL 中应用了 isUserVisibleToViewerCond。GetStargazers 是对 star 的 join,没有任何可见性过滤。ListStargazers 随后对全部结果执行 convert.ToUser。ListSubscribers 对 watcher 也是同样的结构。
在未登录的情况下,公开仓库的 stargazers JSON 会列出 GET /users/{name} 所隐藏的用户名。
| ID | 暂无 CVE |
| CWE | CWE-200 |
| CVSS | 中危:5.3 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N |
| 产品 | Gitea |
| 受影响版本 | 至 v1.27.3(146cc3e) |
| 认证 | 无需认证 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅限 127.0.0.1 |
在未登录的情况下,读取公开仓库的 stargazers 和 watchers,并获知 GET /users/{name} 所隐藏的用户名。这是对给公开内容加星或关注(watch)的受限账户和私有账户的侦察:这些人设置了可见性,使自己不出现在搜索中,却仍然点了星标。
泄露的是用户名,不是邮箱,不是私有 git 读取,也不是 RCE。结合 Follow 204 vs 404 预言机,即使个人资料返回 404,你也能确认某个隐藏登录名存在。
可见性是 1.27.3 GHSA 浪潮的一个主题。当一个产品有意对个人资料返回 404 时,下一个问题就是哪些列表端点仍然在 join user 时没有应用该条件。stars 和 watchers 就是如此。
我把 hidstar 设为受限用户,让它给一个公开仓库加星并关注,然后在没有 token 的情况下访问该实例。未认证的 GET /api/v1/users/hidstar 返回 404。未认证的 stargazers JSON 包含 hidstar。未认证的 watchers 包含 hidstar。未认证的 followers HTML 不包含。个人资料很害羞,star 表却不。
已记录的弯路:未认证的 GET /users/hidstar 返回 200(那说明可见性完全关闭——实验环境要求 404);followers HTML 列出 hidstar(该路径已经应用了条件);把 /stargazers 返回 200 且只有公开用户名当作 SUCCESS;一个反弹 shell。都是表演。泄露点在于 JSON 中的受限登录名。
cd lab
./run.sh
目标仅限 http://127.0.0.1:18133。Compose 允许 public,limited,private 可见性,并保持 stars 开启。
unauth-user-get status=404
unauth-stargazers status=200 stargazer-names=['hidstar']
unauth-watchers leak=True
unauth-followers-web limited-in-html=False
SUCCESS GITEA-STARGAZERS-HIDDEN
在 GetStargazers / GetRepoWatchers 中应用 isUserVisibleToViewerCond。未认证的 stargazers 和 watchers 必须像 followers 已经做的那样省略 hidstar。
star.go 路由 · star.go 模型 · subscriber.go · GetInfo · GetUserFollowersGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无任何担保。