堡垒最先从内部攻破。——列宁
最安全的地方,同时也是最危险的地方。最近的两次苹果安全危机,一次是因为iCloud服务器,一次是因为开发者使用的Xcode。
回顾XcodeGhost事件
简单地说,整个XcodeGhost事件的流程是这个样子的:某个黑产团队在国内云盘中上传了一个带毒的Xcode编译器,然后大规模扩散该下载链接,在强大的宣传团队的努力下,这个下载链接被成功的扩散了出去。因为APP store链接的不稳定性,所以国内一些程序猿不喜欢去官方市场耗费时间下载编译器,于是转向论坛上找网盘资源。于是,那一批开发人员开发的APP就成功中招。
中招之后会发生什么呢?在写代码时,什么都不会发生,写出来的代码看起来干干净净,但是当开始使用编译器生成安装包后,编译器就向安装包中嵌入后门代码。按照公布出来的信息,这些代码负责向一个伪装成iclude的服务器发送用户信息、安装包信息、设备型号等等。看起来没什么威胁性,不是吗?并不是!尽管后来有人在微博中对这件事情负责、并道歉,说明自己并无恶意。但是你信吗?我不信。一个理由:维护这些用来搜集用户信息的海外服务器,每月耗资50万美金(数据出自腾讯安全中心估测)。如果是个人的无意行为,谁有能力、或者吃饱了撑的负担这么耗资的玩意儿?所以背后应该是有一个黑产团队在操作。虽然伪装成iCloud的服务器已被作者关闭,但是潜在危险还会持续一段时间:如修复速度很慢的12306,至今没有发布修复版本的安装包,中毒的安装包还在手机上孜孜不倦的发送着用户的信息。而只需要一个DNS伪装,就能成功捕获到这些数据。
回头看看这次安全事件:觉得会对用户造成威胁吗?好像不会啊,因为攻击者获取的都是一些基本的用户信息,敏感度也不高。但是有一个问题:植入的后门代码可以向指定服务器发送指定信息,而且用户根本不会怀疑,因为用户完全信任苹果的软件生态园,就等于这款中毒软件已经完全获得了用户的信任。那如果我弹出一个伪造iCloud的密码输入框怎么办?我弹出一个钓鱼网站链接怎么办?由于苹果自认为在iOS生态园中不需要安全软件,因为苹果已经将不安全的额软件置之门外了,所以没有安全软件的提示,一般用户很难察觉危险的存在。战斗堡垒就这样从内部被攻破了。就连开发者和苹果都没有意识到。开发者意识不到,情有可原。但是苹果为什么没有检测到呢?因为在上线审核时,苹果只审是否调用违规API,这些信息从未审查,所以就给感染病毒的APP提供了可乘之机。
对安全问题的反思
事情已经出了,移动互联网,特别是APP安全问题再一次的受到前所未有的关注。那,看看我们程序员在不安全方面都做了那些“贡献”呢?
将公司代码传至Github
别笑,是真的。github素来以开源出名,github建站之初的目的是借助git协议(版本控制协议,和svn协议作用一样,但是功能比svn强大)为程序员们提供一个分享代码、协同开发的平台,并不是提供给公司用作版本管理远程代码托管使用,虽然github提供了这项服务,不过是一项收费服务,新手并不清楚这一点,于是就大大方方的将公司代码交给github托管。在github上,只要出现一个商业项目,马上就会引来大量的fork,所以各位CTO们,快问问你的工程师有没有将代码弄到github上。
什么?自己很想使用git做版本管理工具?你可以自己搭建git服务器嘛。什么?自己不想维护?国内有一家叫oschina的平台提供代码托管服务,可以选择不公开代码。什么?用国内的low逼?好吧,土豪们请去github上购买一个付费账号,这样就可以使用github提供的私有代码仓库服务了。
使用宏定义将私钥放在代码中
这样看起来似乎没什么问题,不是吗?大家都是这么做的。好吧,如果服务器懒得和你配合,而且主管们觉得这么做没什么问题,那你就这么做吧。但是不得不提醒一下,如果反编译了你的app,是可以获取到这段宏定义的,这样,私钥就暴露了。妥善的处置方式是:APP中不要保存任何与服务器通信认证相关的内容(CA证书除外),所有的认证材料:私钥、时间戳等等都从服务器获取,服务器端不定时更新认证信息。这样防止APP被反编译后获取到敏感信息。
认为安全工作都是服务器团队做的
恩,在数据安全方面,服务器团队做的努力确实应该比移动开发团队做的努力多,因为一旦服务器被攻破,影响的是整个用户体系,而攻破了单个APP,看起来除了获取到某些用户的信息外,只能是获取到接口签名规则,然后发动DOS/DDOS攻击,这方面的安全措施还是在服务器端做的。但是。。。问题出现了:就像这次的安全事件,问题出在了APP,但是同样会影响所有的用户体系。
矛与盾,攻与防向来都是一对儿好基友。没有百分之百的安全措施,在选择安全措施的同时要考虑当前公司的业务状态和数据的敏感程度。做过网络安全的应该都会清楚的明白:安全程度越高,性能越差。在安全与性能方面的取舍,还得综合利弊。