原文见: https://googleprojectzero.blogspot.com/2021/12/a-deep-dive-into-nso-zero-click.html
今天上午摸鱼时在 hacker news 上看到了这篇文章,惊叹于其中体现的技术细节与智慧,有兴趣的朋友可以直接看原文,这里做一个大概的介绍。
所谓的 zero-click 漏洞,是与 one-click 漏洞作比较,之前 iMessage 出现过通过钓鱼链接诱使目标点击并进行攻击,这次的漏洞强大在于不需要任何点击,只需要通过 iMessage 向目标发送一个精心构造的 GIF payload ,目标设备就会在无感知的情况下被攻陷,完全无法防御。
iMessage 在接受后缀为.gif 的文件时,会对它进行解析和渲染,Apple 使用 ImageIO 库来解析目标文件,但是 ImageIO 库会尝试猜测目标文件的类型并进行相应解析(而非使用后缀,见[https://googleprojectzero.blogspot.com/2020/04/fuzzing-imageio.html]),因此攻击面扩大到了 20 多个图像编解码器。
漏洞的下一步利用在 CoreGraphics PDF 的解析过程中,JBIG2 是 CoreGraphics PDF 中一种用于图像压缩和解压缩的标准,在 JBIG2 中,它会尝试将每个页面分割成单个字形,并用模式匹配将相似的字形作为一个来储存,从而压缩体积。在压缩和解压缩的过程中,JBIG2 会对图像的 bitmap 进行逻辑运算,例如在压缩时使用 XOR 来储存两个相似图像之间的差异像素,并在解压缩时用 OR 来恢复原始图像(这里纯文字可能不太好理解,原文有一些图像辅助解释,可以在原文查看)。JBIG2 中的逻辑运算符( AND, OR, XOR or XNOR )使用非常灵活,他将图像视为 segment 并进行逻辑运算操作,这些操作被称为段命令。 Apple 使用开源的 Xpdf 作为 JBIG2 的实现,在 Xpdf 在处理引用 JBIG2Segment 类(包括 Xpdf 的控制命令,用于对图像的操作)时存在一个典型的整数溢出问题,攻击者可以在这里的溢出基础上进行堆溢出(这里涉及很多二进制安全的细节,可以在原文查看),从而修改了用于控制图像边界的变量,进而解除了绘制区域的限制。
在解除了画布限制后,攻击者就可以操作段命令( JBIG2 标准下存在完整而灵活的 AND, OR, XOR, XNOR 逻辑运算)来对任意内存上进行操作,实际上这些逻辑运算符可以组成门电路并进行计算操作。尽管 JBIG2 标准下没有提供脚本的执行环境,但是攻击者使用了超过七万个段命令组成门电路并模拟了一个小型计算机架构,有完整的 64 位寄存器、加法器等等,从而可以在这个环境下执行任意代码,接下来的沙箱逃逸,就会在这个环境下运行,而这些仅仅发生在一个图像的解析过程中。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.