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方法限制userparams和device参数.locksafe_userparams严格限制文件读写权限LockFilePermissions锁定权限属性
3.2 安全绕过技术
Google Project Zero 研究员 Tavis Ormandy 发现多个绕过方法:
- forceput 命令:无视权限的字典赋值操作
systemdict /SAFER false .forceput userparams /LockFilePermissions false .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行为[ (/tmp) ] {/PermitFileWriting exch .addcontrolpath} forall - 监控
forceput相关操作 - 分析错误处理函数修改行为