ghostscript的前世今生
字数 1575 2025-08-26 22:11:14

Ghostscript 安全机制深度解析与攻防技术

1. PostScript 语言基础

1.1 语言特性

PostScript 是 Adobe 提出的一种打印机语言,采用逆波兰表示法(后缀表示法):

  • 示例:1 1 add 相当于中缀表达式 1 + 1
  • 变量定义:以 / 开头,如 /a 1 def
  • 过程定义:用 {} 包裹,如 /inc {1 1 add ==} def

1.2 字典栈机制

PostScript 使用字典栈管理变量和操作符:

  • systemdict:系统自带变量和操作符
  • userdict:用户自定义操作符和变量
  • 字典栈决定了变量的作用域和查找顺序

2. PostScript 文件操作能力

2.1 基本文件操作

PostScript 具备强大的文件操作指令:

(/etc/passwd) (r) file 65536 string readstring == ==  # 文件读取
(/etc/*) {==} 65536 string filenameforall            # 目录遍历

2.2 命令执行

Ghostscript 支持通过 pipe 执行系统命令:

(%pipe%id) (r) file 65536 string readstring == ==  # Unix 系统命令执行

3. Ghostscript SAFER 模式

3.1 原始 SAFER 模式

通过 -dSAFER 参数启用,在 Resource/Init/gs_init.ps 中定义:

  • .locksafe 方法限制 userparamsdevice 参数
  • .locksafe_userparams 严格限制文件读写权限
  • LockFilePermissions 锁定权限属性

3.2 安全绕过技术

Google Project Zero 研究员 Tavis Ormandy 发现多个绕过方法:

  1. forceput 命令:无视权限的字典赋值操作
    systemdict /SAFER false .forceput
    userparams /LockFilePermissions false .forceput
    
  2. 通过错误处理泄露敏感命令
    • 修改 errordict 处理函数
    • 利用 $error 字典的 ostack 获取执行栈
    • 从包含 forceput 的系统过程中提取该命令

3.3 CVE-2019-14811 分析

典型利用链:

  1. .pdf_hook_DSC_Creator 提取 forceput
  2. 通过触发 /typecheck 错误获取执行栈
  3. 定位并提取栈中的 forceput 命令
  4. 修改 SAFER 相关参数解除限制
  5. 通过 pipe 执行系统命令

4. 新版 Ghostscript 安全机制

4.1 改进的 SAFER 模式

新版采用完全不同的安全架构:

  • 使用 .lockfileaccess 设置 SAFER
  • 访问控制权限存储在全局结构体而非 userparams
  • .activatepathcontrol 启用后修改权限会导致解释器退出

4.2 防御效果

  • 旧版绕过技术失效
  • 需要更底层的漏洞(如类型混淆)才能修改安全标志位
  • 目前主流 Linux 发行版尚未完全更新此机制

5. ImageMagick 集成问题

5.1 解析机制

  • ImageMagick 通过文件头判断解析方式
  • delegates.xml 中配置了 Ghostscript 调用方式
  • 但许多文件格式仍可能触发 Ghostscript 解析

5.2 安全建议

  • 检查 identify -list format 所有支持格式
  • 更新 Ghostscript 到最新版本
  • 限制 ImageMagick 处理的文件类型

6. 防御与检测

6.1 防御措施

  1. 升级至最新 Ghostscript 版本
  2. 确保启用新版 SAFER 模式
  3. 限制 PostScript 文件处理能力
  4. 监控异常文件操作行为

6.2 检测方法

  1. 检查 .addcontrolpath 行为
    [ (/tmp) ] {/PermitFileWriting exch .addcontrolpath} forall
    
  2. 监控 forceput 相关操作
  3. 分析错误处理函数修改行为

7. 参考资源

  1. PostScript 语言参考手册
  2. Ghostscript 官方文档
  3. Tavis Ormandy 的漏洞报告
  4. ImageMagick 安全策略
Ghostscript 安全机制深度解析与攻防技术 1. PostScript 语言基础 1.1 语言特性 PostScript 是 Adobe 提出的一种打印机语言,采用 逆波兰表示法 (后缀表示法): 示例: 1 1 add 相当于中缀表达式 1 + 1 变量定义:以 / 开头,如 /a 1 def 过程定义:用 {} 包裹,如 /inc {1 1 add ==} def 1.2 字典栈机制 PostScript 使用字典栈管理变量和操作符: systemdict :系统自带变量和操作符 userdict :用户自定义操作符和变量 字典栈决定了变量的作用域和查找顺序 2. PostScript 文件操作能力 2.1 基本文件操作 PostScript 具备强大的文件操作指令: 2.2 命令执行 Ghostscript 支持通过 pipe 执行系统命令: 3. Ghostscript SAFER 模式 3.1 原始 SAFER 模式 通过 -dSAFER 参数启用,在 Resource/Init/gs_init.ps 中定义: .locksafe 方法限制 userparams 和 device 参数 .locksafe_userparams 严格限制文件读写权限 LockFilePermissions 锁定权限属性 3.2 安全绕过技术 Google Project Zero 研究员 Tavis Ormandy 发现多个绕过方法: forceput 命令 :无视权限的字典赋值操作 通过错误处理泄露敏感命令 : 修改 errordict 处理函数 利用 $error 字典的 ostack 获取执行栈 从包含 forceput 的系统过程中提取该命令 3.3 CVE-2019-14811 分析 典型利用链: 从 .pdf_hook_DSC_Creator 提取 forceput 通过触发 /typecheck 错误获取执行栈 定位并提取栈中的 forceput 命令 修改 SAFER 相关参数解除限制 通过 pipe 执行系统命令 4. 新版 Ghostscript 安全机制 4.1 改进的 SAFER 模式 新版采用完全不同的安全架构: 使用 .lockfileaccess 设置 SAFER 访问控制权限存储在全局结构体而非 userparams .activatepathcontrol 启用后修改权限会导致解释器退出 4.2 防御效果 旧版绕过技术失效 需要更底层的漏洞(如类型混淆)才能修改安全标志位 目前主流 Linux 发行版尚未完全更新此机制 5. ImageMagick 集成问题 5.1 解析机制 ImageMagick 通过文件头判断解析方式 delegates.xml 中配置了 Ghostscript 调用方式 但许多文件格式仍可能触发 Ghostscript 解析 5.2 安全建议 检查 identify -list format 所有支持格式 更新 Ghostscript 到最新版本 限制 ImageMagick 处理的文件类型 6. 防御与检测 6.1 防御措施 升级至最新 Ghostscript 版本 确保启用新版 SAFER 模式 限制 PostScript 文件处理能力 监控异常文件操作行为 6.2 检测方法 检查 .addcontrolpath 行为 监控 forceput 相关操作 分析错误处理函数修改行为 7. 参考资源 PostScript 语言参考手册 Ghostscript 官方文档 Tavis Ormandy 的漏洞报告 ImageMagick 安全策略