Ghostty 1.4.0发布:性能优化与安全修复

Ghostty 1.4.0发布,修复多项安全漏洞。该版本历时7个月,由172位贡献者完成2889次提交,实现Kitty图形协议完整支持及性能优化,并解决括号粘贴绕过等严重安全问题。

Ghostty 1.4.0 发布:性能大幅优化、完整支持 Kitty 图形协议及多项安全修复

2026 年 10 月 27 日,终端模拟器 Ghostty 正式发布 1.4.0 版本。这是一个主要更新,涵盖了显著的性能与内存改进、100% 完整的 Kitty 图形协议实现(包括动画和相对放置)、SSH 集成增强,以及跨平台的数百项修复。

滚动回溯内存占用减少70%至90%

该版本历时 7 个月开发,由 172 位贡献者在 2,889 次提交中完成。官方维护者表示,发布说明经过手工整理,耗时超过 16 小时,旨在提供详尽的变更记录。

安全漏洞修复

本次更新修复了多个严重的安全问题,部分漏洞此前尚未分配 CVE 编号,后续将补充更新:

  • 括号粘贴模式绕过:在不使用括号粘贴模式的程序中,恶意粘贴可能在无确认的情况下执行命令,需用户交互触发。
  • Kitty 图形命令攻击:恶意 Kitty 图形命令可能导致 Ghostty 崩溃或挂起,强制分配大量文件,或在有限情况下读取/删除临时目录之外的文件。
  • GHSA-hcr9-7hcr-mjm8:恶意终端输出可通过 tmux 控制模式导致 Ghostty 崩溃并关闭所有窗口,无需安装 tmux。影响版本为 Ghostty 1.3.0 和 1.3.1。
  • GHSA-hp9c-qp4q-cpw3:通过具有零大小或超大面板的 tmux 控制模式布局产生相同影响。影响版本为 Ghostty 1.3.0 和 1.3.1。
  • 内存损坏风险:若清除屏幕至回滚时删除了持有样式或超链接的光标页面,可能导致内存损坏。此问题仅在极小的回滚限制(如 0)下触发,默认配置不受影响。
  • GHSA-2r63-vmw6-3m3c:精心设计的目录名可使 zsh shell 集成发送任意转义序列(如通过 OSC 52 静默替换剪贴板)。需从不信任的来源(如克隆仓库)获取内容才能触发。
  • macOS 特定漏洞:
    • GHSA-cw69-wm67-5pv8:点击构造的 OSC 8 超链接可能打开不安全的本地文件或自定义 URL 方案,导致任意命令执行。现 Ghostty 已阻止不安全目标并确认自定义 URL 方案。需 cmd-click 触发。
    • GHSA-mfw9-xcr3-7gfp:连接配置检测到的链接存在上述类似问题。需 cmd-click 触发。
    • GHSA-v8cw-fg4j-jcc4:拖放文本跳过粘贴保护,效果同上。需拖放操作触发。
    • GHSA-mxqx-236q-wrv7:打开包含控制字符的文件名可能运行不同于确认对话框显示的命令。需在系统中创建此类文件并确认对话框。

macOS 27 (Golden Gate) 兼容性

Ghostty 1.4 现已支持 macOS 27,主要工作集中在兼容性修复上:

  • 标题栏选项卡样式 (macos-titlebar-style = tabs) 配置恢复正常。
  • 主题顶部不再显示实心灰色条,新玻璃风格能与终端背景融合。
  • 开启“减少透明度”时,不再覆盖终端顶部行。
  • 应用图标移除薄边框。
  • 在无窗口运行时,“新建窗口”快捷键不再错误地打开两个窗口。
注:Ghostty 1.3.1 可在 macOS 27 上运行,但存在上述视觉问题(如灰色标签)。

尽管曾计划要求 macOS 14,但当前版本仍保持对 macOS 13 (Ventura) 的完全兼容。鉴于 Apple 已于 2025 年秋季停止对 macOS 13 的安全支持,建议用户升级系统。

Kitty 图形协议完整实现

