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执行流程分为两个主要步骤:
-
注册阶段:
- 客户端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,例如:
job1:
script: echo "Hello World"
tags:
- docker
如果注册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