今年9月,苹果XcodeGhost事件引发了全社会的广泛关注,堪称App Store自2008年上线以来遭受的规模最大的攻击,涉及应用之广已完全超过想象,由此折射出当前互联网软件安全领域仍然存在严峻挑战。在MDCC 2015移动开发者大会的平台与技术-iOS专场,阿里巴巴资深安全工程师郑旻(蒸米)复盘了整个过程,并讨论了可行的预防措施及事后思考。 然而,来自美国的移动应用开发商Possible Mobile最近遇到了一个问题,他们递交的新版应用遭到了苹果的拒绝,理由是XcodeGhost。这家公司大惑不解,因为他们遵循了严格的安全准则, 使用的官方下载的Xcode编译器,启用了GateKeeper。在多次试错之后,他们终于发现XcodeGhost隐藏在第三方框架中。 以下为译文: 不久前,Xcode感染XcodeGhost病毒,让诸多iOS应用遭恶意代码植入的新闻一爆出,当即引发轰动。苹果因此从App Store撤出受感染的应用,并发布了一份FAQ(常见问题汇总)。由于该事件主要发生在中国,而我们的公司为保险起见,一直坚持从苹果官方渠道下载Xcode,并启用GateKeeper,所以没受什么影响——直到最近出现了问题:我们向App Store提交了应用更新后的几分钟,收到了这样一封拒绝邮件。
大家苦思冥想,抓耳挠腮,走投无路之际,终于发现XcodeGhost恶意代码是通过第三方框架进入我们的应用的。 早在9月,安全研究员发现:感染XcodeGhost的Xcode恶意软件将恶意代码植入应用。而这封邮件的似乎在暗示:我们的应用已被感染——但我们的开发者都是从App Store或Apple Developer门户网站下载Xcode的,这完全说不通啊。 其实不久前,我们也遇到过这种情况,那次因为向Apple Store提交时,所用的机器安装的是OS X测试版。这次是否也是同样的原因呢?我们试着在不同的机器上重建应用,其中一个完全是纯净的build服务器环境,但每次提交都出现相同的错误。 这下子真是黔驴技穷了。为百分之百确定问题的症结,我们紧跟着苹果的操作指南来验证所有版本的Xcode,好确保XcodeGhost没有侵入机器。显示的结果全都是:
随后,我们尝试在多个机器上重新安装Xcode,并调整了GateKeeper的设置,但仍旧被拒绝。鉴于提交的应用版本相比以往的不同之处主要是针对一些第三方框架,所以我们想——会不会是因为第三方利用XcodeGhost编译了框架,然后发送给我们呢? 刚开始我们不知道怎么检查二进制文件,才能找出XcodeGhost的蛛丝马迹,所以干脆采用简单粗暴的方式,撤出第三方框架,再次编译、提交。先 找出罪魁祸首的首要嫌疑对象,从那里切入。没费多大功夫,第三方框架就从应用中移走了,我们再重新提交(提交的版本不可能正式发布,因为应用的主要功能还 是离不开第三方框架)。没过几分钟,我们就看到iTunes Connect上“正在处理…”的字样消失了——应用可以提交了。移除第三方框架,顺利通过;添加第三方框架,被拒绝。 为了确定问题具体出在哪里,我们仔细研究了XcodeGhost,发现XcodeGhost C2(指挥-控制)服务器所用的URL可能是关键,于是在第三方框架里搜寻类似的URL。虽是摸着石头过河,但第一次就中了彩——第三方框架一个二进制文 件中发现的URL字符串确认是带有XcodeGhost病毒的(http://init.icloud-analysis.com)。 除此之外,我们还在设备上安装了build版,代理了流量。应用发布后不久,http://init.icloud-analysis.com上就 出现了请求。好在9月时,与XcodeGhost关联的C2服务器被发现后很快就被移除了(或者说消失了),因而所有对该URL的请求都是无效的,设备上 的信息并未发送给任何人。 到现在为止,我们有十足的信心告知第三方供应商:问题出在他们那里。解释了前因后果,要求他们提供由正版Xcode编译的新框架。接收更新版本后,再进行一次查询和流量代理,直到确认再无XcodeGhost的任何蛛丝马迹为止。 针对具体问题,我们的具体方案是对项目中所有与XcodeGhost相关的URL和方法名称进行递归查询,这会用到一个包含所有目标搜索字符串的文本文件:
我们在所有报告中运行的查询指令是:grep -R -f filewithstrings.txt * 病毒的新变体或恶意软件中新的字符串可以添加到文件中,进一步完善查询环节。也可以考虑添加“http://init”。或“http: //init.icloud-”。当然,这可能会导致将未感染对象错认为感染对象,但唯独用这种方法,才能尽早找到那些可能已经或即将感染 XcodeGhost的URL。查询成为build服务器的必经步骤之后,一旦发现病毒感染,build就会停止运行。 我们可以控制和检查开发者的工作环境(相信他们没有从第三方下载修改过的Xcode版本),但对第三方库和框架就没辙了。我们的大多数项目包含编译过的第三方代码,而这些第三方代码并不在我们的掌握之中,也无法控制第三方供应商编译代码的环境。 我们也不能控制第三方库,却还是得负责最终的代码整合和排错等,但如今却遇到了新问题,这既是一个警示,也说明了产业定期的变革会带来新挑战,会不断催生新的解决方案。 后续更新:在写这篇文章时,又出现了XcodeGhost的新变体。 该版本通过连接多个运行中的URL字符串组成完整的URL,让C2服务器URL逃过了静态分析。如上的检测方法仍能查出旧的XcodeGhost变体,但 目前还不清楚是否能够用于新变体,如果新变体以相似的方式混淆了自己的方法名称,这个检测方法可能就用不上了。对于这点,蒸米表示,事实上在事件爆发之前 就已经存在,只是最近才中招罢了。 (翻译/张新慧) |