iTerm2 任意命令执行漏洞分析(CVE-2019-9535)
字数 1718 2025-08-26 22:11:39
iTerm2 任意命令执行漏洞分析(CVE-2019-9535)技术文档
漏洞概述
CVE-2019-9535是iTerm2终端模拟器中存在的一个高危漏洞,CVSS评分为9.8(Critical)。该漏洞允许攻击者通过精心构造的输出内容,在用户计算机上执行任意命令。漏洞存在于iTerm2的tmux集成模块中,影响范围广泛,因为许多常见命令(如ssh、curl、cat等)都可能触发此漏洞。
受影响版本
漏洞存在时间长达7年,影响2019年10月9日之前的所有iTerm2版本。
技术背景
tmux简介
tmux是一款终端复用软件,允许用户在一个窗口中创建、访问和控制多个分离的终端。主要特性包括:
- 会话与窗口分离
- 支持CONTROL MODE(控制模式)用于程序交互
- 通过
tmux -C或tmux -CC启动控制模式
CONTROL MODE工作机制
在CONTROL MODE下,tmux客户端与服务端通过特定格式的文本块进行通信:
- 命令以回车结尾
- 输出内容以
%begin开头,%end结尾 - 错误内容以
%error开头 - 服务端会发送状态变更通知(如
%client-session-changed、%exit等)
漏洞原理
根本原因
漏洞存在于iTerm2处理tmux的set-titles-string、status-left和status-right选项时,未对输入进行充分验证,导致命令注入。
漏洞触发流程
- 初始触发:通过发送
\033P1000p%begin 1337 0 0\n%end 1337 0 0使iTerm2进入tmux模式 - 命令注入点:当
show-options -v -g set-titles返回"on"且show-options -v -g set-titles-string返回恶意payload时 - 触发执行:通过发送
%session-changed通知触发updateTmuxTitleMonitor函数 - 命令执行:当tmux命令出错时,待处理命令会被输出到终端并执行
关键代码分析
- TmuxGateway.m中的
executeToken函数处理tmux返回数据 handleShowSetTitles和handleShowSetTitlesString函数处理set-titles相关选项iTermTmuxOptionMonitor类的updateOnce方法构造并发送命令parseSessionChangeCommand函数处理%session-changed通知
漏洞利用
利用条件
- 用户使用iTerm2并执行某些命令(如ssh、curl等)
- 攻击者能够控制命令输出内容
利用步骤
- 伪造tmux服务端响应,发送初始化序列
- 对iTerm2的tmux命令请求返回精心构造的响应:
show-options -v -g set-titles返回"on"show-options -v -g set-titles-string返回恶意payload
- 发送
%session-changed通知触发漏洞 - 使后续tmux命令失败,导致命令队列中的恶意命令被执行
PoC示例
printf "\033P1000p%%begin 1337 0 0\n%%end 1337 0 0\n%%CVE-2019-9535\n"
修复方案
iTerm2通过以下方式修复了该漏洞:
- 不再发送服务器控制的值到tmux集成模式
- 使用会话编号而非会话名称
- 使用
${T:}评估替代直接请求set-titles-string等选项 - 对保存在tmux服务器中的选项进行十六进制编码
防御建议
- 及时更新iTerm2到最新版本
- 避免在不信任的环境中执行可能返回不可信内容的命令
- 限制终端输出的解析能力
参考资源
- Mozilla安全团队公告
- iTerm2官方commit修复记录
- tmux源码分析
- iTerm2 tmux集成文档
- 相关技术分析文章
总结
CVE-2019-9535是一个典型的命令注入漏洞,利用了iTerm2对tmux协议处理的不严谨性。该漏洞影响广泛,利用门槛相对较低,但修复后风险已得到有效控制。理解该漏洞的原理有助于开发更安全的终端应用和协议实现。