2021年9月中旬,苹果发布紧急更新,推出适用于iPhone、iPad的iOS14.8,以及适用于Apple Watch和macOS的补丁,用于修补一个零点击漏洞(CVE-2021-30860)。这是Citizen Lab 团队发现的针对 iMessage 的零点击漏洞ForcedEntry,能绕过Apple的BlastDoor,并用于NSO公司开发的Pegasus间谍软件,实施监视活动。
近日,Google Project Zero 发布了关于一个在野ForcedEntry漏洞利用的详细分析,并感慨称这是他们见过最复杂的漏洞利用之一。
Pegasus 攻击 iPhone 的切入点是 iMessage。这意味着只需知道电话号码或 AppleID 用户名即可锁定受害者。iMessage 本就支持对 GIF 图像,GIF 体积小且画质低。在 iMessage 聊天中发送和接收 的GIF可以直接显示在聊天窗口中。苹果公司想让这些 GIF 无休止地循环而不是只播放一次,因此在iMessage 解析和处理的早期(在收到消息之后但在消息显示之前),iMessage 会在IMTranscoderAgent 进程中调用以下方法 (在“BlastDoor”沙箱之外),将收到的扩展名为.gif 的图像文件传递出去:
[IMGIFUtils copyGifFromPath:toDestinationPath:error]
通过选择器名称可以看出,这么做可能只是在编辑循环计数字段之前复制GIF文件,但是这种方法的语义是不同的。在后台,它使用 CoreGraphics API 将源图像渲染 为目标路径上的新 GIF 文件。但是,就算源文件名必须以.gif结尾,也并不意味着它真的是一个 GIF 文件。这也就是问题所在。
根据网络安全行业门户「极牛网」GEEKNB.COM的梳理,ImageIO 库用于猜测源文件的正确格式并对其进行解析,完全忽略了文件扩展名。使用这种“假 gif”技巧,攻击者就能让 20 多个图像编解码器变成 iMessage 零点击攻击链的一部分,包括一些非常晦涩和复杂的格式,同时可能因此远程暴露数十万行代码。
不过,苹果公司表示,他们从 iOS 14.8.1(2021 年 10 月 26 日)开始限制了 IMTranscoderAgent 可访问的 ImageIO 格式,并从 iOS 15.0(2021 年 9 月 20 日)开始完全删除了 IMTranscoderAgent 中的 GIF 代码路径。GIF 解码将完全在 BlastDoor 沙箱内进行。
NSO 正是钻了“假GIF”这个空子, 对 CoreGraphics PDF 解析器中的漏洞进行了利用。
在 1990 年代后期,带宽和存储空间比现在稀缺得多,因此,JBIG2 标准应运而生。JBIG2 是一种特定领域的图像编解码器,专用于压缩像素只能为黑色或白色的图像。
它的开发目的是高效压缩文本文件扫描结果,并在高端办公扫描仪/打印机设备(如下所示的 XEROX WorkCenter)中实施和使用。如果在十年前使用此类设备的扫描到 PDF功能,那么 PDF 中可能就包含 JBIG2。
这些扫描仪生成的PDF文件特别小,可能只有几千字节。JBIG2使用了两种新技术来实现这些超高的压缩率,并且这些技术都与本文介绍的漏洞有关。
- 分割和替换
JBIG2会将每页文本文件分割成字形,然后使用简单的模式匹配来匹配看起来一样的字形;然后将所有相似的字形替换为一个字形的副本。最终生成的文档,不仅内容很容易辨认,而且压缩率也很高。这种方法带来的问题就是,有些功能差的编码器会将相似的字符弄混,导致出错。
- 精细化编码
JBIG2还能通过存储(和压缩)替换字形和每个原始字形之间的差异来实现压缩。可以分步骤、精细化编码,最终实现可控的压缩结果。
JBIG2格式是由一系列的段组成的。CoreGraphics JBIG2解析器支持19种不同的段类型,包括定义新页面、解码Huffman表或将位图渲染到页面上给定的坐标处等操作。
ForcedEntry 漏洞就作为一个典型的整数溢出漏洞,出现在对引用的段进行排序的代码中:
通过一系列代码操作,造成溢出之后,攻击者可以使用一系列JBIG2段命令,实现应用于页面的一系列逻辑位操作。此外,由于页面缓冲区是无界的,所以,这些位操作可以在任意内存上进行。
只要有AND、OR、XOR和XNOR逻辑运算符,就可以实现任何可计算的函数,最终形成一个通用逻辑门,用来构建相应的电路去实现任何可计算的函数。
尽管JBIG2不具备脚本功能,但当它与漏洞结合时,它确实能够模拟在任意内存上运行的任意逻辑门电路。这相当于在一个不支持脚本的环境下实现了一个图灵完备的“计算机”,创造了一个可编程的环境。这也是这个exploit的实际利用情况。攻击者使用了70,000多个段命令来定义各种逻辑位操作,并在此基础之上定义了一个小型计算机架构,实现了寄存器和完整的64位加法器和比较器等功能,用于搜索内存和执行算术运算。
总结来说,通过将“上古”计算机时代专门用于压缩二值化(黑白图像)的JBIG2扫描件的过程中的逻辑运算变成逻辑门电路而创建一个模拟的编程环境,这个漏洞实现了利用。这个过程,着实不可思议,毕竟最开始,只是一个图片渲染库的“整数溢出漏洞”而已。
极牛网精选文章《NSO的iMessage零点击漏洞利用细节公开,复杂程度叹为观止》文中所述为作者独立观点,不代表极牛网立场。如若转载请注明出处:https://geeknb.com/17523.html