« 最近 blog 系统出了几个问题 | 返回首页 | 埃及一日游 »

说说 XcodeGhost 这个事

最近 XcodeGhost 这个事挺火的,简单说就是有人在 Xcode 里植入了木马,让用这个被修改过的 XCode 编译出来的 ios app 都被插入了一些代码。由于 XCode 几乎是生成 ios app 的唯一手段,且墙内的同学各种诸如用 baidu 搜索,迅雷下载等坏习惯早就根植在基因里了,导致了这份被种马的 XCode 在最近半年里广泛传播,污染了一大批国产 app 。

我这里就不提那些中招的所谓大厂了,如果经常听我扯淡的同学早就知道我的观点:即便是大厂,有安全常识的人还是少之又少、反而是所谓大厂因为管理更困难(好多大厂到管事的那级的人更跟不上知识更新),犯安全错误的机会就更大。

这种从非官方渠道下载软件使用而中招的事情又不是第一次了。上次 putty 被种后门 的事情过了也没多久,好了疮疤忘了痛,对吧。

种马的手法其实也不新鲜。有点年纪的程序员读书时,课本上一定教过:计算机病毒有四种形式,最后一种就叫源码病毒,感染附着在编译器中。只是估计很少人见过,后来课本就删掉了。其实呢,这个说法的源头是 Ken Thompson 在 1984 年图灵奖演说上提到过的恶作剧。老实说 The Ken Thompson Hack 的手法比这个高明的多。

XcodeGhost 的技术细节就不分析了,网上一搜一大堆。我想说的是这次这个东西危害问题。

这玩意有没有害?当然有。你以你名义发布的程序被人插入了一段你不知道是什么的代码,当然有危害。因为用户信任你才用的 app 。你也不希望你的 app 的用户的信息被不知道什么人获取。因为理论上,你的 app 可以了解的信息,这段代码都可以得到。一旦你在 apple 的账号系统之外又自建了用户系统,那么这个第三方(你自建的)系统的安全性一定出现了漏洞。

这也是苹果从来都不赞成第三方 app 自己搞一套生态的原因之一。你没有系统级的权限,本身就在安全性上打了折扣。

但是,你的 apple (icloud) id 及其密码到底面临多大威胁?我认为危险是完全可控的。

首先:在 ios 系统中,icloud 密码是很高优先级的东西,ios 设计人员再傻也知道要重点保护它。所以,如果通过正常的渠道,在 ios 中输入密码,即使是通过被感染的 app ,也是不可能通过程序获取到 icloud 密码的。唯一的手段是模拟一个输入密码的对话框引诱用户输入密码来钓鱼。

但 ios 是如何从设计上去解决被钓鱼的安全问题呢?

没错,app 可以自己画出任何外貌的对话框,用户无从分辨是 app 画出来的还是系统画出来的。但有一点可以提供安全保护。那就是 icloud id 本身在 ios 中同样是高安全级别的信息,和密码一样,禁止 app 获取。所以你注意到没有,没当你使用 ios 的时候,系统要求你输入 icloud 密码,对话框上都会写明需要登录的 icloud id 是什么。而不会让你在那里去输入 icloud id 。唯一可能要求你输入 icloud id 的地方就是 app store ,在别的 app ,哪怕是苹果自己的 app 里都不会做此输入要求。这赋予了用户分辨钓鱼对话框的能力。

一旦有对话框要求你输入 icloud id 时,你都应该警惕是不是钓鱼。作为这种反常的输入要求,你可以回忆一下最近半年有没有遇到过,如果不确定,还是把 icloud 的二步验证打开好了。

说到这里,微博上有同学就此反驳说。不是所有人都有这个安全意识,尤其是中老年用户。我想说,就我认识的同学的父母,更多的把 icloud id 是什么都忘记了,哪里谈的到输入。几乎 iphone/ipad 交到他们手上后,他们就没有接触过 icloud id 的概念,能记得密码就不错了。

