[ 安全] List AllGitspaces 授权旁通
□ 总结
“ GET /api/v1/gitspaces” 端点在列表时未执行空间级授权
用户的 gitspace 配置 。 GetAuthorized Spaces ()' 函数称为检查Gitspace ()'
用于每个空间,但无论检查结果如何,总是将空间标为授权,因为
“ 无访问” 分支中缺失的“ 继续” 会导致“ 授权空间ID[ 空间ID] = true 致
无条件执行。 一个被从空间中移除的认证用户仍然可以
从该空间取回他们的gitspace配置(包括访问密钥和SSH命令).
□ 脆弱性细节
`app/api/controller/gitspace/list all.go', 第127至145行:
开始 func (c * 控制器) 获取授权空间 ctx 语境. 背景情况 第二届会议 会议, 空间映射地图[int64]字符串, ) (地图[int64]bool,出错){ var 授权空间IDs = make(map [int64] bool, 0)
用于空间ID, 空间Path : = 范围空间映射 { 错误 := apiauth. CheckGitspace () ctx, c. 授权器, 会话, spacePath, "", enum. 权限 Gitspace View, (英语). (中文(简体) ). 如果错误的话! IsNoAccess( err) { // 第138行 : 返回为零, fmt。 错误f ("未检查空间 ID %d 的 gitspace 认证 :%w, 空间ID, 错误) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? //BUG:这里没有 " 继续 " ——如果错误是被错误禁止的/错误是被授权的 授权空间ID [spaceID] = true // 第142行——无条件执行 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
返回授权空间ID, 无 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
爱丽丝 当`err'是`errForbidden'或`errUn Authority'时,则返回`real'
(`app/api/auth/auth.go:90')。 当“检查吉特空间”拒绝访问时:
- 'er!=0'=真实
- " !apiauth. Is no Access(err) " ——虚假(这是一个无访问错误)
- 合并条件 → 假 → 不返回错误
- 执行到`授权空间ID[空间ID]=真'
在所有情况下,该空间都有标记——授权检查没有效果。
□ 影响
已经从 Gitness 空间删除的认证用户可以发布:
获取/api/v1/ git 空间 授权: 接线器
响应从所有空格返回其 gitspace 配置, 包括它们没有的空格
允许使用“ gitspace view” 。 返回的每个“吉特空间通信”可包括:
- "吉特太空风暴" AccessKey ' - 连接运行环境的Access证书
- " GitspaceInstance.SSHCommand " -- -- 完整的SSH连接命令
- `GitspaceInstance.URL'-可访问端点URL
- `Gitspace Config.SSH TokenIdentifer' - 指所储存的SSH令牌
- `code repo url'/`code repo is private'-私人存放处详情 '
- " 空间-路径 " -- -- 未经授权的空间路径
如果在取消用户空间成员后, gitspace 实例仍在运行,则
已曝光的 " AccessKey " 可能允许用户保持对开发环境的访问
超过预定的撤销点。
□ PoC(英语:
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
# 第1步:用户注册并添加到一个空格,在那里创建一个 gitspace
# 第2步: 管理员删除用户
. . . . . . .内容来源: harness/harness