GDAblog-亚洲首款交互式Android反编译器

XCodeGhost详细分析报告

病毒名称:XCodeGhost

文件: CoreServices

大小: 268020 字节

MD5: 4FA1B08FD7331CD36A8FC3302E85E2BC

SHA1: F2961EDA0A224C955FE8040340AD76BA55909AD5

C&C: init.icloud-analysis.com

一、XCodeGhost简述

由于大量公司的开发人员从第三方网站下载了IOS应用的编译工具XCode来进行APP的开发工作,导致大量APP在苹果官方AppStroe上发布的APP感染了后门XCodeGhost。这是苹果IOS系统一次史无前例的大面积用户感染恶性事件。搜索引擎、各大云盘、下载工具、共享社区等等均成为此后门的推广和下载助推剂,甚至连腾讯微信都不能幸免,其感染的APP囊括了金融如同花顺、中信银行、中信银行动卡空间、南京银行等,游戏如愤怒的小鸟2,航空如南方航空应用,社交如天涯社区,教育如网易公开课,播放器如万能影音播放器等等数百款用户日常使用APP均感染了此后门。

二、XCodeGhost到底有何危害?

通过对XCodeGhost代码的深入分析,我们已经发现此恶意代码除了具备感染APP信息收集的功能,其还具备一个可以远程弹出定制系统对话框,远程执行第三方APP,远程打开任意url,远程控制下载任何APP等等功能,通过样本收集的信息结合功能强大的(openURL)可以实现对用户系统完全控制。

XCodeGhost刚发现时,大部分厂商均只对XCodeGhost进行粗略的分析,网上流转和刷屏的报告和新闻几乎都认为这个插入到XCode中的幽灵只是收集一些无关紧要的信息,包含作者利用社工库账号出来致歉所指出的只是获取一些app的基本信息,虽然看起来似乎没什么重要的信息,但是实际上已经有收集信息的嫌疑了。然而更具有危害潜力的实际是作者所谓的私心留了一个APP推广下载的后门。这个推广后门完全能利用openURL以及根据收集的信息通过伪装的系统对话框来实现一个非常隐秘的欺骗和强大的远程控制。

核心功能:

1)在APP各种运行状态下,收集感染APP运行时状态、应用名、应用版本号、系统版本号、语言、国家名、开发者符号、app安装时间、设备名称、设备类型上传并且返回控制命令,控制端后台完全可以根据这些信息来自动发送相应控制参数。

2)检测调试和模拟器,防止在调试器状态时收集信息。

3)根据远程控制设置弹出任何系统服务对话框,对话框标题,内容,按钮均可远程设置,并且可以根据URL设置(利用强大openURL)实现打开第三方APP和系统自带的一些功能,如自动发短信,打电话,启动浏览器,邮箱等等。

4)实现了可以不跳转到APPStore来下载安装指定APP

5)所有的弹出对话框均可以远程设置延迟时间来进行定时弹出。

三、详细技术分析

以下按一个感染APP的执行流程来对恶意代码的执行逻辑进行深入分析:

1、感染APP启动时,设置定时发作和状态监控

首先,当一个感染APP启动执行后在显示window的时候函数makeKeyAndVisible会得到执行,恶意代码重写此函数并且进行相应的操作。

感染APP启动后首先判断系统是否为6.0以上,否则设置定时器并且设置通知中心处理方法,可能此举是为了实现在感染APP内部进行第三方APP的下载(使用SKStorePr oductViewController,此试图控制器只支持IOS6.0以后系统)。

如果是6.0以上就设置默认睡眠时间36000000秒(417天,这个睡眠时间是可以通过远程进行修改的)、设置定时器Check、添加多个通知中心(NSNotificationCenter)。

如图:

2、状态监控中发送收集信息,返回控制命令。

通知中心监控函数,会检测调试器和模拟器,根据不同的情况来进行相应的动作,以及在各种状态下回传收集的信息以及返回控制信息,以及处理控制命令执行相应的动作。

通知处理函数

功能

UIApplicationDidBecomeActiveNotification

上传搜集信息,返回控制命令,只有在调试状态下才不会发送

UIApplicationWillResignActiveNotification

上传搜集信息,返回控制命令,只有在调试状态下才不会发送

UIApplicationDidEnterBackgroundNotification

删除控制信息,上传搜集信息,返回控制命令,只有在调试状态下才不会发送

UIApplicationWillTerminateNotification

删除控制信息,上传搜集信息,返回控制命令,只有在调试状态下才不会发送

3、定时器设置激活时间,收集信息,处理控制命令。

