查看原文
其他

谷歌安全研究员直呼复杂 | iMessage 零点击漏洞利用细节公开

GeekPwn 2023-12-29


2021年9月中旬,苹果发布紧急更新,推出适用于iPhone、iPad的iOS14.8,以及适用于Apple Watch和macOS的补丁,用于修补一个零点击漏洞(CVE-2021-30860)。这是Citizen Lab 团队发现的针对 iMessage 的零点击漏洞ForcedEntry,能绕过Apple的BlastDoor,并用于NSO公司开发的Pegasus间谍软件,实施监视活动。


近日,Google Project Zero 发布了关于一个在野ForcedEntry漏洞利用的详细分析,并感慨称这是他们见过最复杂的漏洞利用之一。


令人头疼的NSO





安全从业者很少有人不知道NSO组织的大名,作为知名的以色列黑客方案供应商,其”飞马(Pegasus)”间谍软件被诸多国外政府机构购买并用于窃听。近些年来,也有诸多与NSO有关的攻击活动曝光,iOS设备常常成为被攻击的目标。不过,最近倒是有新闻报道,迫于财务和诉讼的压力,NSO正在考虑中止运营Pegasus。


在分析的文章中,研究人员称,这个在野利用前所未见,也反映出NSO这种组织所具备的实力已经与一些国家政府支持的精英团队的实力不分伯仲。

一次点击 vs. 零点击





在早期的攻击案例中,攻击者还需要攻击者点击链接或者做出其他交互动作之后才能实现入侵,也就是说要使用 one-click 漏洞利用方式,例如常见的钓鱼短信等:


而利用NSO的零点击技术发起的攻击,则防不胜防:即使被攻击的目标有防范意识,不会点击钓鱼链接,也会在不知不觉中受到攻击。这也就是零点击攻击的特点:攻击者连网络钓鱼信息都不用发,就能让exploit在后台暗中运行。除非受害者不再使用手上的设备,否则就无法避开……

漏洞背景与利用





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 文件。这也就是问题所在。

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扫描件的过程中的逻辑运算变成逻辑门电路而创建一个模拟的编程环境,这个漏洞实现了利用。这个过程,着实不可思议,毕竟最开始,只是一个图片渲染库的“整数溢出漏洞”而已。

关于漏洞利用的更详细解析及后续内容,可以关注
https://googleprojectzero.blogspot.com/2021/12/a-deep-dive-into-nso-zero-click.html


我 是 极 客  

腾讯视频爱奇艺小米视频Bilibili(纯享版)

  点击观看

我是极客

继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存