Contents
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 一、事件
    2. 2.2. 二、Pegasus简介
    3. 2.3. 三、攻击条件
    4. 2.4. 四、攻击流程
    5. 2.5. 五、越狱后维持
    6. 2.6. 六、隐蔽性
    7. 2.7. 七、影响

前言

听了报告,了解一下

正文

一、事件

苹果公司昨天针对IOS发布了一个安全更新,涉及到三个0 day漏洞,这次漏洞的发现过程从一次APT攻击开始。大家需要注意,黑客通过漏洞进行远程控制并获得IOS用户的系统最高权限,造成敏感信息泄露、数据破坏等严重后果。

这次漏洞的发现过程从一次APT攻击开始。阿联酋人权活动人士Ahmed Mansoor在他的苹果手机上收到一个含有链接地址的短信,短信声称链接的内容是关于阿联酋虐待监狱囚犯的。Mansoor引起警觉,随即将该链接提供给了加拿大的Citizen实验室。Citizen实验室和Lookout公司的联合研究结果表明,这是一种针对IOS用户的APT攻击,该攻击代码被命名为Pegasus。

二、Pegasus简介

Pegasus攻击的方式很简单,有效载荷的传播也是静默方式。攻击者给受害者发送一个URL,可以是短信、邮箱、社交软件或者任何其他方式,受害者仅需点击一下链接,服务器就开始向受害者的手机传输攻击载荷,远程越狱受害者的手机,然后安装监控软件。一切都是在受害者不知情的状况下发生的,受害者唯一可以察觉的就是按下这个链接之后,浏览器自动退出了。监控软件包含木马代码和程序,用来监控、收集数据并且上传到服务器,受害者的一举一动尽在攻击者的掌握之中。为了达到完全静默监控,监控软件不会下载这些软件的木马版本,重新安装到受害者手机上。而是采用预装的版本,包括系统软件和用户安装的软件。

一般情况下,iOS的系统是为软件做好分离设计的,软件之间是无法通信甚至无法知道对方存在的。但是越狱后的系统确是可以通过hooking的方式来监控其他软件的。三叉戟软件套装通过加载其动态链接库到目标进程的方式,可以应用于hook那些安装有Cydia Mobile Substrate框架的软件。这个框架在越狱社区非常有名,Pegasus套装也使用了这个框架。

三、攻击条件

Pegasus一共涉及到三个IOS 0day漏洞的利用:CVE-2016-4655、CVE-2016-4656和CVE-2016-4657。

CVE-2016-4655

KASLR漏洞,可以寻找到内核基址。在Pegasus进行越狱之前,它首先得确定内存中内核的位置。苹果系统中的KASLR保护就是把内核映射到不可预测的内存地址,以起到保护的作用。

但是在这个漏洞中,攻击者使用一个函数调用,这个函数会在返回值中返回没有经过混淆的内存地址,从而攻击者可以计算出内核的基址,锁定内核的位置。

漏洞原理

OSUnserializeBinary函数用于解析二进制格式的序列化对象,之前爆出的UAF漏洞(CVE-2016-1828)和这次的UAF漏洞(CVE-2016-4656)都存在于该函数中。观察OSNumber对象的创建代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
len = (key & kOSSerializeDataMask);
wordLen = (len + 3) >> 2;
end = (0 != (kOSSerializeEndCollecton & key));
DEBG("key 0x%08x: 0x%04x, %d\n", key, len, end);
newCollect = isRef = false;
o = 0; newDict = 0; newArray = 0; newSet = 0;
switch (kOSSerializeTypeMask & key)
{
...
case kOSSerializeNumber:
bufferPos += sizeof(long long);
if (bufferPos > bufferSize) break;
value = next[1];
value <<= 32;
value |= next[0];
o = OSNumber::withNumber(value, len); // <- len可控
next += 2;
break;

CVE-2016-4656:

是内核内存损坏,这个漏洞用于提权越狱,基于内核中的内存损坏漏洞。通过精心构造数据可以在Free之后先分配对象来重新占用之后再触发Use,也可以进一步转换成double free,获取内核态的执行权限从而执行越狱代码。

漏洞原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// open user client
CFMutableDictionaryRef matching = IOServiceMatching("IOSurfaceRoot");
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, matching);
io_connect_t connect = 0;
IOServiceOpen(service, mach_task_self(), 0, &connect);