1.首先定时器也会检测调试器,并且还会检测模拟器,如果其中之一存在,定时器直接返回什么也不做,以此隐藏自身行为(因此不管你是在调试开发自己的APP还是动态调试分析,都不容易发现他的存在)。否则定时器从standardUserDefaults中取出"SystemReserved"的值,这个值既是激活时间。

如果到达了激活时间,感染APP会运行自身Run函数,这个Run函数是何方圣神,请看下图:

直接是用了Connection函数,这个才是关键,跟踪进去我们看看他做了什么。

看到了吧,这就是闹得沸沸扬扬的关键,收集信息上传。到底上传了什么信息,作者也交代了一下。“在代码中获取的全部数据实际为基本的app信息:应用名、应用版本号、系统版本号、语言、国家名、开发者符号、app安装时间、设备名称、设备类型”。

虽然看起来似乎没什么重要的信息,但是实际上已经有收集信息的嫌疑了,其实不止这些信息,他还会监控感染APP的运行状态,并且上传这些状态信息,这些信息包含感染APP的launch、suspend、running、terminate、resignActive、AlertView等状态信息。

我们先来看看收集信息的逻辑。

感染APP在加载和运行过程中会重新设置休眠时间

然后开始进行信息收集,这些信息由如下函数来完成,不具体介绍这些信息了。

收集的这些信息以JSON数据方式组织并且通过DES加密后以HTTP POST方式回传,并且信息用DES进行加密

发送完成后样本对HTPP响应的数据做了保存和处理。响应的数据同样也是DES加密处理,并且及其容易进行中间人攻击,只要你能中转这个url就可以发送响应数据。

4、解密控制命令,执行控制端指定的恶意行为

接下来我们看看程序如何对这个些响应的数据做处理的。我们自然会想到查找数据接收完成后的处理函数

从IDA中可以看到是Response函数,这个函数就是处理控制功能的核心。此函数应该就是作者所声称的预留APP推广的主要部分。我们仔细看看这个函数。

首先通过DES来解密出响应的数据,这些数是以JSON的方式来存储的,由于网站被关闭,目前我们无法获取这些数据,但是可以从其对数据处理逻辑上来推测这些数据中到底包含了什么,这与黑客的控制指令类似。

key

描述

sleep

用来设置睡眠时间

showDelay

用于设置弹框延迟执行时间

alertHeader

弹框的标题

alertBody

弹框的内容

appID

要推广的appID

cancelTitle

取消按钮

confirmTitle

确定按钮

configUrl

配置任意URL进行打开

scheme

设置scheme,利用canOpenURL来检测当前系统中到底存在有什么应用。

看到这些后,你会觉得他给自己留了一个很大的余地,并且可以说能干很多猥琐的功能,如自动打电话,发短信,控制其他第三方APP等等,还有可以弹出一个伪造的系统对话框来欺骗用户输入APPID和密码来下载带有恶意功能的APP。

首先此注入代码会根据远程配置的JSON数据的不同而执行不同的功能。

1).首先如果远程配置了alertHeader、alertBody、appID、cancelTitle、confirmTitle和scheme,那么注入代码首先通过canOpenURL来确认scheme参数指定的APP是否存在

如果如果不存在,那么就直接弹出根据配置的alertHeader、alertBody、appID、cancelTitle、confirmTitle作为参数来延迟弹出对话框,并且监控用户的选择,并记录下弹出状态并进行了保存,作为收集信息的一部分。其中状态信息包含: launch、suspend、running、terminate、resignActive、AlertView。

如果用户选择了确认按钮(确认按钮名称可以伪造成取消之类的),就会下载指定APP.

2).如果远程配置了configUrl和scheme,那么首先确定secheme设置的参数(可能是APP或者URL链接)是否能够成功打开,判定其是否存在,如果不存在则打开设定的URL。

此URL通过openURL来实现,可实现打开设置好的URL和第三方APP运行,如直接向默认打电话电话,自动发送短信,通过指定第三方APP参数可以在一定程度对其进行控制等等。大家都应该知道在购物过程中通过支付宝进行支付的页面跳转吧,此参数完全可以实现这样的功能。

3). 最后一部分是根据APPID和scheme参数来进行,此处主要实现了不通过跳转到AppStore来下载指定应用。

通过过SKStoreProductViewController来实现APP内部的指定APPID下载指定APP.

四、分析结论

根据以上分析,我可以看出,XCodeGhost具备强大的远程控制功能,目前我们完全不知道它以前真的干过什么,不知道是否正如作者所说那样只是为了留着做APP推广。另外由于远程控制数据只是采用了DES算法进行加密,很容易进行中间人攻击,只需要重新定位url即可接管所有的控制。