GitLab CVE-2022-1162 硬编码漏洞分析与复现指南
漏洞概述
漏洞描述
GitLab CE/EE 版本14.7(14.7.7之前)、14.8(14.8.5之前)和14.9(14.9.2之前)中存在一个严重安全漏洞,当使用OmniAuth提供商(如OAuth、LDAP、SAML)注册账户时,系统会为这些账户设置硬编码密码。攻击者可利用此漏洞潜在控制这些账户。
受影响版本
- Gitlab CE/EE >=14.7,<14.7.7
- Gitlab CE/EE >=14.8,<14.8.5
- Gitlab CE/EE >=14.9,<14.9.2
环境搭建
准备工作
- 选择Docker镜像:
gitlab/gitlab-ce:14.7.4-ce.0 - 创建docker-compose.yml文件:
version: '3'
services:
gitlab:
image: 'gitlab/gitlab-ce:14.7.4-ce.0'
container_name: 'gitlab'
restart: always
privileged: true
hostname: 'gitlab'
environment:
TZ: 'Asia/Shanghai'
ports:
- '8080:80'
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./logs:/var/log/gitlab
- 启动容器:
docker-compose up -d
重要目录说明
./config:包含GitLab配置文件gitlab.rb./data:GitLab数据存储目录./logs:GitLab日志目录
GitHub OAuth应用配置
-
在GitHub创建新的OAuth应用:
- Application name:任意名称
- Homepage URL:
http://127.0.0.1:8080 - Authorization callback URL:
http://127.0.0.1:8080/users/auth/github/callback
-
获取Client ID和Client Secret
GitLab OAuth配置
编辑/config/gitlab.rb文件,添加以下内容:
### OmniAuth Settings
gitlab_rails['omniauth_allow_single_sign_on'] = ['github']
gitlab_rails['omniauth_auto_link_ldap_user'] = true
gitlab_rails['omniauth_block_auto_created_users'] = true
gitlab_rails['omniauth_providers'] = [
{
name: "github",
app_id: "APP_ID", # 替换为实际Client ID
app_secret: "APP_SECRET", # 替换为实际Client Secret
args: { scope: "user:email" }
}
]
漏洞原理分析
OAuth2基础
-
传统身份验证模型的问题:
- 第三方应用存储明文凭证
- 泄露会导致用户密码及所有相关数据受损
-
OAuth2解决方案:
- 引入授权层分离客户端和资源所有者角色
- 使用访问令牌而非资源所有者凭证
-
OAuth2数据流程:
- 用户授权客户端
- 客户端获取授权码
- 客户端使用授权码获取访问令牌
- 客户端使用令牌访问资源
GitHub OAuth Web流程
- 用户被重定向请求GitHub身份验证
- 用户被GitHub重定向回站点
- 应用使用访问令牌访问API
漏洞核心
在password.rb中定义了默认密码123qweQWE!@#000000000,当使用第三方登录时,系统会自动创建与GitHub同名的账户并设置此硬编码密码。
漏洞复现步骤
-
访问GitLab登录页面(
http://127.0.0.1:8080),选择GitHub登录方式 -
GitLab会向
http://127.0.0.1:8080/users/auth/github发起POST请求 -
重定向到GitHub授权页面(
https://github.com/login/oauth/authorize),携带参数:client_id:GitLab配置中的app_idredirect_uri:授权后重定向地址response_type:固定为"code"scope:user:emailstate:随机字符串(防CSRF)
-
处理redirect_uri不匹配问题:
- 默认GitLab生成的redirect_uri为
http://gitlab/users/auth/github/callback - 需要将GitHub OAuth App的Callback URL修改为此值
- 默认GitLab生成的redirect_uri为
-
授权后跳转到
http://gitlab/users/auth/github/callback?code=xxxx&state=xxxx,但会出现502错误 -
手动修改URL为
http://127.0.0.1:8080/users/auth/github/callback?code=xxxx&state=xxxx -
此时会出现账户待批准提示:"您的帐户正在等待您的GitLab管理员的批准"
-
使用root账户登录GitLab,激活新创建的用户
-
测试使用硬编码密码
123qweQWE!@#000000000登录新账户
修复建议
-
升级到安全版本:
- 14.7.7及以上
- 14.8.5及以上
- 14.9.2及以上
-
升级前确保做好数据备份