// add notification port with same refcon multiple times
mach_port_t port = 0;
mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
uint64_t references;
uint64_t input[3] = {0};
input[1] = 1234; // keep refcon the same value
for (int i=0; i<3; i++)
{
IOConnectCallAsyncStructMethod(connect, 17, port, &references, 1, input, sizeof(input), NULL, NULL);
}
IOServiceClose(connect);

通过POC代码可以看到漏洞存在于17号调用函数,定位后对其进行逆向分析。该函数会将传入的port、callback、refcon等数据保存起来,以供需要向用户态发送消息时使用。传入的数据大小是0x18,前两个64位数据分别是callback地址和refcon的值。值得注意的是在保存数据前会首先检查相同的refcon是否已经存在,如果存在则认为已经添加过了,会调用releaseAsyncReference64函数释放reference,从而调用iokit_release_port_send释放我们传入的port,并且返回0xE00002C9号错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
  if ( !a3->asyncReference )
return 0xE00002C2LL;
input = (__int64)a3->structureInput;
reference = (__int64)a3->asyncReference;
v6 = *(_QWORD *)(a1 + 224);
v7 = 0xE00002BDLL;
IORecursiveLockLock_53(*(_QWORD *)(v6 + 264));
v8 = *(_QWORD *)(v6 + 344);
if ( v8 )
{
// 检查相同refcon的数据是否已经存在
while ( *(_QWORD *)(v8 + 32) != *(_QWORD *)(input + 8) || *(_QWORD *)(v8 + 88) != a1 )
{
v8 = *(_QWORD *)v8;
if ( !v8 )
goto LABEL_8;
}
IOUserClient::releaseAsyncReference64(reference);
v7 = 0xE00002C9LL;
}
else
{
// 分配内存并通过setAsyncReference64初始化,保存port/callback/refcon
LABEL_8:
v9 = IOMalloc_53(96LL);
v10 = v9;
if ( v9 )
{
v11 = v6 + 344;
memset_53((void *)v9, 0, 0x60uLL);
IOUserClient::setAsyncReference64(v10 + 16, *(_QWORD *)reference, *(_QWORD *)input, *(_QWORD *)(input + 8));
*(_QWORD *)(v10 + 88) = a1;
*(_QWORD *)(v10 + 80) = *(_QWORD *)(input + 16);
v12 = *(_QWORD *)(v6 + 344);
*(_QWORD *)v10 = *(_QWORD *)(v6 + 344);
if ( v12 )
*(_QWORD *)(v12 + 8) = v10;
else
*(_QWORD *)(v6 + 352) = v10;
v7 = 0LL;
*(_QWORD *)v11 = v10;
*(_QWORD *)(v10 + 8) = v11;
}
}
IORecursiveLockUnlock_53(*(_QWORD *)(v6 + 264));
return v7;
}

CVE-2016-4657:safari的内核webkit漏洞,Safari Webkit中存在一个漏洞,能够执行任意代码。Pegasus会利用这个漏洞获取Safari浏览器内的代码执行权限。

利用以上的三个漏洞,只要用户点击了特定的url,Pegasus就会开始攻击,从而实现监控获取用户的信息。

四、攻击流程

Pegasus的可怕之处在于,攻击过程基本不需要用户交互,用户所要做的仅仅是点击一个链接,接着,攻击者就可以静默地传送payload,然后远程越狱,安装间谍软件。用户唯一能感知到的情况就是点击链接之后,浏览器自动关闭了。间谍软件中包含恶意代码、进程和用于监控用户行为并进行反馈的app。

实际上,iOS的安全机制并不允许应用相互监控,但是可以在越狱的设备上安装用户监控的hook。Pegasus就是利用了远程越狱和hook。Pegasus将它的动态库插入到设备里的针对正规进程中。这些动态库之后就会使用Cydia Mobile Substrate框架去hook应用。