Ghostty 现已支持 Kitty 图形协议的动画和相对位置功能,成为首个在 Kitty 之外完全实现该协议规范的终端。

  • 动画支持:使用 Kitty 协议显示的动画图像(如 icat 展示的 GIF)现在可正常播放,而非显示静态帧。支持传输、组合、播放控制及不可见时的暂停。
  • 相对定位:程序可将图像相对于另一图像定位,子图像随父图像移动。
  • 规范符合性:进行了全面的合规检查,修复数十处行为差异。例如,图像可在滚动区域内随文本滚动 (#4323),重新传输图像 ID 可替换旧图像 (#6711),无效数据返回错误响应而非静默失败。
  • 性能提升:图像负载通过 SIMD 批量解析,大图像传输速度提升 16 倍(基准测试:64 MiB 图像数据,x86_64 Linux),绘制成本显著降低。

内存与性能优化

Ghostty 1.4 引入了透明压缩可见滚动回溯的功能,典型文本历史物理内存占用减少 70% 至 90%。压缩仅在终端空闲时运行,向后滚动或搜索时按需解压,不影响 I/O 吞吐量。

  • 默认回滚限制提升:从每台终端 10MB 提升至 50MB。由于压缩效率,实际物理内存占用通常低于旧版的 10MB 限制。
  • 基础内存降低:新的空终端在 macOS 上仅使用约 16KB 终端页面内存(1.3.1 版为 128KB)。
  • 内存释放:在 macOS 和 Linux 上,清除或修剪滚动后释放的内存立即返回操作系统。
  • GPU 资源管理:隐藏标签释放 GPU 资源。macOS 上,1 个可见标签 + 20 个隐藏标签的 GPU 内存从 ~385 MiB 降至 18 MiB。重建耗时不到 1 毫秒。

核心性能改进包括:

  • I/O 吞吐量:发现 macOS 内核限制每次 pty 读取约 1KB 数据。通过分离读取与解析线程,端到端 I/O 吞吐量在 macOS (M4 Max) 上提升 25% 至 55%。
  • 解析速度:简单 ASCII 文本解析速度从 128 MB/s 升至 725 MB/s (5.7 倍),CJK 文本提升 3.4 倍。处理 asciinema 2.6GB 数据集速度提升约 25%。macOS 上 150MB 文本文件处理时间从 1.5 秒降至 566 毫秒。
  • 调整尺寸:带有大回滚(10,000 行)的终端调整尺寸速度快约 6 倍;含 CJK 或表情符号的历史记录快 3-5 倍。
  • 渲染:重型渲染器将每个终端的锁定时间减少 2.7 至 11 倍。
  • 复制与搜索:格式化为纯文本、HTML 或 VT 的速度提升 1.5 至 8 倍。
  • 启动速度:macOS 上从启动到可见窗口快约 15%,首次渲染快 27%。
  • OSC 序列:OSC 52 剪贴板负载解析速度提升约 30 倍,短序列(如标题更改)快 6 倍。
  • 休眠机制:macOS 上无可绘制内容时渲染链休眠;GTK 上隐藏标签停止渲染。

GTK 渲染管道重构

GTK 应用程序采用新的渲染管道,不再使用 GtkGLArea。渲染器通过 EGL 在独立线程绘制,导出 DMABUF 供 GTK 显示。

  • 三重缓冲:显著减少画面撕裂。
  • 分数缩放清晰度:修复了 125% 或 150% 缩放下文本和框画字符模糊的问题 (#1938)。像素映射更精确。
  • 依赖变化:需要系统 EGL 库。若 GPU 驱动不支持 DMABUF 导出,将通过 CPU 复制回退,性能较低但可用。

Kitty 剪贴板协议 (OSC 5522)

Ghostty 在 macOS 和 GTK 上实现了 Kitty 剪贴板协议,允许终端程序读写任意类型剪贴板数据(如图像、HTML),并选择格式。

  • 权限控制:遵循现有的剪贴板读写配置。默认允许读取提示和写入。权限提示显示内容预览(含图片)。
  • 会话记忆:发送密码的程序可选择在剩余会话中记住授权。
  • 大小限制:新增 clipboard-write-limit-bytes 配置,默认限制单次写入大小为 64 MiB。超限写入失败且不影响现有剪贴板。

分割面板拖拽重排

GTK 平台现已支持通过拖动分割手柄重新排列面板,匹配 macOS 功能。

  • 操作方式:当标签页有两个以上分割时,顶部显示拖动手柄。可将分割拖至其他分割、标签页或窗口。覆盖层显示落点指示。终端内容、工作目录和进程随之移动。
  • 配置选项:新增 drag-handle 配置:auto(默认)、always 或 never。
  • 平台差异:GTK 上分割只能拖至其他分割;拖出创建新标签或窗口仅限 macOS。

终端仿真核心改进

Ghostty 1.4 包含数十项核心终端仿真改进,并在 CI 中引入 Thomas Dickey 的 esctest 一致性套件。

  • xterm 兼容性:修复光标移动、制表位、字符集、模式报告等方面的差异。
  • 新序列支持:软终端重置 (DECSTR)、扩展光标位置报告 (DECXCPR)、退格键模式 (DECBKM)、字符单位屏幕大小报告 (CSI 19 t)。
  • 可见性报告:程序可通过模式 2033 查询终端是否可见,以便在隐藏时停止渲染。
  • 键盘编码:更贴近 xterm,修复 modifyOtherKeys 模式 2 和非 ASCII 键的传统 Alt-as-Escape 编码。
  • 默认禁用的危险序列:
    # 允许程序调整窗口大小 (CSI 8 t)
    vt-window-resize-allowed = true
    
    # 允许程序请求屏幕校验和 (DECRQCRA)
    vt-xt-checksum-report = true
    

SSH 集成增强

Ghostty 1.4 引入 ghostty +ssh CLI 动作,作为 ssh 的直接替代品,自动准备远程会话环境。

ghostty +ssh user@example.com

alias ssh='ghostty +ssh --'
  • Terminfo 安装:连接前自动在远程主机安装 Ghostty 的 terminfo,确保使用正确的 xterm-ghostty TERM 值。若失败则回退至 xterm-256color。
  • 环境变量转发:自动转发 COLORTERM, TERM_PROGRAM, TERM_PROGRAM_VERSION。
  • 统一逻辑:Bash, Zsh, Fish, Elvish, Nushell 的 shell 集成均调用 +ssh,消除了之前各脚本中的重复逻辑(约占脚本总量的三分之一)。
  • 可靠性提升:始终安装捆绑的 terminfo,忽略远程已有条目。Ghostty 更新时自动重装。缓存按主机和端口区分。不再需要本地的 infocmp 或 Ghostty terminfo。
  • 配置覆盖修复:ssh-env 不再静默覆盖 ~/.ssh/config 中的 SetEnv 条目 (#11518)。
  • 缓存管理:+ssh-cache 命令支持位置参数目的地和新标志 --prune=30d。

系统要求与破坏性变更

系统要求:

  • macOS:最低版本仍为 macOS 13 (Ventura),已适配 macOS 27。
  • GTK:要求 GTK 4.18 和 libadwaita 1.7(1.3 版为 GTK 4.14/libadwaita 1.5)。Ubuntu 24.04 LTS 不满足此要求,建议使用旧版 Ghostty 或 Flatpak 包。
  • OpenGL (GTK):最低版本仍为 4.3,但渲染改为通过 EGL 进行。若启动失败出现 EGL 错误,请检查 GPU 驱动是否提供可用的 EGL 实现。

行为变更:

  • copy-on-select:接受值变为 none, primary, clipboard, both。clipboard 含义改变:以前同时复制到选择剪贴板和系统剪贴板,现在仅复制到系统剪贴板。若需旧行为,请设为 both。#12600 #12604
  • macOS copy-on-select 默认值:默认改为 none(原为 true)。选中文本不再自动复制,中键粘贴默认失效。恢复 1.3 行为请设 copy-on-select = primary。显式设置 copy-on-select = true 在 macOS 上现在仅复制到系统剪贴板。#12600 #12604
  • macOS 键盘绑定:cmd+arrow_up/down 恢复执行 jump_to_prompt(匹配 Terminal.app 和 Ghostty 1.2)。1.3 版中这些键被硬编码为滚动至顶/底且不可重绑。保留 1.3 行为请手动绑定 scroll_to_top/bottom。#12245
  • GTK 默认绑定:默认 ctrl+shift+p ...(原文截断,此处略)

评论 0

0/500

评论需审核后展示,请文明发言

💬
还没有评论,来说两句

相关阅读