Pegasus 使用的iPhone 零点击漏洞分析

admin 2023年9月11日01:08:29评论29 views字数 2776阅读9分15秒阅读模式

概述

CitizenLab发布了一份报告,详细说明了针对九名巴林公民的复杂的iPhone漏洞。据报道,这些激进分子被NSO Group的Pegasus间谍软件用2个零点击iMessage漏洞攻击。这2个零点击漏洞分别为Kismet和ForcedEntry,Kismet于2020年被发现,ForcedEntry是2021年发现的一个新漏洞。零点击攻击通常被标记为复杂的威胁,因为与典型的恶意软件不同,它们不需要用户互动来感染设备。后一种零点击间谍软件特别值得注意,因为它可以绕过BlastDoor等安全保护,BlastDoor是由Apple公司设计的,旨在保护用户免受此类零点击入侵。

根据Citizen Lab的报告,Kismet漏洞的可利用时间为2020年7月至9月,它至少存在于运行iOS 13.5.1和13.7的设备上,9月份的iOS 14更新及之后的更新可能修复了它。然后,在2021年2月,NSO Group开始部署零点击漏洞,成功绕过了Citizen Lab称之为ForcedEntry的BlastDoor。Amnesty Tech是一个由数字权利倡导者和安全研究人员组成的全球集体,也在这一时期观察到了零点击iMessage漏洞利用攻击活动,并将其称为Megalodon。

Pegasus 使用的iPhone 零点击漏洞分析



 

ForcedEntry漏洞

当针对受害者的设备启动 ForcedEntry 漏洞时,设备日志显示了两种类型的崩溃。第一次崩溃显然发生在调用ImageIO 渲染 Adobe Photoshop PSD 数据的功能时。

我们的分析集中在第二次崩溃上,详见图1。此崩溃发生在调用CoreGraphics的功能对PDF文件中的JBIG2编码数据进行解码时。该分析仅基于Citizen Lab的样本,我们目前没有获得新的样本。

Pegasus 使用的iPhone 零点击漏洞分析

图1.运行iOS 14.6的iPhone 12 Pro Max上ForcedEntry的Symbolicated Type Two崩溃

 

从这个崩溃日志中,我们可以推断出三个有趣的点。首先,零点击攻击依赖于iMessage附件的解析。其次,dyld_shared_cache的滑动为0,这意味着所有系统模块都被加载到一个固定的地址。最后,崩溃点0x181d6e228不是漏洞利用的第一个地方。我们在下面的章节中讨论这些结论的细节。

 

 

CVE-2021-30860的原因

该漏洞位于CoreGraphics.framework 的JBIG2Stream::readTextRegionSeg函数内崩溃点0x181d6e228(如上图中方框 3 所示)位于以下截图的 JBIG2Stream::readTextRegionSeg 函数的第 161 行。

Pegasus 使用的iPhone 零点击漏洞分析

图 2. 函数JBIG2Stream::readTextRegionSeg的截图,显示崩溃点

 

首先,它根据JBIG2SymbolDict段来计算numSyms:

Pegasus 使用的iPhone 零点击漏洞分析

 

numSyms的类型是无符号int(unsigned int),而函数seg->getSize()的返回类型也是无符号int。因此,由于整数溢出,numSyms可能小于一个JBIG2Segment的大小。一个例子是numSyms=1=(0x80000000+0x80000001)< 0x80000000。

然后,它分配了堆缓冲区syms,其大小为numSyms * 8 。


最后,它用bitmap的值填充syms:

 

Pegasus 使用的iPhone 零点击漏洞分析


循环时间取决于JBIG2Segment的大小,它可能大于缓冲区syms的大小。这导致了堆缓冲区syms的越界写入访问。

 

 

Apple的修复

Apple在 iOS 14.8中修补了该功能:

Pegasus 使用的iPhone 零点击漏洞分析

图3.同一函数JBIG2Stream::readTextRegionSeg的截图,并进行了适当的修复

 

我们可以看到,Apple添加了两个新的边界检查(图3中的红色框),以避免syms缓冲区溢出。

 

 

Pegasus的利用

禁用ASLR:

iOS14.6(18F72)版本的dyld_shared_cache被加载到IDA Pro进行静态分析,之后出现了一个令人惊讶的结果。我们能够直接访问调用堆栈的地址,而无需重新设置段的位置。

从图1的截图中推断(见方框2),dyld_shared_cache的滑动是0。但是,在常见的崩溃情况下,这些地址应该在滑动中。

如果原始崩溃日志的截图没有被修改,那么这个结论是令人担忧的。应该注意的是,Pegasus在利用之前已经禁用了地址空间布局随机化(ASLR)。

 

绕过PAC:

通过检查调用堆栈跟踪的第1帧的地址0x181d6e20c,我们可以看到寄存器x0,即函数JBIG2Stream::findSegment的返回值,是JBIG2Segment的一个子类。

Pegasus 使用的iPhone 零点击漏洞分析


有四种子类覆盖了getType()虚拟函数,但下面的代码显示,它们只是返回一个枚举值:

Pegasus 使用的iPhone 零点击漏洞分析


例如,JBIG2SymbolDict::getType只是返回jbig2SegSymbolDict=1。

Pegasus 使用的iPhone 零点击漏洞分析

因此,帧1应该调用了虚拟函数seg->getType()。但实际上,它已经被颠覆成了当前函数本身(第0帧)。

这表明对象JBIG2Segment的虚拟函数表已经被替换,并且绕过了指针认证代码 (PAC) 安全功能。这很重要,因为 PAC 安全机制的开发是为了帮助防止零点击黑客攻击。这也说明,崩溃点并不是漏洞利用的第一个地方。

 

 

结论和建议

从使用的攻击技术来看,我们可以看到Pegasus对iOS用户来说是一个相当高级的威胁。但是,这些攻击似乎是针对非常具体的目标发起的,而不是针对普通用户。

最近Pegasus攻击的信息来自Citizen Lab和Amnesty Tech的取证分析,我们目前还没有发现Pegasus攻击样本,但我们正在积极搜索和监测这些威胁,随着调查的继续,我们将分享更多细节。

本质上讲,这种攻击是一个非常常见的文件格式解析漏洞。我们之前发现了CVE-2020-9883,一个与ForcedEntry类似的漏洞,可以利用它来做与Pegasus在这里所做的一样的事。ForcedEntry漏洞的利用技术依然非常关键,因为它如何能够绕过PAC和禁用ASLR仍然是未知的。

同时,我们强烈建议将设备更新到iOS 14.8。如前所述,普通iOS用户不是使用这种间谍软件的攻击目标。但是,用户可以采取一些简单的安全步骤。例如,相关用户可以阻止来自未知发件人的iMessages,甚至在设备的偏好设置中完全禁用iMessage功能。

 

 

原文链接:

https://www.trendmicro.com/en_us/research/21/i/analyzing-pegasus-spywares-zero-click-iphone-exploit-forcedentry.html

 

原文始发于微信公众号(维他命安全):Pegasus 使用的iPhone 零点击漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年9月11日01:08:29
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Pegasus 使用的iPhone 零点击漏洞分析http://cn-sec.com/archives/570543.html

发表评论

匿名网友 填写信息