# RustFS RPC签名验证泄露密钥
## 概述
RustFS 在处理无效 RPC 签名时,会将 HMAC 共享密钥及相关敏感信息记录到日志中,导致密钥泄露。
## 影响版本
从 `1.0.0-alpha.1` 到 `1.0.0-alpha.79`。
## 细节
在 `crates/ecstore/src/rpc/http_auth.rs` 文件中,处理无效签名的代码分支会记录包含 `secret` 和 `expected_signature` 的日志,这些数据均来源于共享的 HMAC 密钥。任何带有无效签名的请求都会触发该日志记录逻辑。该函数可通过 RPC 和管理接口请求触发。
## 影响
攻击者可通过读取日志获取 HMAC 共享密钥,进而伪造合法的 RPC 请求,实现未授权操作。该问题已在 `1.0.0-alpha.80` 中修复。
是否为 Web 类漏洞: 未知
判断理由:
| # | POC 描述 | 源链接 | 神龙链接 |
|---|
标题: RPC signature verification logs shared secret · Advisory · rustfs/rustfs · GitHub -- 🔗来源链接
标签:x_refsource_CONFIRM
神龙速读:
### 关键漏洞信息
- **CVE ID**: CVE-2026-22782
- **Severity**: Low
- **Affected Versions**: >= 1.0.0-alpha.1, <= 1.0.0-alpha.79
- **Patched Versions**: 1.0.0-alpha.80
### 漏洞描述
#### Summary
无效的 RPC 签名会导致服务器记录共享的 HMAC 密钥(和预期签名),从而暴露出密钥并允许伪造 RPC 调用。
#### Details
在文件 `crates/ectore/src/rpc/http_auth.rs:115-122` 中,无效签名的分支记录了敏感数据:
```rust
if signature != expected_signature {
error!(
"verify_rpc_signature: Invalid signature: secret {}, url {}, method {}, timestamp {}, signature {}, expected_secret, url, method, timestamp, signature, expected_signature
);
return Err(std::io::Error::other("Invalid signature"));
}
```
此日志行包括 `secret` 和 `expected_signature`,两者均来自共享的 HMAC 密钥。任何无效签名的请求都会触发此路径。该函数可被 RPC 和管理员请求处理程序调用。
#### Proof of Concept (PoC)
1. 启用错误日志记录运行 RustFS。
2. 发送一个带有无效签名的请求:
```bash
ts=$(date +%s)
curl -v \
-H "x-rustfs-timestamp: $ts" \
-H "x-rustfs-signature: invalid-signature" \
"http://localhost:9000/rustfs/rpc/read_file_stream?disk=foo&volume=bar&path=baz&offset=0&length=1"
```
3. 观察到的输出:
```bash
HTTP 403 AccessDenied: Invalid signature
verify_rpc_signature: Invalid signature: secret rustfsadmin, url /rustfs/rpc/read_file_stream?disk=foo&vol...
```
### 影响
- 暴露了共享的 RPC HMAC 密钥到日志读者。
- 允许具有日志访问权限的攻击者伪造有效的 RPC 签名并发出未经授权的 RPC 调用。
标题: fix: Remove secret and signature from the log (#1466) · rustfs/rustfs@6b2eebe · GitHub -- 🔗来源链接
标签:x_refsource_MISC
神龙速读:
从这个网页截图中可以获取到以下关于漏洞的关键信息:
- **修正内容**:
- `Commit 6b2eebe` 主要用于移除日志中的秘密信息和签名(`fix: Remove secret and signature from the log (#1466)`)。
- 更新了敏感信息的处理和日志输出方式,能更好地保护敏感字段,并且在日志中不会泄露敏感数据。
- **关键变更**:
```markdown
**Commit修改文件:**
- crates/ecstore/src/rpc/http_auth.rs:更新了验证签名函数 `verify_rpc_signature` 处理日志输出的方式,在日志中不再直接输出原始签名值,而是进行部分遮盖。
- rustfs/src/admin/mod.rs:删除了与平台无关的性能分析接口等机器信息,避免敏感信息暴露。
- rustfs/src/config/mod.rs:移除了所有不必要的敏感字段如访问密钥和密钥,增加了错误日志时对敏感字段的掩码处理办法。
```
- **保护措施**:
- 通过重新格式化敏感字段日志输出,使用特定格式分别处理日志中的 `signature` 和 `expected_signature` 防止敏感数据被完全显示。
- 引入 `mask_sensitive` 函数屏蔽 `secret_key` 和 `access_key` 等敏感信息部分或者完整信息,进一步防止敏感值外泄。
- 增加了更好的字段注释和变化说明,说明本次提交为修复和预防安全泄露的措施。
标题: rustfs/crates/ecstore/src/rpc/http_auth.rs at 9e162b6e9ebb874cc1d06a7b33bc4a05786578aa · rustfs/rustfs · GitHub -- 🔗来源链接
标签:x_refsource_MISC
神龙速读:
### 关键信息摘要
#### 漏洞类型
- **签名验证**
#### 漏洞描述
- **签名验证失效**:代码实现中可能存在签名验证逻辑缺陷,导致请求签名可以被绕过或篡改。
- **时间戳验证**:验证时间戳是否在允许的时间范围内,防止重放攻击。
#### 涉及文件
- `ecstore/src/rpc/http_auth.rs`
#### 漏洞关键代码片段
```rust
pub fn verify_rpc_signature(url: &str, method: &Method, headers: &HeaderMap) -> ... {
// Check signature and timestamp
if signature != expected_signature {
error!(
"verify_rpc_signature: Invalid signature: {
secret, url, method, timestamp, signature, expected_signature
}
);
return Err(std::io::Error::new(std::io::ErrorKind::Other, "Invalid signature"));
}
}
```
#### 潜在风险
- **签名被篡改**:攻击者可能通过篡改请求中的签名字段绕过验证。
- **重放攻击**:如果时间戳验证逻辑不严格,攻击者可能利用旧的请求进行重放攻击。
#### 建议措施
1. **严格验证签名**:确保签名验证逻辑正确无误,使用安全的哈希算法。
2. **加强时间戳验证**:严格检查时间戳的有效性,防止过期和提前的请求。
3. **代码审计**:对相关代码进行安全审计,确保没有其他潜在的安全隐患。
4. **更新依赖库**:确保使用的第三方库是最新版本,避免已知的安全漏洞。
暂无评论