CVE2022-0735 Gitlab-runner token获取后的可利用性分析
字数 1261 2025-08-20 18:17:31

CVE-2022-0735 Gitlab-runner Token获取与利用分析

漏洞概述

CVE-2022-0735是Gitlab中存在的一个安全漏洞,允许攻击者在特定条件下获取Gitlab-runner的token。该漏洞触发点位于issues评论功能处,攻击者无需项目权限即可获取runner token。

漏洞复现

官方复现文档位于:
https://gitlab.com/gitlab-org/gitlab/-/issues/353529

复现条件:

  • 需要知道项目的namespace和projectName
  • 无需项目权限

Gitlab-runner机制理解

CI/CD部署流程

Gitlab-runner执行流程分为两个主要步骤:

  1. 注册阶段

    • 客户端gitlab-runner携带获取的runner-token
    • 通过/api/v4/runners接口注册到Gitlab服务端
    • 服务端返回一个token用于后续轮询jobs
  2. 任务执行阶段

    • 当代码变动触发CI/CD部署时
    • 客户端gitlab-runner轮询服务(反复请求/api/v4/jobs/request接口)
    • 携带注册阶段获取的token
    • 获取CI/CD部署任务并拉取项目代码
    • 读取项目中的.gitlab-ci.yml配置文件并执行部署任务

利用条件与步骤

必要条件

  1. 获取有效的runner-token
  2. 注册runner时设置的tag_list必须与目标项目的.gitlab-ci.yml文件中的tags一致

利用步骤

  1. 部署gitlab-runner客户端

    • 可以使用docker部署
    • 执行gitlab-runner register命令进行注册
  2. 注册runner

    • 使用获取的runner-token
    • 确保tag设置正确
  3. 验证注册

    • 管理员可以在Gitlab平台后台上看到新注册的runner
  4. 触发部署

    • 修改项目代码触发CI/CD部署
    • 客户端的gitlab-runner会轮询并获取部署任务
  5. 获取项目信息

    • 部署过程中可以获取项目最新修改后的源码
    • 可以获取项目相关地址等信息

技术细节

关键API接口

  • 注册接口:/api/v4/runners
  • 任务轮询接口:/api/v4/jobs/request

配置文件要求

.gitlab-ci.yml文件中必须包含与注册runner时设置的tag_list匹配的tags,例如:

job1:
  script: echo "Hello World"
  tags:
    - docker

如果注册runner时设置的tag_listdocker,则上述配置会匹配。

防御措施

  1. 及时更新Gitlab到修复版本
  2. 限制runner的注册权限
  3. 监控异常的runner注册行为
  4. 使用最小权限原则配置CI/CD流程
  5. 定期轮换runner token

参考资源

  • Gitlab官方文档:https://gitlab.cn/docs/runner/
  • 官方漏洞公告:https://gitlab.com/gitlab-org/gitlab/-/issues/353529
CVE-2022-0735 Gitlab-runner Token获取与利用分析 漏洞概述 CVE-2022-0735是Gitlab中存在的一个安全漏洞,允许攻击者在特定条件下获取Gitlab-runner的token。该漏洞触发点位于issues评论功能处,攻击者无需项目权限即可获取runner token。 漏洞复现 官方复现文档位于: https://gitlab.com/gitlab-org/gitlab/-/issues/353529 复现条件: 需要知道项目的namespace和projectName 无需项目权限 Gitlab-runner机制理解 CI/CD部署流程 Gitlab-runner执行流程分为两个主要步骤: 注册阶段 : 客户端gitlab-runner携带获取的runner-token 通过 /api/v4/runners 接口注册到Gitlab服务端 服务端返回一个token用于后续轮询jobs 任务执行阶段 : 当代码变动触发CI/CD部署时 客户端gitlab-runner轮询服务(反复请求 /api/v4/jobs/request 接口) 携带注册阶段获取的token 获取CI/CD部署任务并拉取项目代码 读取项目中的 .gitlab-ci.yml 配置文件并执行部署任务 利用条件与步骤 必要条件 获取有效的runner-token 注册runner时设置的 tag_list 必须与目标项目的 .gitlab-ci.yml 文件中的 tags 一致 利用步骤 部署gitlab-runner客户端 : 可以使用docker部署 执行 gitlab-runner register 命令进行注册 注册runner : 使用获取的runner-token 确保tag设置正确 验证注册 : 管理员可以在Gitlab平台后台上看到新注册的runner 触发部署 : 修改项目代码触发CI/CD部署 客户端的gitlab-runner会轮询并获取部署任务 获取项目信息 : 部署过程中可以获取项目最新修改后的源码 可以获取项目相关地址等信息 技术细节 关键API接口 注册接口: /api/v4/runners 任务轮询接口: /api/v4/jobs/request 配置文件要求 .gitlab-ci.yml 文件中必须包含与注册runner时设置的 tag_list 匹配的tags,例如: 如果注册runner时设置的 tag_list 为 docker ,则上述配置会匹配。 防御措施 及时更新Gitlab到修复版本 限制runner的注册权限 监控异常的runner注册行为 使用最小权限原则配置CI/CD流程 定期轮换runner token 参考资源 Gitlab官方文档:https://gitlab.cn/docs/runner/ 官方漏洞公告:https://gitlab.com/gitlab-org/gitlab/-/issues/353529