用户自己的安全当然总有一部分是靠自己的,如果系统让你输入啥你就输入啥。还用的着骗你的 icloud id 吗?直接伪造一个支付界面,让你输入银行账号密码不是更直接。这,就是为什么苹果系统不让 app 自己搞支付接口的重要安全考虑之一了。

我更想吐槽的是,国内安卓平台的搞法,各个 app 都把支付平台用 sdk 接入到自己的程序里的方法,根本就是作死。别说钓鱼了(画一个一摸一样的界面还不容易?),同一进程下,即使 sdk 不是你写的代码,你也有一万种方法知道那些输入框里输入了些啥。没有沙盒隔离,不在独立进程去做支付,是无法从根本上解决安全问题的。这也是为什么在 google play 被墙后,我拒绝使用安卓设备的原因之一。

ps. 对比看看国内各个支付平台的设计。有几个是把保护用户账号名作为安全设计点的?国内做平台设计的人的安全常识可见一斑。


今天,有人在微博上声称自己是 XcodeGhost 的作者,并坦言除了植入广告,并没有做什么特别有危害的事情。收集的信息仅限于作为普通 app 人人都可以收集到的。有同学核对了开源的代码,和之前逆向工程的结果做比对,认为比较可信。

我对此结论基本相信,虽有少部分说法保持怀疑,但我相信即使我用过那些被感染的 app ,我对自己的 icloud 账号的安全还是信任的。我在微博上是这样评价的:

对于 XcodeGhost 这事, 我想说, 你的 app 不过被人插入了几行不是你写的代码发布到了 app store 而已, 能不能干坏事要看 ios 的安全机制; 当你接入腾讯 sdk 等类似代码时, 成吨的不知道是啥的代码被插入你咋就不担心呢? 相比之前 360 app 利用漏洞去躲避苹果审核那些私有 api 调用, 这次安全的多啦.

为什么我要把被感染 xcode 植入代码和接入第三方(比如腾讯的)SDK 相提并论?那就是因为 app store 本给了用户你最后一道信任防线,由他来证明 app 是谁开发的,而你来最终决定是否信任。而国内渠道要求乱接 sdk 的风气,早就破坏了这道防线。你用的所有国产 app 里都有可能嵌入了不是他家开发的代码。

这次被插入的代码,即使没有公开源码,规模也很小,很容易逆向分析;相比腾讯 sdk 容易多了。即使你相信腾讯公司的节操,你又如何信任由一堆没有安全常识的人写那成吨的不可能被公开审核的 sdk 代码里没有安全漏洞可以被黑产利用呢?

安全不能全寄托在开发者的素质上,无论是有意还是无心还是过错,都有可能插入非用户期望的代码。这个信任最多是一个安全环节,前面还有苹果商店的审核、ios 系统的沙盒等多个关卡。

ps. 不用 SDK 的话,正确的做法是什么?第三方平台提供接入手册,告诉接入方用什么协议去跳转到相关 app 里去认证。如果用户没有装你的 app (qq 微信这些) ,就应该打开系统的浏览器做 web 授权。


说起苹果商店的审核制度,没有技术背景的同学总觉得这事或多或少要怪苹果审核不力。这是个严重的误解。苹果审核没有能力去靠静态分析,和有限的人力去了解一个 app 到底能干什么时候,会弹什么窗口。就算你拿源代码去审核他们也办不到。

苹果审核只能确定你的 app 调用了哪些系统 api ,这些被允许调用的 API 是被安全认证过的,基本不会逃逸出沙盒去获取非法信息。这就是为什么苹果要在 ios 上禁止 JIT ,禁止动态加载原生代码的原因。一旦允许 JIT 或动态加载原生代码(你可以过审后从网上下载一段未被审核的代码运行),app 就可以在运行时调用那些被禁止的 API 。从这点看,之前 360 发布的 app 利用漏洞逃避苹果审核自己的应用内调用私有 api 的行为危害大的多。

