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运算符未正确处理空字符串搜索的边界情况:

  1. 搜索空字符串被逻辑运算为永真
  2. 计算"匹配后的值"长度时从0减去1,导致整数下溢(最大值-4294967295)
  3. 产生一个超大字符串引用,可覆盖堆内存

内存操作原语

通过以下Postscript代码可获取内存操作能力:

/memptr () dup rsearch pop pop pop def

读写内存操作:

memptr 123 get  % 读取偏移123的字节
memptr 123 0 put  % 在偏移123处写入0

利用技术

  1. ref_t结构操作

    • ref_t占用128位(16字节)
    • 包含类型、长度字段和值/指针
    • 通过修改ref_t可以改变对象类型和行为
  2. 沙箱绕过

    • 定位gs_activate_path_control函数
    • 修改path_control_active标志为0
    • 需要遍历以下指针链:
      dict -> memory -> gs_lib_ctx -> core -> path_control_active
      
  3. 偏移量计算

    • 不同平台偏移量不同
    • 通过反编译(如Ghidra)确定具体偏移
    • 示例偏移(Windows x64):
      • memory结构: +0xd0
      • gs_lib_ctx: +0x8
      • core: +0x88

漏洞利用步骤

  1. 创建超大字符串引用:

    /memptr () dup rsearch pop pop pop def
    
  2. 搜索并修改ref_t结构:

    • 创建可识别数字模式
    • 搜索堆内存匹配ref_t结构
    • 修改类型位转换为字符串类型
  3. 遍历指针链:

    • 从字典获取memory指针
    • 通过计算偏移找到path_control_active
    • 修改该标志为0禁用沙箱
  4. 执行任意操作:

    • 文件读写
    • 系统命令执行
    • 其他内存破坏技术

影响与缓解

影响范围

  • Ghostscript v9.50至v9.52版本
  • 所有使用受影响版本Ghostscript的系统

防护建议

  1. 升级到修复版本
  2. 不要在处理不受信任文件时使用Ghostscript
  3. 使用额外隔离措施:
    • 低特权账户运行
    • 应用沙箱
    • 独立主机环境

结论

CVE-2020-15900展示了即使有沙箱保护,Postscript渲染过程仍存在重大攻击面。该漏洞通过内存破坏技术可靠地绕过沙箱限制,强调了对Ghostscript等复杂解析器实施深度防御的必要性。建议用户采取多层次防护措施,而不仅依赖内置沙箱机制。

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是一种基于堆栈的语言,具有以下特点: 采用"先进后出"的堆栈结构 支持复杂逻辑运算和绘图操作 示例代码: Postscript沙箱机制 Ghostscript的沙箱机制( --SAFER 选项)旨在防止: 任意命令执行(如 %pipe%id ) 未经授权的文件读写 通过路径控制沙箱锁定文件操作到指定目录 漏洞分析 漏洞发现 通过模糊测试(AFL)发现,当使用 rsearch 运算符在空字符串中搜索空字符串时: 会导致缓冲区下溢,产生一个约4GB的"字符串类型"引用。 根本原因 rsearch 运算符未正确处理空字符串搜索的边界情况: 搜索空字符串被逻辑运算为永真 计算"匹配后的值"长度时从0减去1,导致整数下溢(最大值-4294967295) 产生一个超大字符串引用,可覆盖堆内存 内存操作原语 通过以下Postscript代码可获取内存操作能力: 读写内存操作: 利用技术 ref_ t结构操作 : ref_ t占用128位(16字节) 包含类型、长度字段和值/指针 通过修改ref_ t可以改变对象类型和行为 沙箱绕过 : 定位 gs_activate_path_control 函数 修改 path_control_active 标志为0 需要遍历以下指针链: 偏移量计算 : 不同平台偏移量不同 通过反编译(如Ghidra)确定具体偏移 示例偏移(Windows x64): memory结构: +0xd0 gs_ lib_ ctx: +0x8 core: +0x88 漏洞利用步骤 创建超大字符串引用: 搜索并修改ref_ t结构: 创建可识别数字模式 搜索堆内存匹配ref_ t结构 修改类型位转换为字符串类型 遍历指针链: 从字典获取memory指针 通过计算偏移找到path_ control_ active 修改该标志为0禁用沙箱 执行任意操作: 文件读写 系统命令执行 其他内存破坏技术 影响与缓解 影响范围 Ghostscript v9.50至v9.52版本 所有使用受影响版本Ghostscript的系统 防护建议 升级到修复版本 不要在处理不受信任文件时使用Ghostscript 使用额外隔离措施: 低特权账户运行 应用沙箱 独立主机环境 结论 CVE-2020-15900展示了即使有沙箱保护,Postscript渲染过程仍存在重大攻击面。该漏洞通过内存破坏技术可靠地绕过沙箱限制,强调了对Ghostscript等复杂解析器实施深度防御的必要性。建议用户采取多层次防护措施,而不仅依赖内置沙箱机制。