abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-stargazers-hidden
技术分析文章:https://abraxaslabs.tech/research/gitea-stargazers-hidden
Gitea 1.27.3 - Gitea
受限用户和私有用户本应从匿名查看者的视野中消失。GetInfo 已经对它们返回 404。关注者列表已经在 SQL 中应用了 isUserVisibleToViewerCond。GetStargazers 则是对 star 表的连接查询,没有任何可见性过滤。ListStargazers 随后对全部结果执行 convert.ToUser。ListSubscribers 对关注者(watchers)也是同样的结构。
在未登录的情况下,公开仓库的 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} 所隐藏的用户名。这是对给公开内容点过星或关注过的受限账户和私有账户的侦察:这些人把可见性设置为不在搜索中出现,却仍然点了星。
泄露的是用户名,不是邮箱,不是读取私有 git 仓库,也不是 RCE。结合 Follow 204 vs 404 预言机,即使个人资料返回 404,你也能确认某个隐藏登录名确实存在。
可见性是 1.27.3 GHSA 浪潮中的一个主题。当一个产品有意对个人资料返回 404 时,下一个问题就是:还有哪些列表端点仍然在连接 user 表时没有应用该条件。星标和关注者(watchers)就是如此。
我把 hidstar 设为受限用户,让它给一个公开仓库点星并关注,然后在没有令牌的情况下请求该实例。未认证的 GET /api/v1/users/hidstar 返回 404。未认证的 stargazers JSON 中包含 hidstar。未认证的 watchers 中包含 hidstar。未认证的 followers HTML 中则没有。个人资料是害羞的,星标表却不是。
已记录的弯路:未认证的 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 可见性,并保留星标。
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。仅限回环实验环境。不提供任何担保。