当然,审核并不是 ios 最后的安全手段,最关键还是 ios 自身的沙盒隔离。审核只是多做一层防护,相当于开个白名单,减少沙盒的安全漏洞被利用的可能性。至于沙盒这最后一道(也是最重要的)防线,就要求用户你不要去搞什么越狱啦。


昨天,有同学给过我一个链接,说其实未越狱的 iphone 也可以被钓鱼。

在非越狱的iPhone 6 (iOS 8.1.3) 上进行钓鱼攻击 (盗取App Store密码) 其中的截图还被人危言耸听的拿出去作为这次 XcodeGhost 可以被用于钓鱼的证据。

其实无论你有没有特别的技术背景,只要中文理解能力够,就可以读懂上文中的技术重点。

它其实说的是一个漏洞让程序可以后台将对话框弹到别的应用里。但这里有一个重要的前提条件:安装钓鱼 app 到目标设备。在这个漏洞还存在时,这个钓鱼 app 也无法逃过苹果审核的静态分析一关。

另外,钓鱼成功还依赖钓鱼者知道用户的 apple id ,而这点目前依旧无法办到。让我们看看文中提到的非法获取 apple id 的 CVE-2014-4423 的简单分析。我们可以知道几点信息:首先,这个安全漏洞在 ios 8 就补上了,其次,利用这个漏洞需要调用私有 API ,依然是过不了苹果审核的。

这些都不可能用于目前的 XcodeGhost 。这正说明了, ios 的层层安全措施有效且必要。


无论如何,作为一个中国人,若想尽量保障自己的隐私安全,加强安全意识还是非常重要的。选用安全的操作系统(远离国产安卓平台),勤快的升级,小心选择不会被社工的密码,且保护好你的账户名。还有,尽量远离国产软件。

Comments