受害者点击链接之后,攻击者展开攻击。攻击分为三个阶段,每个阶段都包含了攻击模块代码和隐蔽软件。攻击是线性的,每个阶段都依赖于上个阶段的代码、隐蔽软件的成功,每个阶段都使用了关键的漏洞,以确保进攻成功进行。

AThXN9.png

第一阶段:传送并利用WebKit漏洞,通过HTML文件利用WebKit中的CVE-2016-4655漏洞,这个阶段是诱使受害者点击一个网站地址,诱发漏洞,执行代码,32位机器和64位机器分别下载用于下个阶段的代码;。

第二阶段:越狱。在第一阶段中会根据设备(32/64位)下载相应的,经过加密混淆的包。每次下载的包都是用独一无二的key加密的。传统的云端特征码检测技术在此失效,软件包内包含针对iOS内核两个漏洞(CVE-2016-4656和CVE-2016-4657)的exp还有一个用来下载解密第三阶段软件包的loader。这些包中含有内核基质定位代码和UAF漏洞利用代码,并且包含了代码解密程序。在此阶段内核基质被定位并被越狱。

第三阶段:安装间谍软件。经过了第二阶段的越狱,第三阶段中,攻击者会选择需要监听的软件,把hook安装到应用中。

另外,第三阶段还会检查设备之前有没有通过其他方式越狱过,如果有,则会移除之前越狱后开放的系统访问权限,如ssh,使其成为Pegasus专属监控设备。程序也会监控三个阶段的执行是否成功,如果失败(或者特定状态下),则清除自身不留痕迹。

软件还有一个“故障保险“,如果检测到设备满足某些条件,软件就会自毁。

第三阶段中,间谍会部署一个test222.tar文件,这是一个tar包,包中包含各种实现各种目的的文件,如实现中间人攻击的根TLS证书、针对Viber、Whatsapp的嗅探库、专门用于通话录音的库等。

五、越狱后维持

一旦内核被攻破了,Pegasus开始准备安装越狱环境。

●关闭内核保护措施,例如代码签名

●重新挂载系统分区

●清除Safari的缓冲区(清除攻击痕迹)

●写入越狱文件(包含主要加载器 /sbin/mount_nfs)

在上一节的阶段二中,Pegasus会移除/etc/nfs.conf导致文件系统加载/sbin/mount_nfs(这就是阶段三的越狱加载器),/sbin/mount_nfs是以root的权限运行的,所以越狱软件接管了系统的完整权限。阶段三结束后,Pegasus需要在重启后也继续维持越狱状态,所以使用一段jsc二进制代码替换了系统中的rtbuddyd,并且链接到CVE-2016-4657,达到越狱持久化。

六、隐蔽性

Pegasus的自我保护和反侦察功能是优先于监控功能的。也就是说,宁可不再监控,也要保护自己不被发现。Pegasus有一大堆功能来保持其隐蔽性和静默性,它持续地监控手机状态并且阻止任何其他的方法来越狱/连接手机,并且当纸包不住火时,它有完整的自毁功能,从手机里完整的移除自己。而且,阶段三禁用了软件更新,使手机无法收到任何软件更新提示信息,从而很好的隐藏自己。

七、影响

监控软件可以完全控制以下软件:GMAIL,FACETIME,FACEBOOK,LINE,MAIL.RU,CALENDAR,WECHAT,SURESPOT,TANGO,VIBER,SKYPE,TELEGRAM,KAKAOTALK,从而获得用户的信息。

用户感染了Pegasus之后,手机处于完全的监控状态之中,包括电话录音,通话记录,短信,麦克风/摄像头实时通信(几乎变成对讲机)。在这个阶段获取到信息之后,监控者可以将这些信息用于下个阶段的入侵,例如拿到你的银行卡账户和密码,拿到邮箱账户密码,以及社保等等。

参考文章1

参考文章2

参考文章3

Contents
  1. 1. 前言
  2. 2. 正文
    1. 2.1. 一、事件
    2. 2.2. 二、Pegasus简介
    3. 2.3. 三、攻击条件
    4. 2.4. 四、攻击流程
    5. 2.5. 五、越狱后维持
    6. 2.6. 六、隐蔽性
    7. 2.7. 七、影响