昨天一条XCodeGhost的消息在微信朋友圈和IT圈炸开了锅,并且引发了许多人的愤怒和担忧,愤怒的是中国这么多知名IT公司不负责的开发行为,担忧的是自己的用户名密码等隐私信息的再一次泄露将给自己带来又一次的伤害。

简单说XCodeGhost是有人在XCode里面植入了一段代码,导致用户使用通过这个XCode编译的iOS应用软件时会自动执行这段额外植入的代码,并将用户的隐私信息发往黑客的服务器,详细信息参见乌云知识库。截至今天已经有超过20款iOS应用确认拥有XCodeGhost。

当我看到这个新闻的时候,第一个想法就是”历史总是如此的相似”。让我们回到上个世纪70,80年代,Unix之父Ken Thompson(1943~)在贝尔实验室里面开发了Unix系统,并且贝尔实验室的计算机也安装了这个Unix系统供员工使用。有一天大家发现Ken总是可以以最高权限进入他们的帐号。可想而知,在牛人聚集的贝尔实验室是不允许这样的事情发生的,所以许多员工跳出来仔细分析Unix代码,并且确实也找到了后门,然后修复这些后门后重新编译整个Unix并重新安装。所有人都以为可以放心的使用新的Unix的时候却发现Ken还是可以自由的获取他们的账户权限,并且再也无能为力了。直到多年以后,Ken才解开了大家心中的疑惑,原来Ken在编译Unix所使用的C语言编译器里面加入了一个后门,而当时跳出来分析和修复Unix的员工并没有去分析过C语言编译器,导致Ken一再得手。回想昨天的新闻,竟是如此的相似。

相对于Ken在C语言编译器植入后门,XCodeGhost在XCode里面植入后门只能算小儿科(因为当时贝尔实验室使用的C语言编译器是Ken开发的,相当于官方发布了具有后门的编译器),毕竟官方的XCode并没有包含XCodeGhost。那么为什么还是有如此多的知名IT公司的iOS应用都有的此后门啦?其中有一个传言就是由于从中国去Apple官服下载XCode非常慢,所以需要去各个社区或者通过迅雷下载,所以才导致下载到了包含XCodeGhost的XCode。我觉得迅雷纯属躺枪,开发者使用了不安全的工作方法,还要找个借口发泄到迅雷身上,这本身就是一种不负责的态度。

对于XCodeGhost的爆发,我有一些疑惑:

  • 这些公司的软件发布流程是怎么样的?是通过CI(持续集成)统一构建发布,还是随便找一个开发人员,从其开发机上构建发布?
  • 如果是使用CI统一发布,难道CI配置也是随便配置,没有任何规范流程?

我认为良好的CI环境是预防XCodeGhost这样的漏洞最好方法,因此我们应该做到:

  • 软件的发布版本一定要通过CI构建获得,并且CI环境中构建所使用到的软件一定要从官方渠道获得。
  • 代码版本库里面最好只有源代码,如果需要包含依赖库,这个依赖库也只能通过CI构建,而不是在某个开发的机器上构建获得。

其次:

  • 公司应该规定开发使用的软件都应该从官方渠道获取,并要求对于下载的软件进行MD5或者SHA-1哈希值验证。
  • 如果开发人员过多,不方便管理,可以要求IT统一从官方驱动获取软件,然后由IT统一管理和安装所有软件。

扩展随想,编译器/IDE以后我们注意了,第三方包/框架我们就可以放心了吗?这些第三方包就不会有类似XCodeGhost的后门?针对这个我有一些想法:

  • 尽量使用在线包管理系统下载第三方包,现在基本上大部分的语言都有其第三方包在线管理方案,java有maven,ruby有gems,nodejs有npm,iOS有Alcatraz和CocoaPods等等。并且在使用前尽量通过这些在线包管理系统多了解一下你将使用的包,比如下载量,使用者评论,未修复的bugs等。
  • 在CVE,NVD,乌云等这类安全漏洞网站上查询你是用的第三方包是否存在漏洞。如果你觉得手动麻烦,还可以使用OWASP Dependency Check来自动扫描你将使用的第三方库,从而及早发现其漏洞,详细使用方法参见在CI中实现持续Web安全扫描

总的来说,一个应用软件的安全可以从五个角度考虑:操作系统,病毒,源代码(包括软件架构和设计),编译器/IDE,第三方软件包,见下图: image