@cloud 谢谢指出~ 我查了下iOS6之前是有个UIGetScreenImage函数可以做整屏幕截屏,后来iOS6把这个函数改为private API了,到了iOS7直接移除了。看来苹果早就考虑到了这个隐患:)
@xClouder 这就说明了为什么 ios 的 app 没有权限截屏.
对您说的下面这个情况倒是没注意过,所以特别做了下验证。 "所以你注意到没有,没当你使用 ios 的时候,系统要求你输入 icloud 密码,对话框上都会写明需要登录的 icloud id 是什么。而不会让你在那里去输入 icloud id 。唯一可能要求你输入 icloud id 的地方就是 app store ,在别的 app ,哪怕是苹果自己的 app 里都不会做此输入要求。这赋予了用户分辨钓鱼对话框的能力。" 如果在系统设置里把iCloud和Appstore账户都注销,在应用内支付的时候还是会弹出输入icloud id和密码的框。理论上,这时候进行截屏做OCR应该是能拿到icloud id的。当然,这种情况比较极端:)
担心接入腾讯 sdk 等成吨不知道是啥的代码, 那麼在劫持了這樣的应用难道不是更值得担心吗? :) Xcodeghost 具备 openURL 的能力, 理论上可以模仿各种行为, 包括你说的用协议去跳转到相关 app 里去认证的行为.
苹果并不需要静态分析,只需要要求app开发商提供构建脚本,在苹果的持续交付机器上编译发布即可。
本来作为一个洁癖程序员这次没受影响,但是看到楼主说不知道腾讯sdk有没有问题有点犯嘀咕,想问下这样说是否有什么端倪根据,简单google了一下没查到什么;最近在用腾讯sdk做二次开发
合久必分,分久必合啊
@hanson 一堆数字组成的11位数字,更何况还是有规律的,就算你不去买号码,发个垃圾信息,随便造就有了,更何况icloud,而imessage也不是非要icloud的地址才行,库存的邮箱地址都可以试,群发而已,没有库存就造嘛,反正imessage又不要钱。
买不起苹果,只能任人鱼肉了~ 上面的是习大大??
ios里面默认信任了cnnic,而且不让删除,有什么办法吗?很想丢掉android,但舍不得它可以删掉cnnic这个功能。
@hanson 有人可以把垃圾信息发到你的 imessage 上,只说明他知道有你的 icloud id 存在, 就像他知道你的电话号码能打通一样. 但是, 即使这个人种了木马在你的设备上, 也会因为沙盒隔离开. 由于 app 和 imessage 的 app 隔离的缘故, 有能力弹出 icloud id 的 app 并不能知道当前设备的 id . 简单说, 他只能知道有这么一个 id 存在而不能在这个 id 对应的设备上命令别的 app 做事情. 这个对应关系是由沙盒隔离的.
有个疑问? 如果别的应用获取不了apple id,那些广告imessage是怎么发到手机上的?
分析的很详细,逻辑也很清晰,真不愧是技术达人。 有些留言在散布恐慌、搞谩骂,这都是没脑子的行为。兄弟们都是搞技术的,没有独立思考能力,估计在这条路上也走不远。 云风有些话写的也不全对,大家可以就事论事继续讨论,我们也来涨涨见识:)
我们国家的权力与资源是掌控在一些大流氓手上的,剩下的绝大多数是小流氓,如果拿到了权力与资源瞬间变成大流氓,连个疑问都不用有。问题的关键其实不是有没有安全意识,我认为偏偏就是“节操”。以上,身为中国人就不应说中国人的梗的逻辑,就不必说了吧。
合久必分,分久必合。android的混乱,ios的封闭,是该出现“idroid”一统天下了。
如果一个电视剧演员说自己从来不看电视剧, 那是在浪费时间, 我们怎么想?我个人觉得不能一刀切,把所有的国产软件一棍打死,毕竟我们都在做软件, 并且是"国产软件".即使 BAT 做的不够好, 也不能认为......
句句透出你这只果狗的气味,看这篇 http://www.leiphone.com/news/201509/Q6MWlts9zKEyX0HV.html
相比XCode,Android SDK和 NDK要注入简直有无数种玩法,甚至连源代码都能偷,而且最要命的事,Android SDK和NDK和官网妥妥的被墙,从第三方渠道下载的人更多,细思极恐
我有个疑问,从技术上来说,xcode在编译app时能否加入一串识别码来标识是否是由官方的xcode编译出来的,即检验自己是否被篡改过,这样审核时就能把这个情况杜绝掉。我觉得这部分apple还是有一定责任去做验证的,xcode算一下自己的sha1什么的应该不难
“当你接入腾讯 sdk 等类似代码时, 成吨的不知道是啥的代码被插入你咋就不担心呢? 相比之前 360 app 利用漏洞去躲避苹果审核那些私有 api 调用, 这次安全的多啦.” 这是我自己选择接入的,我心理能接受。这个什么ghost,是自己偷偷接入的。性质都不同了。
愤青有点过了,ejoy的游戏有没有安全漏洞,也不一定啊!
苹果并不需要静态分析,只需要要求app开发商提供构建脚本,在苹果的持续交付机器上编译发布即可。
担心接入腾讯 sdk 等成吨不知道是啥的代码, 那麼在劫持了這樣的应用难道不是更值得担心吗? :) Xcodeghost 具备 openURL 的能力, 理论上可以模仿各种行为, 包括你说的用协议去跳转到相关 app 里去认证的行为.
见过不少 Android 应用需要用户付款的时候直接弹个 webview 出来………… PS: 有次遇到支付宝 HTTPS 证书报错,问支付宝客服是不是出了什么事,他丫的竟然让我**忽略安全警告**试试!
心动庄园和陌陌算不算国产软件?
赞!说得好。 但是对于这个:"一旦有对话框要求你输入 icloud id 时,你都应该警惕是不是钓鱼" ,恐怕一般用户很少能知道。
你不用国产手机,还要大家远离国产安卓,那你司还为国产安卓开发游戏?
顶!!!!!!!!!!!!!! 支持!!!!!!!!! 尽管看不懂
小伙子,bat就交给你来调教了!

Post a comment

非这个主题相关的留言请到:留言本