abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · gitea-follow-existence
技术分析文章:https://abraxaslabs.tech/research/gitea-follow-existence
Gitea 1.27.3 - Gitea
GetInfo 已经会对隐藏用户返回 404,并且谎报原因:fake ErrUserNotExist error message to not leak information about existence。PUT /user/following/{username} 通过 UserAssignmentAPI() 加载目标用户并调用 Follow。没有 IsUserVisibleToViewer。不存在的名称:404 user redirect does not exist。存在的隐藏名称:204。
204 表示账户存在。404 表示你猜了一个不存在的名称。个人资料 JSON 依然保持封闭。
| ID | 暂无 CVE |
| CWE | CWE-203 |
| CVSS | 中危:4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N |
| 产品 | Gitea |
| 受影响版本 | 至 v1.27.3(146cc3e) |
| 认证 | 已登录账户 |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
登录(默认开放注册成本很低)。即使个人资料 API 返回 404,也能证明某个隐藏或受限账户存在。无法导出个人资料。无法访问私有 git。结合未认证 stargazers,你可以在公开仓库上找到一个隐藏登录名,然后在他们隐藏个人资料后确认该账户仍然存在。
Check 和 Unfollow 位于同一组。同样缺少检查。
与 stargazers 相同的可见性排查。当一个处理程序如此费力地撒谎时,你就会去检查每一个接受 {username} 的其他路由。Follow 没有这样做。
我注册了一个受限攻击者,关注了隐藏名称,关注了一个不存在的名称,并比较了状态码。公开用户本应返回 204。这不算 SUCCESS。隐藏用户返回 204 而未知用户返回 404,同时 GET 返回 404,这才是 SUCCESS。
已记录的弯路:Follow 隐藏用户返回 404(那么可见性检查就在此路由上);获取隐藏用户的个人资料 JSON(GetInfo 已经返回 404——这个 bug 是状态码类别问题,不是数据泄露);把公开用户 Follow 返回 204 当作 SUCCESS;反弹 shell。纯属作秀。
cd lab
./run.sh
仅以 http://127.0.0.1:18134 为目标。Compose 允许 public,limited,private 可见性。
get-hidden status=404
follow-hidden status=204
follow-unknown status=404 user redirect does not exist
oracle hidden=204 unknown=404
SUCCESS GITEA-FOLLOW-ORACLE
在 Follow(以及 Check/Unfollow)中,于调用 FollowUser 之前调用 IsUserVisibleToViewer。隐藏用户名的请求必须像 GetInfo 已经做的那样返回 404。
follower.go · api.go following 分组 · GetInfoGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。不提供任何担保。