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 -Ctmux -CC启动控制模式

CONTROL MODE工作机制

在CONTROL MODE下,tmux客户端与服务端通过特定格式的文本块进行通信:

  • 命令以回车结尾
  • 输出内容以%begin开头,%end结尾
  • 错误内容以%error开头
  • 服务端会发送状态变更通知(如%client-session-changed%exit等)

漏洞原理

根本原因

漏洞存在于iTerm2处理tmux的set-titles-stringstatus-leftstatus-right选项时,未对输入进行充分验证,导致命令注入。

漏洞触发流程

  1. 初始触发:通过发送\033P1000p%begin 1337 0 0\n%end 1337 0 0使iTerm2进入tmux模式
  2. 命令注入点:当show-options -v -g set-titles返回"on"且show-options -v -g set-titles-string返回恶意payload时
  3. 触发执行:通过发送%session-changed通知触发updateTmuxTitleMonitor函数
  4. 命令执行:当tmux命令出错时,待处理命令会被输出到终端并执行

关键代码分析

  1. TmuxGateway.m中的executeToken函数处理tmux返回数据
  2. handleShowSetTitleshandleShowSetTitlesString函数处理set-titles相关选项
  3. iTermTmuxOptionMonitor类的updateOnce方法构造并发送命令
  4. parseSessionChangeCommand函数处理%session-changed通知

漏洞利用

利用条件

  1. 用户使用iTerm2并执行某些命令(如ssh、curl等)
  2. 攻击者能够控制命令输出内容

利用步骤

  1. 伪造tmux服务端响应,发送初始化序列
  2. 对iTerm2的tmux命令请求返回精心构造的响应:
    • show-options -v -g set-titles返回"on"
    • show-options -v -g set-titles-string返回恶意payload
  3. 发送%session-changed通知触发漏洞
  4. 使后续tmux命令失败,导致命令队列中的恶意命令被执行

PoC示例

printf "\033P1000p%%begin 1337 0 0\n%%end 1337 0 0\n%%CVE-2019-9535\n"

修复方案

iTerm2通过以下方式修复了该漏洞:

  1. 不再发送服务器控制的值到tmux集成模式
  2. 使用会话编号而非会话名称
  3. 使用${T:}评估替代直接请求set-titles-string等选项
  4. 对保存在tmux服务器中的选项进行十六进制编码

防御建议

  1. 及时更新iTerm2到最新版本
  2. 避免在不信任的环境中执行可能返回不可信内容的命令
  3. 限制终端输出的解析能力

参考资源

  1. Mozilla安全团队公告
  2. iTerm2官方commit修复记录
  3. tmux源码分析
  4. iTerm2 tmux集成文档
  5. 相关技术分析文章

总结

CVE-2019-9535是一个典型的命令注入漏洞,利用了iTerm2对tmux协议处理的不严谨性。该漏洞影响广泛,利用门槛相对较低,但修复后风险已得到有效控制。理解该漏洞的原理有助于开发更安全的终端应用和协议实现。

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示例 修复方案 iTerm2通过以下方式修复了该漏洞: 不再发送服务器控制的值到tmux集成模式 使用会话编号而非会话名称 使用 ${T:} 评估替代直接请求 set-titles-string 等选项 对保存在tmux服务器中的选项进行十六进制编码 防御建议 及时更新iTerm2到最新版本 避免在不信任的环境中执行可能返回不可信内容的命令 限制终端输出的解析能力 参考资源 Mozilla安全团队公告 iTerm2官方commit修复记录 tmux源码分析 iTerm2 tmux集成文档 相关技术分析文章 总结 CVE-2019-9535是一个典型的命令注入漏洞,利用了iTerm2对tmux协议处理的不严谨性。该漏洞影响广泛,利用门槛相对较低,但修复后风险已得到有效控制。理解该漏洞的原理有助于开发更安全的终端应用和协议实现。