事件介绍
这篇报道是关于最近发生的在全球范围内活跃的APT间谍软件的深度研究,Lookup团队已经捕获了样本,并且在一台全新的iOS设备上进行了深度研究。NSO集团提供的间谍软件套装名为Pegasus(可戏称为天马流星拳),Pegasus是一套高度定制化和自动化的间谍软件,其内置三叉戟(3个iOS的0day漏洞组合),可以有效刺破iOS的安全机制,抵达内核,完全控制手机,然后窃取其中数据。运用动态库hooking的方式来破坏内核层与应用层的安全机制,包括且不限于语音、电话、GMAIL、FACEBOOK、WHATSAPP、FACETIME、VIBER、WECHAT、TELEGRAM等等,不管是苹果的内置应用还是第三方应用,完全不能幸免(因为拿到了root权限,监控软件的进程已经是上帝模式)。Pegasus所使用的三叉戟漏洞,已经被苹果在最新的iOS 9.3.5中修补完成,下文中将对其进行详细的介绍。
根据最新的报道,NSO集团从2010年开始就已经出售武器化的监控软件套装给企业和组织,到眼前被发现为止已经存在了很长一段时间来了,其宣称组合使用了高维度的系统组合漏洞来完成渗透和攻击,可以轻易地进入iOS、安卓和黑莓系统,窃取其内部信息。
这款间谍软件高度隐蔽并且模块化,易于定制。它使用了高强度的加密来保护自身不被传统杀毒软件发现,并且保证被发现之后进行“自爆”,提高取证难度。我们的报告指出三叉戟漏洞包含以下三种漏洞的组合:
- CVE-2016-4657:Safari的Webkit内核上的内存泄露漏洞,用户点击之后攻击者可以占领这台机器。
- CVE-2016-4655:内核信息泄露漏洞绕过KASLR,攻击者可以计算出内核的基质,锁定内核的位置。
- CVE-2016-4656:iOS内核内存漏洞导致越狱,不管是32位还是64位均可以越狱其内核,并安装监控软件。
根据代码显示,这款间谍软件套装至少存在了超过两年的时间,代码里显示部分配置适配于iOS 7,这个版本苹果在2013年就发布了。
Pegasus利用了我们的生活已经离不开移动手机这一特点,手机是一款一直联网的终极信息管理终端。手机用户觉得他们的手机非常安全,毫无破绽,他们使用手机来发送/接受位置、打电话发送语音、进行社交和工作,但是他们不知道其实手机已经被Pegasus完全监控了,他们的一举一动均在NSO集团的掌握之中。Pegasus的一份授权卖25000美元,他们卖掉了300份授权,得到了超过800万美元的收入。
这份报告深入研究了Pegasus从开始到结束的技术细节,包括三叉戟漏洞的利用细节,以及监控组件的技术实现,让大家看一看一款监控软件究竟可以干哪些事情,并且做到什么地步。
三叉戟漏洞是最新的漏洞,一直到iOS 9.3.4版本依然有效,直到我们跟苹果合作,推出了9.3.5之后,才偃旗息鼓。请升级到最新的9.3.5,以确保自己的手机安全。
0×01.背景
随着移动设备进一步的渗透进我们的日常生活当中,恶意软件作者就瞄上了这块巨大的市场,持续的开发木马间谍软件运行于受害者的设备上,受害者却浑然不知。这些暗黑的项目中,有些是为了谋财,例如广告木马、银行卡木马、或者短信欺诈,有些则是为了窃取组织或者个人情报,例如高度定制的系统级别木马,在受害者毫不知情的情况下,偷偷把信息传回控制服务器。
间谍软件通常可以做到收集受害者的短信、联系人、通话记录、通话录音,或者远程开启摄像头和麦克风,对目标进行监听和监视。包括录下声音和视频,传回控制服务器。
有些间谍软件甚至可以做到传播病毒和木马,以受害人手机为基础和跳板,进一步攻击最终目标。这项技术非常复杂和冒险,攻击者往往得掌握着目标系统的0day漏洞才能成功。所以不管是私人安全公司还是企业系统均推出漏洞回馈计划,有偿征集系统漏洞。
两家私人安全公司Gamma集团和Hacking Team公司,自从被爆出开发了移动平台监控软件并出售给政府机构之后,都上了各大媒体头条。这些监控软件造价不菲,功能丰富,往往只有大金主才能使用,里面内置的0day漏洞更是确保其行动万无一失。
以色列NSO集团平时行事低调,不显山不露水,这次行动已经进行了五年之久,也没人发现。这家由Niv Carmi,Shalev Hulio,和Omri Lavie在2010年建立的NSO集团宣称,已经把自己开发的监控软件卖给了各国的政府集团。他们宣传自己的监控软件是无法被检测的,其中以为创始人还说:“我们是名副其实的魅影”。私人公司费城兄弟在2014年以1.1亿美元收购了NSO集团。在此之外,NSO集团还组建了移动软件安全公司Kaymera,既射门,又守门,风光无限,一时无两。
0×02.时间线
- 2016.08.12 Citizen Lab报告监控软件给Lookout团队
- 2016.08.15 两家团队合作分析这款间谍软件所使用的技术之后,提交给了苹果
- 2016.08.25 苹果释放9.3.5更新,封堵漏洞
Pegasus间谍套装
攻击的方式很简单,有效载荷的传播也是静默方式。攻击者给受害者发送一个URL,可以是短信、邮箱、社交软件或者任何其他方式,受害者仅需点击一下链接,服务器就开始向受害者的手机传输攻击载荷,远程越狱受害者的手机,然后安装监控软件。一切都是在受害者不知情的状况下发生的,受害者唯一可以察觉的就是按下这个链接之后,浏览器自动退出了。
监控软件包含木马代码和程序,用来监控、收集数据并且上传到服务器,受害者的一举一动尽在攻击者的掌握之中。监控软件可以完全控制以下软件:GMAIL,FACETIME,FACEBOOK,LINE,MAIL.RU,CALENDAR,WECHAT,SURESPOT,TANGO,VIBER,SKYPE,TELEGRAM,KAKAOTALK。
为了达到完全静默监控,监控软件不会下载这些软件的木马版本,重新安装到受害者手机上。而是采用预装的版本,包括系统软件和用户安装的软件。
一般情况下,iOS的系统是为软件做好分离设计的,软件之间是无法通信甚至无法知道对方存在的。但是越狱后的系统确是可以通过hooking的方式来监控其他软件的。三叉戟软件套装通过加载其动态链接库到目标进程的方式,可以应用于hook那些安装有Cydia Mobile Substrate框架的软件。这个框架在越狱社区非常有名,三叉戟套装也使用了这个框架。
用户感染了Pegasus之后,手机处于完全的监控状态之中,包括电话录音,通话记录,短信,麦克风/摄像头实时通信(几乎变成对讲机)。在这个阶段获取到信息之后,监控者可以将这些信息用于下个阶段的入侵,例如拿到你的银行卡账户和密码,拿到邮箱账户密码,以及社保等等。
受害者点击链接之后,攻击者展开攻击。攻击分为三个阶段,每个阶段都包含了攻击模块代码和隐蔽软件。攻击是线性的,每个阶段都依赖于上个阶段的代码、隐蔽软件的成功,每个阶段都使用了关键的三叉戟漏洞,以确保进攻成功进行。
阶段一:传递Safari内核的Webkit漏洞,这个阶段是诱使受害者点击一个网站地址,诱发漏洞,执行代码,位32位机器和64位机器分别下载用于下个阶段的代码;
阶段二:这个阶段是执行上个阶段下载来的代码,代码是一段加密后的乱码。每个下载都是用单独的密码单独加密的,传统的云端特征码检测技术在此失效(大多数杀软均采用特征码技术),这些代码中含有内核基质定位代码和UAF漏洞利用代码,并且包含了代码解密程序。在此阶段内核基质被定位并被越狱。
阶段三:这个阶段设备开始安装上个阶段下载解密好的监控程序Pegasus,并且动态库hooking到想要监控的程序,程序也会检测设备是不是已经通过其他方法越狱过,如果是,则移除任何第三方控制方式(例如SSH),使其成为Pegasus专属监控设备。程序也会监控三个阶段的执行是否成功,如果失败(或者特定状态下),则清除自身不留痕迹,春梦了无痕。
阶段三使用的程序部署在一个tarball里面(test222.tar),每段代码都有其自己的目的,稍后详述。
- # ca.crt - root keystore中的TLS certificate
- # ccom.apple.itunessotred.2.csstore - standalone模式的JavaScript代码,会在重启时执行。用于在重启时执行未签名的代码以及静默维持jailbreak。
- # converter - 根据pid来入侵dylib。这只不过是把Cydia开源软件库中的cynject程序重命名而已。
- # libaudio.dylib - 通话录音的基础库
- # libimo.dylib - imo.im的嗅探库
- # libvbcalls.dylib - Viber的嗅探库
- # libwacalls.dylib - Whatsapp的嗅探库
- # lw-install - 安装换新所有嗅探库
- # systemd - 发送报告及文件到服务器
- # watchdog
- # worked - SIP模块
我们检测到的攻击最高可以用于iOS 9.3.4版本,攻击者维护着一份庞大的代码库用于攻击iOS从7到9.3.3,我们检测的代码中没有9.3.4的配置信息,但是对于9.3.4版本依然有效(我们知道9.3.4的发布,仅仅是为了封堵盘古团队手上的漏洞,盘古团队手上的漏洞可以越狱到9.3.3)。所以我们推荐大家升级到9.3.5。
另外一个特性就是,标准的越狱检测程序无法检测到设备已经越狱,因为攻击者的目标是尽可能的隐蔽。所以受害者的设备哪怕在专业程序的检测下,依然是“未越狱”的状态。
0×03.专业开发团队
Pegasus有着模块化的设计,简单高效。比如它维护者一份magic table,用来分辨不同设备,不同iOS版本号下的内核内存基址,iOS 9.2.1在iPhone 6上的内核内存基址如下图所示:
这样就算出了每个程序在内存中的地址(基于内核地址的偏移量),这个信息在破解时帮了大忙。
另外,模块化的代码命名方式对于我们的剖析内部构造也是非常有力,例如libwacalls就是Whatsapp的嗅探库,libvbcalls就是Viber的嗅探库,代码及其高效简洁,这跟其他木马作者不同,其他作者总是尽全力隐藏其目的,而Pegasus是木马界的一股清流。
还有,程序健壮,高可用也是充分保证的,哪怕在最初阶段我们也发现了他们的debugging代码和QA标准,这些都是企业级别测试组织流程。
0×04.革命性的软件
这款木马已经运作了数年,这足以让我们产生给它颁发一座软件健壮大奖的冲动,并且它还支持所有ihone型号上运行的所有iOS版本,从iPhone 4s到iPhone 6s Plus。
这是一段证明其适用于iOS7 (发布于2013年)的代码片断。
剖析“三叉戟”漏洞
这套间谍软件内置了三个iOS系统内核漏洞,这里称之为“三叉戟”漏洞。这套漏洞组合在iOS 9.3.3上被发现,在9.3.4版本上也运行良好,于9.3.5版本被苹果封堵。
0×05.CVE-2016-4657:Safari的Webkit内核上的内存泄露
在Safari的Webkit内核上存在的内存崩溃漏洞,使攻击者可以执行任意代码。Pegasus利用这个漏洞在Safari的进程中获取初始化代码执行权限。这个漏洞比较复杂,我们将继续分析,持续报道。
0×06.CVE-2016-4655:内核信息泄露漏洞绕过KASLR
在Pegasus可以执行jailbreak之前,它必须先知道内核位于内存的哪里。苹果的内核基址随机化技术使得内核在内存中出现的方式完全随机,找不到内核在哪里,攻破内核更是无从谈起了。Pegasus利用了iOS内核读取栈数据时缺乏边界检查,导致Pegasus能够获取栈上额外的数据,而函数的返回地址一般会被保存在栈上,刺探到了内核的基址。
0×07.CVE-2016-4656:iOS内核内存漏洞导致越狱
这个漏洞则是一个典型的UAF漏洞,通过精心构造数据可以在Free之后先分配对象来重新占用之后再触发Use,也可以进一步转换成double free,获取内核态的执行权限从而执行越狱代码。
0×08.越狱维持技术
一旦内核被攻破了,Pegasus开始准备安装越狱环境。
- # 关闭内核保护措施,例如代码签名
- # 重新挂载系统分区
- # 清除Safari的缓冲区(清除攻击痕迹)
- # 写入越狱文件(包含主要加载器 /sbin/mount_nfs)
在上一节的阶段二中,Pegasus会移除/etc/nfs.conf导致文件系统加载/sbin/mount_nfs(这就是阶段三的越狱加载器),/sbin/mount_nfs是以root的权限运行的,所以越狱软件接管了系统的完整权限。阶段三结束后,Pegasus需要在重启后也继续维持越狱状态,所以使用一段jsc二进制代码替换了系统中的rtbuddyd,并且链接到CVE-2016-4657,达到越狱持久化。
木马分析
Pegasus是我们检测过的最隐蔽和最高效的间谍软件套件。它使用神话般的方式来安装和隐藏自己,一旦它跻身系统之中,它有一连串方式来隐藏通讯和达到反查杀的功能,并且hook到root和mobile进程中来收集系统和用户信息。
0×09.安装和持久化
软件在阶段三运行lw-install时安装到受害者手机上。Lw-installl负责了持久化的的大部分设计功能,包括重启后持续接管,以及另外一些小手段防止手机变砖。
Lw-install做的第一件事情,就是检查iOS的版本号,根据手机运行的是iOS 9还是之前的版本执行不同的代码。
如果用户手机安装的是iOS 9,lw-install会运行.plist上的/sbin/launchctl load 拖到/Library/LaunchDeamons(这个目录通常是空的,或者用于存放越狱后开机启动plist服务列表,例如SSHD),这样可以保证重启后立即运行。
如果运行的不是iOS 9,lw-install会先删除一些数据,然后运行代码,log文件在这里/private/var/wireless/Library/com.apple.wifid.r.log。
0×0901.持久化技术:JSC提权
Pegasus用jsc开发工具来实现越狱持久化,这个组件是包含在iOS环境之中的,其功能是使用户可以在Webkit浏览器之外运行JavaScript代码。在这个组件里的内存崩溃漏洞使得Pegasus执行代码得到了持久化的能力。
持久化过程中,rtbuddyd这个守护进程被一段签名过并有着运行权限的jsc代码替换。系统重启时,在early-boot阶段假的rtbuddyd会运行,链接到com.apple.itunesstored.2.cstore文件,这个文件的结构与CVE-2016-4657类似,再次载入攻击脚本攻破内核,进行越狱。过程如下:
- # 运行jsc代码 –early boot
- # 运行攻击代码找到内核基址
- # 攻击内核越狱
- # 释放Pegasus监控套件,systemd、watchdogd。
上一次分析中我们就提到,Pegasus的自我保护和反侦察功能是优先于监控功能的。也就是说,宁可不再监控,也要保护自己不被发现,因为一旦被发现、分析(这就是我们现在在做的事情),马上就会变成众矢之的,尸骨无存了。
所以,Pegasus有一大堆功能来保持其隐蔽性和静默性,它持续地监控手机状态并且阻止任何其他的方法来越狱/连接手机,并且当纸包不住火时,它有完整的自毁功能,从手机里完整的移除自己。
0×0902.禁用更新
阶段三禁用了软件更新,使手机无法收到任何软件更新提示信息。
0×0903.检测越狱状态
阶段三会检测手机是否已经越狱;
Pegasus每次启动时也会检测一次是否越狱。
0×0904.监控设备
为了可以持续监测和通讯,Pegasus禁用了系统的“深度睡眠”功能。(so那些受害人需要频繁充电?)
软件也在监测电池状态。同时监测网络状态,查看是否是运营商网络或者wifi网络,可能是用于选择何时合适将所有数据上传服务器。
0×0905.静默上传至C&C服务器
Pegasus拥有多种静默通信方式,systemd貌似使用的是短信方式。
尽管看上去像一条来自谷歌的密码重置短信,这个短信实际上是发给Pegasus的更新C&C服务器的指令命令行。Pegasus可以接受5种像这样的命令短信,指令ID是验证码中的最后一位,在这个例子中就是9。
这个功能可以在http或者https不可用的时候,C2(C&C中继服务器)服务器框架也下线的时候,这个功能就是Pegasus最后的救命稻草,指导它去发现新的C2服务器,这项前无古人的设计,确保了哪怕服务端已经完全down掉,发个短信也能迅速换新Pegasus。
短信的姿势可以是这些:
0×0906.自毁
Pegasus有高度敏感的反侦察系统,保证其不被发现,当其貌似即将暴露的时候,它就会开始自毁进程,并且移除李鬼版本的rtbuddyd和com.apple.itunesstored.2.csstore 。
0×10.收集数据
收集数据作为Pegasus监控软件的默认功能,是我们见过的间谍软件中最高效完备,兼容性最高的。它收集所有有价值的信息,例如密码、联系人、日历以及其他高价值信息的敲门砖,包括Sms,calendar,address book,gmail,viber,Facebook,Whatsapp,line,kakao,WeChat,surespot,IMO.im,mail.ru,tango,VK,odnoklashniki。
0×1001.日历
作为高价值信息,Pegasus当然想要受害者的日历。Systemd进程会抓取VCAL文件并通过短信发送出去。
0×1002.联系人
Pegasus会抓取受害者的所有联系人信息。
0×1003.GPS信息
Pegasus会抓取设备的GPS信息并发送出。
0×1004.捕获用户密码
0×1005.捕获Wifi和路由器密码
Pegasus为了偷到用户的所有密码,会分析抓取所有的wifi的SSID ,wep/wpa密码。已经苹果的路由器airport,time capsule等等。
0×11.拦截电话与短信
Pegasus在后台安装好语音(libaudio.dylib)与短信(libimo.dylib)窃听库,这些库非常健壮,但是还有一些特制的库用于拦截关键协议。Libaudio.dylib库注册了许多观察接口,这些观察接口由Pegasus旗下众多模块发送ID进行触发,在下面的例子中libwacalls和libvbcalls触发了观察接口,请见下图。
0×1101.进程注入:converter
Pegasus使用converter来实时动态注入通讯软件进程空间(例如Whatsapp),converter来源于cynject(这是Cydia的开源项目)。这个库使用一个pid作为参数,然后使用Mach内核API注入一个dylib到目标进程,converter的使用方式如下:
另外,converter还有一个失败模式,监听键盘上的一个键,用来上传一个自定义的dylib。
0×1102.Skype
Pegasus会抓取所有的Skype通话记录,包含录音。
0×1103.Telegram
0×1104.Whatsapp
Pegasus使用动态链接库libwacalls.dylib来hook Whatsapp的关键进程并且监听各种通信手段,通过我们捕获的样本,可以看出Pegasus已经对Whatsapp拥有了完整的拦截权限。Whatsapp在通话接通、打断或者结束的时候libwacalls会发出系统级通知,其他软件会接收到信号在他们知道ID的情况下,Pegasus的通知信号是独特的并且并不复杂,他们是由56个字符组成的字符串,看上去是由sha224产生的。Pegasus的其他模块会监听这些ID并且开始工作。在Whatsapp的情况下我们发现这些信号由libwacalls发出,最终由libaudio.dylib捕获并且开始录音,录制受害者的通话内容。
Libaudio.dylib把来自于Whatsapp的通话录音保存在以下文件夹:
- # micFileName - /private/var/tmp/cr/x.<call_id>.caf
- # spkFileName - /private/var/tmp/cr/t.<call_id>.caf
- # sentryFileName - /private/var/tmp/cr/z.<call_id>.caf
Libwacalls.dylib首先通过试图尝试连接/usr/lib/libdata.dylib的文件的存在来确认Cydia Mobile substrate是否安装在系统里,否则继续执行解密字符串来定位需要hook的类和方法。Libwacalls.dylib负责hook CallManager类下的以下方法:
- # setCallConnected
- # setCallInterrupted
- # setCallInterruptedByPeer
- # endCall
还有CallLogger类里的addCallEvent方法。
所有的hook都依赖于系统通知机制IPC。
0×1105.Viber
我们捕获的样本中,Viber的hook动态库libvbcalls会抓取所有的Viber通信记录。Libvbcalls的hook方式与libwacalls类似,当电话接通和结束的时候,libvbcalls也会发送ID。
CallEnded用来hook通话的结束时间并且发送系统级的ID。
下列ID是libvbcalls发送的。
- # onCallStarted : eb899b6873eb166859e610915dd002ea21b6057bd31fc6c1b38f27e2
- # onCallEnded : b79cd49420fbeba629a0290bc890c66924dd8452d0c2fd5ba9b327d0
Libaudio.dylib收到ID后开始录音,并且把通话保存到下列文件夹:
- # micFileName - /private/var/tmp/cr/x.<call_id>.caf
- # spkFileName - /private/var/tmp/cr/t.<call_id>.caf
- # sentryFileName - /private/var/tmp/cr/z.<call_id>.caf
0×12.实时监控
为了能够监控手机的所有输入和输出,Pegasus可以实时录制音频和视频。就好像Omri Lavie在Financial Times所说的“你们的手机现在就跟对讲机没啥区别”,请见下文函数:
结论
我们依赖手机来存储数码资产,手机一直带在身边已经成为了我们的语音、视频、文字一体化通讯系统。里面的很多秘密,成为罪犯的攻击目标。NSO集团作为网络武器商,拥有数百名员工,并且每年收入数百万美元。NSO只是一个例子,但是我们知道他并不是唯一的一个,就像我们知道的Hacking Team,Finisher,还有其他的互联网组织。这个软件只是iOS版本,据报道还有Android和Blackberry版本。
这份文件告诉我们,维持手机系统版本up to date的重要性,还有就是即使是最新版的软件,也要保持警惕。
0×13.附录A:TLS证书信息
0×14.附录B:越狱检测IOCs信息