XCodeGhost软件供应链安全事件
0x00 前言
“软件供应链安全”是近些年安全圈里一个较火的专业名词,伴随着越来越多的“软件供应链攻击”事件被披露,这个概念不断地被各大安全公司提及和宣传。
个人认为XCodeGhost事件是“软件供应链安全”开始被关注和重视的一大标志性事件,现在很多关于这个话题的举例都会包含该事件。并且,这个案例也是罕见的针对移动IOS系统应用的大规模后门案例。
0x01 事件背景
2015年9月14日,国家互联网应急中心(CNCERT)发布了《关于使用非苹果官方XCODE存在植入恶意代码情况的预警通报》,指出苹果APP应用的开发者使用了非苹果公司官方渠道的XCODE工具进行开发时,会向正常的苹果APP植入恶意代码,被植入恶意程序的苹果APP可以在App Store正常下载安装。该恶意代码具有信息窃取的行为和远程控制的功能。
XCode是苹果公司开发的一款供IOS应用开发者使用的集成工具(IDE),但预警通报指出受影响的是使用了非官方渠道的XCode。尽管如此,仍然有大量(至少几百种)APP诸如微信、网易和12306等体量巨大的应用中招,波及的用户数以亿计,被窃取的信息数量更是天文数字。
据说,该事件是腾讯在自查中发现并上报给CNCERT的。这起事件受影响的主要是国内的用户,根源上除了APP产品研发团队安全意识的不足之外,也与国内特殊的网络环境分不开。
0x02 植入流程
XCode工具的安装包大小在3GB左右,受影响的版本主要是XCode 6和XCode 7,攻击者修改了官方安装包后通过网络论坛和网盘大量传播恶意XCode安装包。
尝试验证恶意XCode安装包的签名时,会提示被添加了一些额外的文件(截图来源为网上报告)。
主要是针对IOS、模拟器和MacOSX这3种应用程序环境植入恶意代码,植入的方式是通过修改XCode的配置文件Ld.xcspec来实现,导致应用程序代码在编译链接(Linking)阶段自动强制引入恶意的库文件CoreService。
“-force_load”参数指定链接器(Linker)强制引入静态链接库,由此恶意静态库文件CoreService将被一起打包进应用程序中自动加载运行。
0x03 CoreService库后门分析
已知披露的CoreService库主要有2类,其中一类是用于IOS和模拟器环境的,另一类则是用于MaxOSX环境。由于MaxOSX类的样本未找到有效的恶意代码,本节主要分析IOS和模拟器环境的样本。
(一)、功能框架分析
CoreService静态库的文件格式是Match-O,该格式是苹果的可执行文件类型。恶意XCode安装包中IOS和模拟器环境使用的CoreService库其实是同一个,该文件同时包含ARM和英特尔X86/X64架构版本的代码。因为各版本的代码功能基本一致,可以拖入IDA后,选择任一版本的代码进行分析。
入口函数“makeKeyAndVisible”是通过重写了UIWindow对象的didFinishLaunchingWithOptions方法来获得在寄主APP创建主窗口之前的执行机会,即被感染的APP在启动后开始准备展示主界面之前就已经执行了恶意代码。
恶意代码启动后,首先检测寄主APP的主窗口和系统版本,若APP没有主窗口或者系统版本小于6.0则放弃运行后续的恶意流程。
若满足运行条件,则初始化设置一个36000000秒(=10000个小时=417天)的休眠时长(该数值后续可以通过指令控制而被间接修改,它是指后门连接上线后请求下一控制指令的等待间隔),然后将唤醒时间存储到“SystemReserved”数据字段中,并设置一个每隔15秒运行一次的定时检查函数“Check”。
“Check”函数负责检查寄主APP是否处于被调试的状态,如果当前没有被调试并且用户正在前台浏览该应用,则检查当前时间是否超过了唤醒时间,若超过则运行一次“Run”函数来激活控制请求。
“Run”函数的功能就是调用一次“connection”函数并传入“running”参数,该调用的目的是为了在APP持续运行的状态中能够实现连续的请求控制(最短15秒可发起一次)。
先看一下“connection”函数的控制代码就知道只有当状态参数为“running”或“launch”时发起的控制请求才会被响应:
那么“launch”参数应该是指连接上线的状态参数,该参数是在入口函数“makeKeyAndVisible”设置的状态通知回调函数“UIApplicationDidBecomeActiveNotification”中使用,表示用户此时进入了寄主APP的前台窗口,若判断当前非模拟器或调试环境则触发上线请求。
再看一下连接请求的过程,调用“AppleIncReserved”函数收集了设备信息对其进行加密,然后POST发送到控制服务器“hxxp://init.icloud-analysis.com”。
“AppleIncReserved”函数中收集的信息包括:当前时间(timestamp)、寄主APP的应用名称(app)、寄主APP的应用ID(bundle)、设备名称(name)、系统版本号(os)、设备类型(type)、寄主APP的运行状态(status)、寄主APP的内部版本号(version)、语言(language)、国家(country)、设备ID(idfv),这些信息以JSON格式进行数据组织。
数据加密函数“Encrypt”是以“stringWithFormat”字符串的前8个字节作为密钥key,使用DES算法的ECB模式进行加密。
发送完加密信息后控制服务器进行http响应,返回的数据在“Response”函数中进行处理。相应地,以同样的DES方式解密响应数据后将会得到一个JSON对象,其中包含“sleep”等多种控制指令。
“sleep”指令即上述提及可以被间接修改的下一指令的等待时长,该数值加上当前时间后即为下一指令的请求唤醒时间被更新到“SystemReserved”数据字段中。
全部的控制指令如下列表,这些字段其实主要就实现了2个控制功能:弹框确认是否安装AppStore上指定ID的应用和调用“openURL”来打开任意URL地址。
调用控制功能之前都会通过调用“canOpenURL”来检查当前设备是否实现了指定的“schme”,这通常是为了判断IOS中是否安装了某款应用。若指定应用已安装则放弃运行后续的控制功能,此处已初见该后门用于APP推广的本意。
若指定应用未安装,则继续检查此时用户是否正在浏览寄主APP,只有当寄主APP的窗口在前台激活才能调用控制功能。这种设定可能会让用户认为当前的弹框或打开URL的现象是属于寄主APP官方的主导行为,从而出于信任提高APP推广的成功率(怀疑腾讯自查发现此事件可能就是有类似的用户现场,此猜测没有查证)。
当用户点击弹框之后的确认按钮之后则会跳转去安装AppStore上指定ID的应用,从这里也能看出弹框功能的设计是出于APP推广的本意。
另外一个功能只是简单调用“openURL”来实现打开任意URL地址,根据其调用前判断“schme”和寄主APP运行状态的行为,推测主要目的也是为了留一个可控性更强的跳转窗口的功能来进行APP推广活动。此处即网络上很多分析文章认为的XCodeGhost后门的强大远控能力的原因,但其实该调用有被过度解析的嫌疑,即使通过配置URL来实现调用打电话、发短信等功能,也需要用户进一步操作,无法自动完成这些敏感的动作。
(二)、升级版本分析
至此,CoreService库后门的整体功能框架已分析完毕,其主线就是收集寄主APP的运行信息回传服务器并下发相应的控制指令进行弹窗或打开URL,目的为推广自己的APP应用。除此之外,对于IOS和模拟器环境还存在另外一种针对系统版本在7.0以上的样本。相比上述分析样本,此样本的主体功能框架并无本质变化,仅是增加了一个信息收集字段“network”,还有操作APP剪贴板的行为,并且在某些地方采用拼接字符串的方式增强其隐蔽性。
新加的“network”字段是为了区分用户设备此时使用的网络环境是WIFI还是3G数据网络,猜测收集此字段信息是为了方便控制在WIFI网络环境才下发指令进行APP推广活动,因为一般WIFI网络速度比较快更适合下载和安装APP。
虽然在样本中有多处读写APP剪贴板的代码,但真正有调用执行的只是在接收了远程指令后将当前的时间信息写入了APP的剪贴板。
“setString”函数写入信息到APP的剪贴板:
拼接字符串增强隐蔽性的操作如下,此处是为了拼接出控制服务器的地址(http://init.icloud-diagnostics.com)。
另外,根据2015年11月份火眼发布的一份报告来看,似乎还存在一种后门版本(报告中称之为“XCodeGhost S”),该版本据说添加了感染IOS 9的功能,会读取寄主APP的Info.plist中“NSAppTransportSecurity”配置,自动设置选择不同的CnC服务器(http/https)。由于这里没有拿到样本,下图仅截取其报告的一段分析代码。
0x04 实验验证
上文仅是通过静态分析展示了XCodeGhost后门的功能,本节希望用实际的操作来验证整个过程。
实验环境配置如下:
开发环境:MacOS Mojave 10.14.6 + XCode 10.3
模拟器环境:IPhone 8 Plus
XCode安装包会自带各种版本的模拟器环境,为了保证开发环境的安全性建议从苹果官网下载指定版本的XCode工具。
启动XCode后新建一个测试项目test,使用默认的框架代码即可无需额外添加代码,编译运行后将会创建一个空白窗口并显示。
当然,本实验关键的地方是使用“-force_load”链接指令引入XCodeGhost后门库CoreService。
这里,由于CoreService后门检测模拟器环境则不会触发上线请求,于是将x86_64版本的判断指令手动patch一个字节(0x74改成0x75,即汇编指令jz改成jnz)后以绕过检查,CoreService_patch即为patch后的版本。
另外,由于新版IOS系统(9.0以后)默认开启ATS(App Transport Security),会限制http协议的网络请求,只能使用https进行安全连接。若想解除此限制,可以通过修改项目Info.plist配置ATS。
此时,编译该项目后就可以得到一个包含XCodeGhost后门的测试APP,由于控制服务器域名早已失效,这里可以通过修改macOS系统的hosts文件来进行中间人劫持。
当然,接管的服务器上需要提前布置好远程控制服务,这里推荐使用此项目https://github.com/TimonPeng/XcodeGhost_server快速搭建。然后启动test测试项目运行,就可以接收到XCodeGhost后门收集上来的信息数据如下。
这里我录制了2个视频分别测试该后门的弹窗推广APP安装和打开任意URL的功能。弹框功能测试如下,从桌面点击test应用进入前台窗口后弹出“推广应用”的确认窗口,点击“确认”按钮后跳转到安装AppStore指定应用的界面。但是由于模拟器功能未开放AppStroe(英特尔模拟器环境无法兼容正式的ARM架构APP应用),所以会显示一个“LOADING”的加载提示。
打开任意URL的功能测试如下,这里简单传入一个百度搜索的网址,进入test应用后将会直接调用默认浏览器打开百度网站。
0x05 溯源分析
根据以前的报告信息可知,被植入后门的XCode是由攻击者上传到百度网盘,然后通过几个知名度较高的论坛发布进行传播。如下是安天报告整理的部分传播渠道列表。
查看威锋网该帖子的历史快照如下,可以看到作者发布了多个版本的XCode分享的网盘地址。使用旧帖(首发2012年)发布的目的猜测是为了增加下载者对此贴的信任。
分享的百度网盘截图如下(来源为网上报告)。
传播的方式如此简单,但是为什么影响却如此广泛呢?根据雷锋网的相关报道可以简单的总结原因就是:封闭的网络环境+信任。由于当时从苹果官方下载XCode安装包并不是特别容易,所以很多开发者获取XCode工具的渠道比较多样和暗藏风险。比如,类似上述的网盘分享,或者同事之间进行分享等。因为XCode工具的体积也比较大,版本也较多,很多人都无从验证其中是否包含风险,从而倾向选择无条件信任的机会就更大一些。这种特殊的“信任漏洞”一旦被攻击者利用,影响也是出乎意料的恐怖,可能攻击者自己都没想到,自己“错误的实验”竟然打遍国内各大知名企业(截图来源为网上报告)。
随着当时此事件的不断发酵,作者也有些害怕认怂了,赶紧注册了一个微博小号出来澄清,诉说自己只是一个苦逼的IOS开发者,传播此后门是出于私心希望可以推广自己的应用,并且放出了XCodeGhost后门的源代码。
经过分析和比较,这份源代码与传播的后门库样本CoreService(针对IOS 6.0的版本)的确系出同源,并且也确实是以应用推广为目的。只是当时事件影响过大,该作者最终还是逃不掉各方的强烈怒火和指责。
关于受此事件影响的腾讯微信团队也发出了说明。
0x06 相关案例
在搜集此事件资料的过程中,额外发现了今年(2021年)新出现的一种相关的针对XCode开发者的恶意后门(XCodeSpy),本节顺便对此案例进行简单的分析。
和XCodeGhost寄生在XCode开发工具不同的是,此后门是以IOS项目的形式寄生在一个被恶意修改过国产项目“TabBarInreraction”之中,该项目的应用截图如下。
被恶意修改后的该项目会在项目配置文件“project.pbxproj”中包含一段shell脚本代码:
该段代码实际上是利用了XCode IDE的内置功能,在开发人员构建目标应用的阶段允许运行自定义脚本。
恶意插入的脚本通过简单替换“eval”为“echo”解开混淆后代码如下,可以看出其功能是建立了一个连接到“www.cralev.me:443”的反弹shell。
通过此后门已经可以达到远程下发控制指令的作用,后续攻击者可以对开发者主机进行任意操作。据火眼报告指出,该后门关联一个被称为eggshell的恶意软件,该软件本质上是个远控程序可以在开发者电脑进行持续的监视和操作以期进一步活动。
0x07 总结
XCodeGhost后门事件作为“软件供应链安全”的经典案例,其本质是针对开发环境的污染,这类从供应链上游源头上的攻击往往是最隐蔽和最难防备的,其影响力也是最大。虽然此次事件并未造成实质性的破坏和损失,但是侧面反映出来的各方面问题非常值得安全人员研究和警惕,防止更大的事故发生。
0x08 参考链接
1、Xcode非官方版本恶意代码污染事件(XcodeGhost)的分析与综述,https://www.antiy.com/response/xcodeghost.html
2、XCodeGhost详细分析报告,https://bbs.pediy.com/thread-204281.htm
3、XCodeGhost作者放出的源码,https://github.com/XcodeGhostSource/XcodeGhost
4、XCodeGhost服务端测试代码,https://github.com/TimonPeng/XcodeGhost_server
5、为什么XcodeGhost能够在中国大陆造成这么大的影响? https://zrstea.com/75/
6、XcodeGhost:墙、感染、信任和欺骗,https://www.leiphone.com/category/zhuanlan/Q6MWlts9zKEyX0HV.html
7、XcodeGhost 事件全面详细回顾,https://www.oschina.net/news/66349/xcodehost-roundup
8、XcodeGhost笔记,https://lngost.github.io/pages/articles/others/XcodeGhost-review/xcodeghost-review.html
9、XcodeGhost事件全程回顾,阿里移动安全蒸米重磅分析,https://mp.weixin.qq.com/s?__biz=MzIwMTI4Nzk5Ng==&mid=210605588&idx=1&sn=109d3415aa95bbb7ca4270e78c86680c&scene=0#rd
10、Novel Malware XcodeGhost Modifies Xcode, Infects Apple iOS Apps and Hits App Store https://unit42.paloaltonetworks.com/novel-malware-xcodeghost-modifies-xcode-infects-apple-ios-apps-and-hits-app-store/
11、XcodeGhost S: A New Breed Hits the US https://www.fireeye.com/blog/threat-research/2015/11/xcodeghost_s_a_new.html
12、New macOS Malware XcodeSpy Targets Xcode Developers with EggShell Backdoor https://www.sentinelone.com/labs/new-macos-malware-xcodespy-targets-xcode-developers-with-eggshell-backdoor/
目前没有反馈
表单载入中...