sn0x-sharma/CVE-2026-57850
GitHub: sn0x-sharma/CVE-2026-57850
针对 RustDesk 中继握手降级漏洞(CVE-2026-57850)的概念证明工具,复现中继路径上签名密钥缺失导致会话降级为明文并允许认证后控制消息注入的问题。
Stars: 0 | Forks: 0
# CVE-2026-57850 - RustDesk 中继握手降级
## 摘要
当 rendezvous/relay 路径上的已签名对等密钥材料(`signed_id_pk`)缺失或无效时,RustDesk 的中继会话设置会“故障开放”。处于中继位置的攻击者可以强制触发此情况,将降级会话为明文,观察传输中的 `LoginRequest`,并在合法身份验证成功后注入控制消息(例如 `MouseEvent`)——而无需知道用户的密码。
## 漏洞详情
### 根本原因
客户端根据 `signed_id_pk` 的存在与否来决定是否请求安全中继:
```
// src/client.rs:723
// relay secure mode requested from !signed_id_pk.is_empty()
```
当签名密钥缺失或无效时,客户端会发送一条空消息以满足对等端并返回,**而不安装加密密钥**(第 773–792 行)。由于不满足安全标志和密钥长度要求(server.rs:200),服务端连接继续进入正常登录流程,并且非安全路径上的密钥确认会被显式清除(server.rs:233)。
在合法客户端通过身份验证后,已授权的会话会接受语法有效的明文控制消息——包括在宽泛的授权状态下分发的 `MouseEvent`、键盘事件和屏幕截图请求(connection.rs:2691, 2697, 2833, 3486)。
### 源码证据
| 文件 | 行号 | 相关性 |
|---|---|---|
| `src/client.rs` | 511, 553 | 客户端从 rendezvous/relay 响应中接受已签名对等密钥 |
| `src/client.rs` | 723 | 从 `!signed_id_pk.is_empty()` 推导中继安全模式 |
| `src/client.rs` | 773–792 | 缺失/不受信任的密钥 → 发送空消息,未安装对等端加密密钥 |
| `src/client.rs` | 813–824 | 握手不匹配会发送空响应并继续,而不是“故障关闭” |
| `src/rendezvous_mediator.rs` | 499 | 中继响应的安全标志被传播到连接设置中 |
| `src/server.rs` | 200 | 服务端安全设置以安全标志和密钥长度为条件 |
| `src/server.rs` | 233 | 非安全路径上显式清除密钥确认 |
| `src/server/connection.rs` | 2691, 2697, 2833, 3486 | 身份验证后,在宽泛的授权状态下分发 鼠标/键盘/屏幕截图 事件 |
## 攻击流程
```
1. Attacker controls relay/rendezvous metadata path
2. Strips or invalidates signed_id_pk in relay response
3. Client requests non-secure relay, sends empty handshake frame
4. Server continues login flow (secure flag not set)
5. Legitimate client completes normal RustDesk authentication
6. Attacker observes plaintext LoginRequest in transit
7. Attacker injects plaintext MouseEvent / control messages
8. Server accepts injected messages — session is authorized, messages are syntactically valid
```
### 构建与运行
**前提条件:** Rust 工具链,位于已知路径的 RustDesk 源码。
```
# POSIX
cd session-downgrade
RUSTDESK_REPO_ROOT=/path/to/rustdesk cargo run -- \
--repo-root /path/to/rustdesk \
--out ./payloads
```
```
# Windows
cd rustdesk-session-permission-pocs\session-downgrade
$env:RUSTDESK_REPO_ROOT = "C:\path\to\rustdesk"
cargo run -- --repo-root $env:RUSTDESK_REPO_ROOT --out .\payloads
```
## 前置条件
- 攻击者必须控制中继/rendezvous 元数据路径(自托管中继或在该路径上的中间人位置)
- 合法用户完成正常的 RustDesk 身份验证 —— 密码不会被恢复
- 演示了身份验证后的明文观察和控制消息注入
- 未演示 RCE
## 修复
已在 **RustDesk 1.4.9** 中修复。
修复措施包括在服务端强制执行会话连接范围,从而使得仅获得有限会话类型的对等端无法发送保留给完全远程会话的控制消息。
**建议的“故障关闭”行为(在漏洞披露中提出):**
- 对于预期安全的 relay 会话,要求提供有效的已签名对等密钥
- 不要从可被 relay 路径剥离的元数据中推导中继安全模式
- 除非用户明确选择加入不安全模式,否则拒绝空/无密钥的握手回退
- 在登录前绑定对等端身份、对等端公钥和中继安全状态
## 披露时间线
| 日期 | 事件 |
|---|---|
| 2026-06-02 | 独立发现并向 RustDesk 安全团队进行负责任的披露 |
| 2026-07-07 | RustDesk 1.4.9 发布修复版本,要求进行验证测试 |
| 2026-07-10 | VulnCheck 发布 CVE-2026-57850 |
## 参考
- [CVE-2026-57850 — cve.org](https://www.cve.org/CVERecord?id=CVE-2026-57850)
- [修复 PR #15469](https://github.com/rustdesk/rustdesk/pull/15469)
- [RustDesk 1.4.9 发布](https://github.com/rustdesk/rustdesk/releases/tag/1.4.9)
- [供应商讨论 #15492](https://github.com/rustdesk/rustdesk/discussions/15492)
## CWE
- CWE-862: 缺失授权
*报告人:[sn0x-sharma](https://github.com/sn0x-sharma)*
标签:RustDesk, 中间人攻击, 可视化界面, 密码学, 手动系统调用, 漏洞分析, 路径探测, 远程控制, 降级攻击