CVE-2022-1162 gitlab 硬编码漏洞分析
字数 1832 2025-08-29 08:32:24

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

环境搭建

准备工作

  1. 选择Docker镜像:gitlab/gitlab-ce:14.7.4-ce.0
  2. 创建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
  1. 启动容器:docker-compose up -d

重要目录说明

  • ./config:包含GitLab配置文件gitlab.rb
  • ./data:GitLab数据存储目录
  • ./logs:GitLab日志目录

GitHub OAuth应用配置

  1. 在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
  2. 获取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基础

  1. 传统身份验证模型的问题:

    • 第三方应用存储明文凭证
    • 泄露会导致用户密码及所有相关数据受损
  2. OAuth2解决方案:

    • 引入授权层分离客户端和资源所有者角色
    • 使用访问令牌而非资源所有者凭证
  3. OAuth2数据流程:

    • 用户授权客户端
    • 客户端获取授权码
    • 客户端使用授权码获取访问令牌
    • 客户端使用令牌访问资源

GitHub OAuth Web流程

  1. 用户被重定向请求GitHub身份验证
  2. 用户被GitHub重定向回站点
  3. 应用使用访问令牌访问API

漏洞核心

password.rb中定义了默认密码123qweQWE!@#000000000,当使用第三方登录时,系统会自动创建与GitHub同名的账户并设置此硬编码密码。

漏洞复现步骤

  1. 访问GitLab登录页面(http://127.0.0.1:8080),选择GitHub登录方式

  2. GitLab会向http://127.0.0.1:8080/users/auth/github发起POST请求

  3. 重定向到GitHub授权页面(https://github.com/login/oauth/authorize),携带参数:

    • client_id:GitLab配置中的app_id
    • redirect_uri:授权后重定向地址
    • response_type:固定为"code"
    • scopeuser:email
    • state:随机字符串(防CSRF)
  4. 处理redirect_uri不匹配问题:

    • 默认GitLab生成的redirect_uri为http://gitlab/users/auth/github/callback
    • 需要将GitHub OAuth App的Callback URL修改为此值
  5. 授权后跳转到http://gitlab/users/auth/github/callback?code=xxxx&state=xxxx,但会出现502错误

  6. 手动修改URL为http://127.0.0.1:8080/users/auth/github/callback?code=xxxx&state=xxxx

  7. 此时会出现账户待批准提示:"您的帐户正在等待您的GitLab管理员的批准"

  8. 使用root账户登录GitLab,激活新创建的用户

  9. 测试使用硬编码密码123qweQWE!@#000000000登录新账户

修复建议

  1. 升级到安全版本:

    • 14.7.7及以上
    • 14.8.5及以上
    • 14.9.2及以上
  2. 升级前确保做好数据备份

参考资源

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文件: 启动容器: 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 文件,添加以下内容: 漏洞原理分析 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_ id redirect_uri :授权后重定向地址 response_type :固定为"code" scope : user:email state :随机字符串(防CSRF) 处理redirect_ uri不匹配问题: 默认GitLab生成的redirect_ uri为 http://gitlab/users/auth/github/callback 需要将GitHub OAuth App的Callback URL修改为此值 授权后跳转到 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及以上 升级前确保做好数据备份 参考资源 GitLab 14.9.2安全发布公告 GitHub OAuth应用授权文档 RFC6749 OAuth2规范