CVE-2020-15900:Artifex Ghostscript 沙箱破坏漏洞简记
字数 1416 2025-08-20 18:17:31
Ghostscript 沙箱破坏漏洞(CVE-2020-15900)分析与利用
漏洞概述
CVE-2020-15900是Artifex Ghostscript引擎中的一个沙箱破坏漏洞,允许攻击者绕过安全限制执行任意代码。该漏洞存在于Ghostscript v9.50至v9.52版本中,通过特殊的Postscript运算符rsearch触发缓冲区长度计算错误,导致内存破坏。
技术背景
Ghostscript简介
Ghostscript是Artifex软件公司开发的Postscript和PDF渲染引擎,用于将PDF和Postscript脚本转换为图像。作为唯一开源的Postscript渲染引擎,它被广泛用于PDF查看器和云计算服务中。
Postscript语言特性
Postscript是一种基于堆栈的语言,具有以下特点:
- 采用"先进后出"的堆栈结构
- 支持复杂逻辑运算和绘图操作
- 示例代码:
1 2 add % 将1和2相加 100 500 100 0 360 arc closepath stroke % 绘制一个圆
Postscript沙箱机制
Ghostscript的沙箱机制(--SAFER选项)旨在防止:
- 任意命令执行(如
%pipe%id) - 未经授权的文件读写
- 通过路径控制沙箱锁定文件操作到指定目录
漏洞分析
漏洞发现
通过模糊测试(AFL)发现,当使用rsearch运算符在空字符串中搜索空字符串时:
() dup rsearch
会导致缓冲区下溢,产生一个约4GB的"字符串类型"引用。
根本原因
rsearch运算符未正确处理空字符串搜索的边界情况:
- 搜索空字符串被逻辑运算为永真
- 计算"匹配后的值"长度时从0减去1,导致整数下溢(最大值-4294967295)
- 产生一个超大字符串引用,可覆盖堆内存
内存操作原语
通过以下Postscript代码可获取内存操作能力:
/memptr () dup rsearch pop pop pop def
读写内存操作:
memptr 123 get % 读取偏移123的字节
memptr 123 0 put % 在偏移123处写入0
利用技术
-
ref_t结构操作:
- ref_t占用128位(16字节)
- 包含类型、长度字段和值/指针
- 通过修改ref_t可以改变对象类型和行为
-
沙箱绕过:
- 定位
gs_activate_path_control函数 - 修改
path_control_active标志为0 - 需要遍历以下指针链:
dict -> memory -> gs_lib_ctx -> core -> path_control_active
- 定位
-
偏移量计算:
- 不同平台偏移量不同
- 通过反编译(如Ghidra)确定具体偏移
- 示例偏移(Windows x64):
- memory结构: +0xd0
- gs_lib_ctx: +0x8
- core: +0x88
漏洞利用步骤
-
创建超大字符串引用:
/memptr () dup rsearch pop pop pop def -
搜索并修改ref_t结构:
- 创建可识别数字模式
- 搜索堆内存匹配ref_t结构
- 修改类型位转换为字符串类型
-
遍历指针链:
- 从字典获取memory指针
- 通过计算偏移找到path_control_active
- 修改该标志为0禁用沙箱
-
执行任意操作:
- 文件读写
- 系统命令执行
- 其他内存破坏技术
影响与缓解
影响范围
- Ghostscript v9.50至v9.52版本
- 所有使用受影响版本Ghostscript的系统
防护建议
- 升级到修复版本
- 不要在处理不受信任文件时使用Ghostscript
- 使用额外隔离措施:
- 低特权账户运行
- 应用沙箱
- 独立主机环境
结论
CVE-2020-15900展示了即使有沙箱保护,Postscript渲染过程仍存在重大攻击面。该漏洞通过内存破坏技术可靠地绕过沙箱限制,强调了对Ghostscript等复杂解析器实施深度防御的必要性。建议用户采取多层次防护措施,而不仅依赖内置沙箱机制。