第 1 章 纵观Android生态圈

第 1 章 纵观Android生态圈

尽管Android这个词仍然可以用来指代人形机器人,但如今其含义已经远比十年前丰富,可以用于许多种场景中。在移动领域中,它既可以指公司、操作系统,也可以指开源项目和开发者社区。一些人甚至把移动设备称为Android。总之,现在围绕着这个非常流行的移动操作系统,已经形成了一个完整的生态圈。

本章将仔细审视Android生态圈的构成与健康状态。首先介绍Android是如何发展成目前的状态的,然后将这个生态圈的利益相关者进行分组,帮助读者理解他们的角色与动机。最后本章讨论生态圈中一些复杂的关联关系,它们会造成影响安全性的几个重要问题。

1.1 了解Android的根源

Android并不是一夜之间就成为世界上最流行的移动操作系统的。过去十年,Android走过了一段漫长而颠簸的旅程。本节讲述Android是如何成为现在的样子,并开始探究到底是什么孕育了Android生态圈。

1.1.1 公司历史

Android是从一家名为Android的公司开始的,这家公司于2003年10月由Andy Rubin、Chris White、Nick Sears和Rich Miner创立。他们专注于创造能够考虑位置信息和用户偏好的移动设备。在成功调查市场需求并克服资金困难之后,谷歌公司在2005年8月收购了Android公司。在接下来的一段时间里,谷歌开始与硬件、软件和电信企业建立伙伴关系,意图进军移动市场。

2007年11月,开放手机联盟(OHA)宣告成立。这个企业联盟包括了以谷歌为首的34家创始会员公司,共同秉承着对开放性的承诺。此外,联盟的目的是加速移动平台上的创新,为消费者提供更丰富、更便宜和更好用的移动体验。在本书出版时,OHA会员已经增至84个。联盟会员包含了移动生态圈的所有重要环节,包括移动运营商、手机制造商、芯片制造商和软件厂商等。你可以在OHA的网站上找到联盟会员的完整列表:www.openhandsetalliance.com/oha_members.html

OHA成立后,谷歌宣布了他们的第一款移动产品:Android。但谷歌仍然没有向市场发布任何一款运行Android的设备。最终经过5年之后,在2008年10月,Android终于开始进入大众市场,第一款Android手机HTC G1的公开发布,标志着一个新时代的开始。

1.1.2 版本历史

在Android第一个商业版本之前,Android操作系统有过Alpha版和Beta版。 Alpha版只提供给谷歌和OHA会员,以流行的机器人Astro Boy、Bender和R2-D2作为代号。Android的Beta版于2007年11月5日发布,这天也被普遍视为Android的生日。

Android第一个商业版本1.0版发布于2008年9月23日,1.1版在2009年2月9日发布。这两个版本在发布时没有按之前的命名约定给出代号。而从2009年4月30日发布的Android 1.5版起,Android主要版本就开始按照依字母排序的可口美食来命名,1.5版的代号为Cupcake(纸杯蛋糕)。图1-1显示了所有的Android商业版本,包括它们的发布时间和代号。

{%}

图 1-1 Android版本

与Android发行版以代号命名类似,Android的各个编译链接版本(build)通过一个短的内部构建代号进行命名,关于版本代号名称、标签和内部版本号的详细解释,参见http://source.android.com/source/build-numbers.html。以内部版本号JOP40D为例,首字母代表Android发行版的代号(J代表Jelly Bean),第二个字母代表这个编译链接版本生成的代码分支,尽管其确切含义在各个链接版本中都并非固定不变。第三个字母和随后的两个数字组成了一个日期代码,字母代表季度,从A开始(A代表2009年第一季度)。在这个例子中,P就代表2012年第四季度,两个数字则代表从本季度开始的天数。在该例子中,P40就是2012年11月10日。最后一个字母区分当日发布的不同版本,同样从A开始。某天的第一个编译链接版本应该以A来指明,但通常不会使用这个字母。

1.1.3 审视Android设备家族

随着Android的成长,基于Android操作系统的设备数量也随之增长。在过去的几年里,Android已经缓慢地从传统的智能手机和平板电脑市场往外扩张,进入最不可能的领域中。例如,智能手表、电视机配件、游戏主机、烤箱、发送到太空中的卫星,以及新的Google Glass(具有头戴式显示屏的可穿戴设备)等设备都是由Android系统支持的。汽车产业也开始使用Android作为车辆信息娱乐系统。这款操作系统也开始在嵌入式Linux领域中站稳脚跟,成为对嵌入式开发者非常有吸引力的替代方案。所有这些都将让Android设备家族成为一个非常多样化的领域。

你可以从世界各地的零售店里购买到Android设备。目前,大多数移动用户通过他们的移动运营商获得带有价格补贴的设备。运营商只在用户接受语音和数据服务合约的条件下,为用户提供带有价格补贴的设备。不愿意受限于某一个运营商的用户也可以自己从消费类电子产品商店或在线购买Android设备。在一些国家,谷歌在他们的在线商店Google Play上销售Nexus系列产品。

1. 谷歌Nexus

Nexus系列是谷歌公司智能移动设备的旗舰系列,产品主要包括智能手机和平板电脑。每台设备都是由不同的与谷歌拥有密切伙伴关系的原始设备制造商(OEM)所生产。它们通过Google Play在线商店以无锁版形式出售,非常方便用户更换运营商以及在旅行时使用。迄今为止,谷歌已与HTC、三星、LG和华硕合作生产过Nexus智能手机和平板电脑。图1-2所示为最近几年发布的一些Nexus设备。

Nexus设备的目的是为新的Android版本提供一个参考平台,因此在一个新的Android版本发布后,谷歌会很快自己更新Nexus设备。作为开发者的开放平台,这些设备拥有解锁后的引导装载程序,从而允许刷上定制Android编译链接版本,并且得到Android开源项目(AOSP)的支持。谷歌也提供原厂ROM镜像,这些镜像是二进制固件镜像,可以将设备系统刷回未经修改的原始状态。

Nexus设备的另一个好处是,它们提供了纯粹的谷歌体验,这意味着用户界面没有被修改过的痕迹,而是从AOSP编译过来原厂Android中的用户接口。Nexus设备中也带有一些谷歌专有应用,比如Google Now、Gmail、Google Play、Google Drive和Hangouts等。

{%}

图 1-2 谷歌Nexus设备

2. 市场份额

智能手机市场份额的统计数据往往因数据源而异。数据源有很多,其中包括ComScore、Kantar、IDC和Strategy Analytics等。通过对这些数据源的统计数据进行全面观察,会发现Android的市场份额在大多数国家中都呈增长态势。根据一份由Goldman Sachs发布的报告,Android在2012年年末的全球计算市场上处于首位。StatCounter公司发布的GlobalStats报告(http://gs.statcounter.com/)显示,Android在2013年11月在移动操作系统市场中排名第一,拥有全球41.3%的市场占有率。尽管存在着一些细微的差异,但是所有的数据源看起来都认同Android目前正在统治移动操作系统市场。

3. 发行版的采纳

并不是所有Android设备上都运行着相同的Android版本。谷歌定期发布一个统计报表(dashboard),给出运行每个Android版本的设备所占的相对百分比。这些信息是基于访问Google Play的日志收集统计的,而Google Play则在所有经过批准的设备中都存在。要了解最新的统计报表,可访问链接:http://developer.android.com/about/dashboards/。此外维基百科也包含了一个图表,能够显示在一定时期内汇总的统计数据。图1-3显示了撰写本书时的最新图表,其中包含了从2009年12月至2013年2月的数据。

如图1-3所示,Android的新版本有着一个相对缓慢的采纳周期,需要超过一年的时间才能让一个新版本在90%以上的设备上运行。你可以在1.3节中阅读到关于这一问题的更多细节,以及Android所面临的更多其他挑战。

{%}

图 1-3 Android版本分布的历史情况

1.1.4 主体开源

AOSP是谷歌和手机开放联盟(OUA)其他会员对开放性承诺的表现形式。作为AOSP的基石,Android操作系统是构建于许多不同开放源代码项目组件之上的,其中包含许多程序库、Linux内核、一个完整的用户接口和一些应用程序等。所有这些软件组件都拥有开放源代码倡议(OSI)所认证的版本许可协议。大多数Android的源码是基于Apache软件许可协议V2.0版本而发布的,你可以通过http://www.apache.org/licenses/LICENSE-2.0获取到这份协议条款。但是也存在着一些例外情况,主要包括一些上游项目,是Android所依赖的一些外部开源项目。两个例子是以GPLv2软件许可协议发布的Linux内核代码,以及使用BSD族软件许可协议的WebKit项目。AOSP源代码库将所有这些项目都聚集在一处。

尽管Android软件栈的绝大部分是开源的,但是最终的消费设备中会包含多个封闭源代码的软件组件。甚至谷歌官方的旗舰产品线Nexus系列设备中也包含着专有的二进制软件。例子包括引导装载程序、外设固件、无线电组件、数字权限管理(DRM)软件和一些应用程序。许多软件仍然保持封闭源代码,以努力保护知识产权。然而,保持它们封闭源代码也阻碍软件的互联互通,使得开发社区的移植工作更具挑战性。

此外,许多尝试参与Android代码开发的开源爱好者发现,Android并不是完全开放式地开发。有证据表明,谷歌开发Android很大程度上是以秘密的方式进行的。代码更改不会马上提供给公众,与之相反,开源发布伴随着新版本发布进行。但尽管这样,好几次开源代码也并没有在发布时公开。事实上, Android的Honeycomb版本(3.0)的源代码直到Ice Cream Sandwich(4.0)源代码发布后才最终公布,另外,Ice Cream Sandwich的源代码直到版本发布差不多一个月之后才公开。像这样的事件不仅违背了开放源代码的精神,也违背了Android的两个既定目标:创新性和开放性。

1.2 了解Android的利益相关者

了解Android生态圈中到底有哪些利益相关者是非常重要的,这不但可以提供不同的视角,还可以让人们理解谁负责开发支持不同组件的代码。本节将审视主要的Android利益相关者群体,包括谷歌、硬件厂商、移动通信运营商、开发者、用户和安全研究人员,探讨每类利益相关者的目的与动机,并分析他们是如何相互关联的。

每个群体都属于一种不同的产业领域,在Android生态圈中承担着不同的角色。谷歌推动了Android的诞生,开发核心的操作系统,并管理Android品牌。硬件加工厂商制造了底层的硬件部件与外围设备。原始设备制造商(OEM)则制造了终端用户设备,将不同的部件组装在一起,进而形成完整的设备。移动通信运营商为移动设备提供了语音和数据访问服务。一大批开发者,包括那些被其他群体雇用的程序员,在众多项目中一起工作,共同塑造着Android生态圈。

图1-4显示了Android生态圈主要利益相关者群体之间的关系。

{%}

图 1-4 生态圈关联关系

这些关系表明了在制造或升级一个Android设备时各方的关联情况。正如图1-4所清晰显示出的,Android生态圈非常复杂。这些业务关系极难管理,同时还会变得更加复杂。关于这一点,本章稍后再进行讨论。在研究这些问题之前,先来详细讨论每一个群体。

1.2.1 谷歌

作为将Android引入市场的公司,谷歌在该生态圈中拥有几个关键角色。它的责任包括法务管理、品牌管理、基础设施管理、内部开发,以及支持外部开发等。通过与合作伙伴的紧密合作,谷歌创建了Nexus产品系列,并且通过这种做法达成了一些必要的商业协议,进而确保了一些重要的Android设备能及时推向市场。正是由于谷歌在所有这些事务上所表现出的超强执行力,才造就了Android对消费者的吸引力。

首先最重要的是,谷歌拥有并管理Android品牌。除非所生产的设备达到谷歌的兼容性要求(这些要求的细节将在1.3.2节中详细描述),否则OEM不能给设备贴上Android品牌,或者提供对Google Play商店的访问。由于Android是开源的,所以对谷歌来说,强制实施兼容性是其能对其他利益相关者产生影响力的少数几个途径之一。如果没有它,谷歌将基本无力阻止Android品牌被合作伙伴无意或有意地破坏。

谷歌的下一个角色则涉及支持Android设备的软硬件基础设施。支持Gmail、日历、联系人及其他许多应用的服务都是由谷歌提供的。此外,谷歌还运营着Google Play应用商店,其中包括以图书、杂志、视频、音乐等各种形式分发的富媒体内容,发行这些内容需要与世界各地的发行公司签订授权协议。此外,谷歌还在自己的数据中心维护着许多物理服务器来支持这些服务,为AOSP提供许多关键服务,比如托管AOSP源代码,提供原厂镜像下载及二进制驱动下载,提供问题跟踪服务器以及Gerrit代码审查工具等。

谷歌也负责监督Android核心平台的发展。在公司内部,谷歌将Android项目视作一个全面的产品开发运营部,在谷歌内部开发的软件包括操作系统内核、一组核心应用以及一些可选的非核心应用。如前所述,谷歌一直在为未来的Android版本秘密地开发一些创新与增强功能,谷歌的工程师使用对设备厂商、运营商和第三方开发者不可见的内部开发树。当谷歌决定发布新版本时,它才同时公布原厂镜像、源代码和应用程序编程接口(API)文档,它也通过空中下载(OTA)分发渠道推送更新。在AOSP发布之后,每个人都可以克隆它,然后开始在最新发布的版本上开始自己的工作,构建自己的版本。这种隔离开发方式使开发者和设备制造商得以专注于一个版本,而无需跟踪谷歌内部团队的未完成工作。尽管有这个好处,但这种封闭的开发模式还是对AOSP作为一个开源项目的声誉产生了损害。

谷歌的另一个角色是培养一个开放性的基于Android平台的开发社区,谷歌为第三方开发者提供开发工具套件、API文档、源代码、编码风格指导等信息。所有这些努力都有助于在大量第三方应用中建立有凝聚力、一致的用户体验。

通过承担这些角色,谷歌确保了Android作为品牌、平台和开源项目的充分活力。

1.2.2 硬件厂商

操作系统的目标是管理设备中所连接的硬件并向应用提供服务。毕竟,如果没有硬件,Android操作系统也不可能有什么用。现在的智能手机的硬件都是非常复杂的,在如此小巧的外形要求和大量外设的情况下,配置所需的硬件是一项相当复杂的工程。为了更好地观察这一群体中的利益相关者,下面几小节中将硬件厂商分为三个子群体,他们分别制造中央处理器(CPU)、系统芯片(System-on-Chip)与移动设备。

1. CPU制造商

尽管Android应用是与处理器无关的,但原生二进制文件的情况却并非这样。原生二进制文件会针对特定设备所使用的特定处理器进行编译。Android是基于Linux内核的,而Linux是可移植的,并且还支持多种处理器架构。同样,Android的原生开发套件(NDK)所包含的工具可用于在Android支持的所有应用处理器架构上开发用户空间原生代码。Android支持的处理器架构包括ARM、Intel x86和MIPS。

由于功耗低,ARM架构已经成为移动设备中最广泛使用的处理器架构。ARM公司(ARM Holdings)不像其他的微处理器厂商一样自己制造CPU,他们仅以知识产权的方式授权技术。ARM公司提供了多种微处理器核心设计,其中包括ARM11、Cortex-A8、Cortex-A9和Cortex-A15,现在的Android设备上所用的设计通常都支持ARMv7指令集。

2011年,英特尔宣布与谷歌合作,为Android提供对英特尔处理器的支持。以Medfield平台为基础的Atom处理器成为Android支持的第一个英特尔平台。此外,英特尔启动了Android on Intel Architecture(Andorid-IA)项目,这一项目基于AOSP,为英特尔处理器上的Android提供代码支持。Android-IA项目网站https://01.org/android-ia/是为系统与平台开发者提供的,而英特尔Android开发者网站http://software.intel.com/en-us/android/则是面向应用开发者的。目前市场上已经有一些基于英特尔平台的智能手机,这些手机中包括一个英特尔专有的二进制翻译器,称为libhoudini。libhoudini能让ARM处理器构建的应用直接运行在基于英特尔平台的设备上。

MIPS科技公司为它的MIPS架构和微处理器核心设计提供授权。2009年,MIPS科技公司将谷歌的Android操作系统移植到MIPS处理器架构上。从那时起,有几个设备制造商已经启动了运行在MIPS处理器上的Android设备项目,特别是针对机顶盒、媒体播放器和平板电脑。MIPS科技提供了Android移植的源代码以及其他一些开发资源,详见http://www.imgtec.com/mips/developers/mips-android.asp

2. 系统芯片制造商

系统芯片(System-on-Chip,SoC)指的是包含CPU核心、图形处理单元(GPU)、随机存取内存(RAM)、输入/输出(I/O)逻辑单元等的单个芯片,它有时还会包含更多的处理器,例如,在智能手机上使用的系统芯片很多都包含基带处理器。目前,移动通信行业的大多数系统芯片都含有一个以上的CPU核心。将组件都集中在单一芯片上有助于降低制造成本和功耗,造就更小更高效的设备。

如前所述,基于ARM架构的设备统治了Android设备大家庭。在ARM设备中,主要使用4个主要的系统芯片家族:德州仪器的OMAP、英伟达的图睿(Tegra)、三星的猎户座(Exynos),以及高通的骁龙(Snapdragon)。这些系统芯片制造商从ARM公司获得CPU核心设计的授权,你可以从ARM的官方网站上获得其授权厂商的完整列表:http://www.arm.com/products/processors/licensees.php。除了高通,其他系统芯片制造商都直接使用了ARM的设计而没有作修改。然而高通却付出了额外的努力来优化,以降低功耗、提升性能和改善散热。

每个系统芯片都融入了不同的部件,因而需要Linux内核不同的支持。其结果是,需要在Git库中单独跟踪每个系统芯片的开发版本。每棵代码树中都拥有系统芯片特有的代码,包括驱动程序和配置。有几次,这种分离状态导致安全漏洞被引入某个系统芯片特有的内核源码库中。这种状况正是造成Android生态圈复杂性的关键因素之一,这一点我们将在1.3节中详细讨论。

3. 设备制造商

设备制造商,包括原始设计提供商(ODM)和原始设备制造商(OEM),他们设计和制造供消费者使用的产品。他们决定将哪些硬件和软件集成到最后的设备中,并需要照顾到所有必要的整合。他们选择要组合在一起的硬件组件、设备外形尺寸、屏幕尺寸、设备材质、电池、摄像头、传感器和无线电(Radio)等。通常设备制造商会与系统芯片制造商合作完成整个产品系列。大多数选择的依据是开发具有市场差异性的新设备、针对特定客户群或建立品牌忠诚度。

在开发新产品时,设备制造商必须采用能够在新硬件上良好运行的Android平台。这个任务包括添加新的内核设备驱动程序、专有程序和用户空间程序库。此外,OEM经常对Android进行定制修改,特别是在Android框架层。为了遵守Android内核的GPLv2许可证,OEM被迫开放内核源代码。然而,Android框架层是Apache 2.0授权许可,它允许修改仅以二进制的形式发布而不需发布源代码。这也是绝大多数厂商试图通过创新来让自己的产品区别于其他产品的地方,例如,HTC和三星对用户界面(UI)的修改版本Sense和Touchwiz主要在Android框架层实现。这些修改是一些争议的焦点,因为它们导致了Android生态圈中一些复杂的安全相关问题。例如,定制引入了新的安全问题,你可以在1.3节中阅读到更多关于这些复杂性的讨论。

1.2.3 移动通信运营商

除了提供移动语音和数据服务外,移动通信运营商还和设备制造商达成紧密的合作,为他们的客户提供附带补贴的手机。而从运营商渠道得到的手机通常带有运营商定制的软件版本。这些版本往往在开机画面中有运营商的Logo,预配置了APN(接入点名称)网络设置,修改了默认的浏览器主页和浏览器书签,并预装了大量应用。绝大多数时候,这些修改会被嵌入系统分区,因而难以移除。

除了对设备固件进行定制外,移动通信运营商也有自己的质量保证(QA)测试流程。据报道,这些QA流程非常漫长,从而造成软件更新缓慢。我们常常看到,OEM已经修补了它自己的非定制设备中操作系统的一个安全漏洞,而运营商定制的设备中这一漏洞仍然会存在很长时间。直到更新被分发到运营商设备时,这些合约机用户才可能得到更新。运营商定制的设备在上市一段时间(通常是12~18个月)后就会停产。一些设备可能停产得更快,极少数情况下甚至在上市之后立即停产。在停产之后,仍然使用这款设备的用户就不会再得到任何更新,无论手机是否存在安全问题。

1.2.4 开发者

作为一个开放源码的操作系统,Android是一个可以让开发者自由发挥的理想平台。谷歌的工程师并不是唯一为Android平台贡献代码的人。有很多个人开发者和实体以他们自己的名义为AOSP贡献代码。向AOSP贡献的任何代码(无论是来自谷歌还是来自第三方)都必须使用相同的代码风格,并通过谷歌的源代码审查系统Gerrit。在代码审查过程中,谷歌公司的某位员工会决定是否采纳这些修改。

在Android生态圈中,并非所有的开发者都为操作系统本身构建组件,人数最多的一类开发者是应用开发者。他们使用Android平台提供的软件开发工具包(SDK)、框架层与API来构建应用,使最终用户能够实现自己的目标,无论这些目标是满足生产力、娱乐或其他需求。

最终,开发者是受应用的流行度、声望和资金收益驱动的,Android生态圈中的应用商店为开发者提供了收入分成的激励。例如,广告网络会为在应用中嵌入的广告付费。为了最大化自身收益,应用开发者在维护声望与信誉的同时尽量让自己的应用变得流行;有了一个良好的口碑,又可以反过来让应用日益流行。

定制ROM

与制造商对Android平台引入修改的方法相同,世界各地的爱好者社区也开发了一些定制固件(通常被称为ROM)项目。其中最流行的Android定制固件项目是CyanogenMod,其2013年12月的活跃装机量达到了950万。它基于Android的官方发布版本开发,并引入了一些原生和第三方代码。这些社区修改的Android版本通常包括性能优化、界面增强、功能改进和一些配置选项,而这些通常不会在随设备发布的官方固件中找到。遗憾的是,这些ROM往往缺少广泛深入的测试与质量保证。此外,与OEM的情况类似,在定制ROM中的修改也可能会引入额外的安全性问题。

从历史上看,设备制造商和移动通信运营商对第三方的ROM开发往往不予支持。为了防止用户使用定制ROM,他们设置了一些技术障碍,比如锁定引导加载程序(boot loader)或NAND加锁。然而,定制ROM已经变得更受欢迎,因为它们能够为那些不再获得官方更新的老旧设备提供持续支持。正因为如此,制造商和运营商已经软化了对待非官方固件的态度,随着时间的推移,一些厂商已经开始出厂引导加载程序未加锁或者可解锁的设备,与Nexus设备类似。

1.2.5 用户

如果没有庞大的用户群支持,Android就不会发展出如今繁荣的社区。虽然每个用户都有其独特的需求和欲望,但是他们还是可以分成三类:一般消费者、高级用户和安全研究人员。

1. 消费者

由于Android是最畅销的智能手机平台,终端用户可以从大量设备中挑选。消费者希望有一个多功能设备,能够拥有个人数字助理(PDA)功能、拍照、GPS导航、上网、音乐播放、电子书阅读等功能,以及一个完整的游戏平台。消费者通常会想提高效率,保持条理性,与生活中的人进行联系,在外出时玩游戏,以及从互联网上获取信息。在所有的这些需求之上,他们期望能有一个合理水平的安全性和隐私保护。

Android的开放性和灵活性对于消费者也是显而易见的。官方渠道可供选择的应用如此之多,官方渠道以外来源的应用也不计其数,这都直接归功于开放的开发者社区。此外,消费者还可以安装第三方的启动器、主屏幕窗口小部件、新的输入法,甚至是全系统的定制ROM。这样的灵活性和开放性常常是消费者决定从同类智能手机操作系统中选择Android的决定因素。

2. 高级用户

第二类用户是一种特殊类型的消费者,本书将之称为高级用户。高级用户希望能用到设备现有功能之外的功能,比如,希望能够在设备上启用Wi-Fi热点共享(Wi-Fi tethering)的用户就属于这一类。这些用户比较熟悉他们设备的高级设置,并知晓设备的限制。他们更容易接受对Android操作系统进行非官方修改造成的风险,包括运行可公开下载的漏洞利用(exploit)代码来获取设备的root访问权限。

3. 安全研究人员

你可以将安全研究人员看作高级用户的一个子集,但他们有着额外的要求与不同的目标。这些用户可能受名声、财富、知识、开放性、保护系统或以上某几种的组合所驱动。无论动机如何,安全研究人员的目标都是发现Android系统中的未知安全漏洞。获得设备的完全控制权会使这类研究变得容易得多,因此当设备不提供特权访问时,研究人员通常会首先寻求获得特权访问的方法。即便有了完全访问权限,这类工作仍然是具有挑战性的。

实现安全研究人员的目标需要深厚的技术知识。要想成为一名成功的安全研究人员,需要对编程语言、操作系统内部和安全概念有深刻的理解。大多数安全研究人员能够使用多种编程语言开发、阅读与编写代码。在某些意义上,这也让安全研究人员成为了开发社区成员。对他们而言,花时间深入研究安全概念,理解操作系统内部原理,以及获取技术前沿信息都是非常普遍的事情。

安全研究人员的生态圈群体是本书最主要的目标读者。本书的目标是为他们中的初学者提供基础知识,也为已入门的研究人员提供深入的知识。

1.3 理解生态圈的复杂性

OHA(开放手机联盟)几乎囊括了所有主要的Android厂商,但其中一些群体却有着不同甚至相互竞争的目标。这导致制造商之间会产生各种各样的合作关系,然后带来了一些大规模的跨组织官僚主义。比如说,三星的内存制造部门是世界上最大的NAND闪存制造商,大约占有40%的市场份额,却也为三星手机部门的竞争对手生产DRAM(动态随机存取存储器)和NAND内存。另一个争议是,虽然谷歌没有直接从Android设备的销售中获利,但微软和苹果却已经成功起诉Android手机制造商,并向他们收取专利使用费。不过,这仍不是困扰Android生态圈的复杂性的全部。

除了法律纠纷和一些难以相处的合作关系,Android生态圈还面临着其他几个非常严重的问题。在硬件和软件中同时存在的碎片化造成了一些复杂性,而其中只有部分问题被谷歌的兼容性标准解决了。对于所有的生态圈利益相关者来说,更新Android操作系统仍然是一个重大的挑战。对开源代码的强烈依赖又让软件更新问题进一步复杂化,也让已知漏洞的暴露度变得更高。安全研究社区中的成员面临着安全性和开放性之间的选择困境,而这种困境会进一步影响到其他的利益相关者,导致了糟糕的漏洞披露事件记录。以下各节将详细讨论这些问题领域。

1.3.1 碎片化问题

大量Android设备设计上的差异导致了Android生态圈的碎片化问题严重。Android的开放性使得它非常适合制造商基于该平台设计和制造自己的设备。结果是,设备池(即设备1.1节中的“设备家族”)是由许多不同的制造商所制造的不同设备所组成的,每个设备又由各式各样的软硬件组成,其中包括OEM和移动通信运营商的修改。甚至对于同一款设备而言,在不同运营商或用户那里,Android的版本都是不同的。由于所有这些差异,消费者、开发者和安全研究人员始终要面对并解决碎片化问题。

尽管碎片化问题对消费者的影响相对较小,但是它已经对Android的品牌造成了轻微的损害。习惯使用三星的消费者如果改用HTC的设备,经常会遇到令人不快的体验。由于三星和HTC都高度定制了他们设备上的用户体验,从而使得用户不得不花一些时间重新熟悉他们的新设备。这种情况同样也出现在长期使用Nexus设备的用户换上OEM品牌设备时。随着时间的推移,消费者可能会对这个问题感到厌倦,进而会决定改用体验更加统一的平台。不过,尽管如此,碎片化问题的影响还是相对较小的。

比起消费者,应用开发者受碎片化问题的困扰就显得更大了。问题主要源于开发者试图支持设备池中大部分设备(包括运行在设备上的各种软件)。对所有设备进行测试,不仅成本高昂而且耗时。虽然模拟器有所帮助,但这并不能真实再现用户在实际使用中遇到的问题。开发者必须处理的问题包括:不同的硬件配置、API级别、屏幕尺寸以及外设可用性等。三星的Android设备共有超过15种屏幕尺寸,从2.6英寸到10.1英寸不等。此外,HDMI(高保真多媒体接口)软件狗和谷歌电视设备都没有触摸屏,因此需要有专门的输入方案和用户界面(UI)设计。处理所有这些碎片化问题并不是简单的事情,所幸谷歌为开发者提供了一些辅助工具。

通过尽力隐藏碎片化问题,开发者得以开发出在某种程度上能够良好地应用于不同设备的应用。为了应对不同的屏幕尺寸,Android的UI框架允许应用查询设备的屏幕尺寸,如果应用设计得当, Android还可以自动调整应用的界面元素和UI布局,使之适应这款设备。Google Play商店也允许应用开发者在应用中声明配置要求,以便处理不同硬件配置的问题。比如,当某一应用需要触摸屏,而当前设备又没有触摸屏时,那么在Google Play商店中查看这个应用时,页面上就会显示该应用不支持这款设备,并提示不能安装。Android应用支持库也会透明地处理一些API级别的差异。然而,尽管拥有如此多的可用资源,兼容性问题依然存在。而这些极端问题都留给了开发者,往往会让开发者深受折磨。同样,这也会招致开发者的鄙弃,从而削弱Android生态圈。

对于安全性而言,碎片化问题既有正面又有负面的影响,这主要取决于你是从攻击者还是防守者的角度来看待这个问题。尽管攻击者可能会轻易地在一款设备上找到可利用的安全漏洞,但是这些问题在另一家制造商的设备上可能并不存在。这使得攻击者很难找到能够影响生态圈中大部分设备的安全缺陷。即便有人发现了这样一种安全缺陷,设备之间的差异也让漏洞利用(exploit)代码开发变得极为复杂。在很多情况下,开发(对于所有设备上的所有Android版本都适用的)通用漏洞利用代码是不可能的。对安全研究人员来说,一次复杂的安全审核可能不仅需要对所有设备进行审查,还需要分析这些设备的每一个软件版本。显然这是一个难以完成的任务。如果专注于某一款设备,虽然更容易实施攻击,但不足以影响到整个生态圈。在一个设备上存在的攻击面,可能在另一设备上就根本不存在。另外,有些组件更加难以进行安全审核,比如某些设备上存在的特有闭源软件。由于存在这些挑战,碎片化问题让安全审核师的工作更加困难,同时也有助于防止大规模安全事故的发生。

1.3.2 兼容性

设备制造商面临的一个复杂性问题就是兼容性。作为Android的创始者,谷歌负责保护Android品牌。其中包括防止碎片化,并确保消费者的设备符合谷歌的愿景。为确保设备制造商遵守由谷歌设置的软硬件兼容性要求,谷歌公司发布了兼容性文档和测试套件。任何制造商要想在Android品牌下制造设备,就必须遵循这些指导原则。

1. 兼容性定义文档

Android的兼容性定义文档(CDD)详见http://source.android.com/compatibility/,其中列举了Android“兼容”设备的软硬件要求。对于其中的有些硬件,所有的Android设备都必须采用。例如,Android 4.2的CDD指定,所有的设备实现中都必须包括至少一种音频输出形式,以及一种或多种数据传输速率在200kbit/s或更高的网络连接,而具体采用哪些外设则由设备制造商来决定。如果某些外设被包括在内,CDD还指明了一些额外的要求。例如,如果设备制造商决定添加一个后置摄像头,那么这个摄像头的分辨率不得低于200万像素。设备必须满足CDD的要求才能戴上Android这顶“帽子”,并要在出厂前预装上谷歌的应用和服务。

2. 兼容性测试套件

Android兼容性测试套件(CTS)是一款自动化测试工具,该工具从台式机到连接的移动设备执行单元测试。CTS测试将集成到一种持续的构建系统中,工程师将用这种构建系统来构建为谷歌所认证的Android设备。它的目的是尽早揭示出兼容性问题,以确保软件在整个开发过程中保持统一的兼容性。

正如前面提到的那样,OEM往往会深度修改Android框架层的代码。CTS工具可以确保指定版本平台的API不被修改,即使经过厂商的修改之后。这确保了无论是谁生产的设备,应用开发者都拥有一致的开发体验。

在CTS中进行的测试都是开源的,而且自2011年5月以来一直在不停地发展。CTS中包含了一个名为security的测试目录,该目录集中了对安全问题的测试。可以在AOSP主代码树中看到当前的安全测试用例:https://android.googlesource.com/platform/cts/+/master/tests/tests/security

1.3.3 更新问题

毫无疑问,Android生态圈中最重要的复杂性问题当属对软件更新(尤其是安全补丁)的处理。由于受到生态圈几个复杂性问题的影响,这一问题变得更加棘手。其中包括第三方软件、OEM定制、移动通信运营商参与、不同的代码所有权等。上游开源项目安全问题、部署操作系统更新的技术挑战、缺少后向移植机制(back-porting)以及瓦解的联盟等问题是目前的焦点。整体而言,这是导致目前Android生态圈中存在着大量不安全设备的主要原因。

1. 更新机制

这个问题的根源在于Android系统中存在着多个更新软件的渠道。更新应用与更新操作系统有所不同,应用开发者可以通过Google Play商店来部署对应用安全漏洞的更新补丁——无论这个应用是由谷歌、OEM、运营商,还是由独立开发者编写的。与之相反,修补操作系统中的一个安全缺陷则需要部署一次固件升级或OTA更新。创建和部署这类更新的流程甚为艰巨。

例如,考虑在核心Android操作系统中修补一个安全缺陷。要修补这一安全问题,首先需要谷歌修补它,然后事情就开始变得棘手,并且依赖于具体设备。对于Nexus设备,可以直接将更新后的固件推送给终端用户。然而,如果要更新OEM品牌的设备,则还需要OEM开发一个包含谷歌补丁的系统版本。当然,这里还有一种特殊情况,即OEM可以直接把更新后的固件推送给未锁定设备的终端用户。对于运营商补贴的设备,运营商必须先准备好含有补丁的定制版本,然后分发给它的客户群。即使在这个简单的例子中,操作系统安全漏洞的更新路径也远比应用更新复杂。此外,还可能会发生与第三方开发者或底层硬件制造商相关的其他问题。

2. 更新频率

前面提到,Android新版本的推行速度相当慢。事实上,该问题已经好几次激起公愤。2013年4月,美国公民自由联盟(ACLU)向美国联邦贸易委员会(FTC)提起投诉,称美国的四家主要移动运营商并没有为他们所售出的Android智能手机提供及时的安全更新。他们进一步指出,即便谷歌已经发布了安全漏洞补丁,运营商仍然没有及时提供安全更新。不能及时地安装安全更新,Android就无法成为一种成熟且安全的操作系统。毫无疑问,人们正在期待政府对这种问题采取一定的行动。

漏洞报告、补丁开发和补丁实施之间的时间间隔也很长。漏洞报告和补丁开发之间的时间间隔通常比较短,一般耗时几天或几周。然而,从补丁开发,到将补丁部署在终端用户设备上,整个时间周期就可能要从几周到几个月不等,甚至根本就不会有补丁实施。依不同的安全漏洞而异,整个修补周期会涉及生态圈中多方利益相关者。遗憾的是,终端用户最终会为设备上所存在的漏洞埋单。

对于Android生态圈中所有的安全补丁来说,复杂性对它们的影响是不同的。举例来说,应用由它们的作者直接更新。应用开发者及时推出更新的能力使过去几个安全漏洞得以快速修复。此外,谷歌也证明了他们可以在一个合理的时间段内为Nexus设备部署固件更新。最后,高级用户有时会自己承担风险来给自己的设备打补丁。

通常,谷歌会在发现漏洞几天或几周内,即开始修补AOSP主代码树中的安全漏洞。在这之后,OEM才可以把这些“补丁”应用到其内部代码树中。然而,OEM在应用补丁时往往动作缓慢。没有贴牌的设备通常会比运营商贴牌设备更快得到更新,因为它们无须经过运营商定制和运营商的审批程序。运营商设备通常需要几个月才能得到安全更新,或者永远也得不到更新。

3. 后向移植

术语“后向移植”指的是将当前软件版本的补丁应用至一个较旧的版本上。在Android生态圈中,对安全补丁进行后向移植的情况几乎不存在。考虑这样一个假想的场景,Android的最新版本是4.2;如果一个安全漏洞被发现影响了Android 4.0.4及以后版本,谷歌只会在4.2.x及以后版本中修复这个漏洞,而之前版本(如4.0.4和4.1.x)的用户肯定将面临长期的安全风险。我们相信,如果发生大范围的攻击事件,可以对安全补丁进行后向移植。然而到本书写作之时,还没有对这种攻击的公开报道。

4. Android更新联盟

2011年5月,在Google I/O大会上,Android的产品经理Hugo Barra宣告了Android更新联盟的成立。这一举措的既定目标是鼓励合作伙伴们作出承诺:在官方版本发布后18个月内更新他们的Android设备。这个更新联盟由HTC、LG、摩托罗拉、三星、索尼爱立信1、AT&T、T-Mobile、Spint、Verizon和Vodafone公司共同创立。遗憾的是,在这次声明之后,再也没有人提起过Android更新联盟。时间已经证明,开发新的固件版本,老旧设备的安全问题,最新发布硬件所带来的问题,以及在新版本上的测试与开发问题等,都对及时更新版本造成阻碍。对那些销售不好的设备,这个问题会特别严重,因为运营商和制造商再也没有动力对此有所投入。

12012年2月15日,索尼公司全数收购爱立信公司所持有的索尼爱立信股份,并将索尼爱立信更名为“索尼移动通信”,品牌改为“索尼”(Sony)。——编者注

5. 更新的依赖关系

紧跟上游的开源项目是一项繁重的任务,在Android生态圈中更是如此,因为补丁的生命周期拉得很长。例如,Android框架层中包含了一个Web浏览器引擎WebKit,好几个其他项目也都使用这个引擎,包括谷歌自己的Chrome浏览器。Chrome浏览器有着一个短到令人敬佩的补丁生命周期,更新频率大概保持在几周左右。与Android不同,Chrome浏览器还有一个非常成功的安全漏洞奖励计划,即谷歌会在每次更新补丁时对安全漏洞的发现者进行奖励并对安全漏洞予以公开披露。遗憾的是,在Chrome浏览器中发现并得到修补的安全漏洞很多依然存在于Android代码中。这些漏洞经常被称为half-day漏洞。这个术语是从half-life(半衰期)演变而来的,半衰期用于测量放射性元素的衰变速度。类似地,half-day漏洞也在衰变。令人痛心的是,当它衰变时,Android用户都暴露在利用这类漏洞的攻击风险中。

1.3.4 安全性与开放性

Android生态圈中一个最为深刻的复杂性在于高级用户与有着较高安全意识厂商之间的关系。高级用户想要并且需要不受阻碍地访问他们的设备。第3章会讨论这些用户动机背后的理念。与此相反,一款非常安全的设备符合供应厂商和日常最终用户的最大利益。高级用户与厂商的不同需求为研究者提供了非常有趣的问题。

作为所有高级用户的一个子集,安全研究人员面临着更具挑战性的决定。当研究人员发现安全问题后,他们必须决定如何处理这些信息。是向供应商报告这些问题,还是应该公开披露?如果研究人员报告了问题,供应商进行了修补,那就可能会阻碍高级用户获得他们所期望的完全控制权。最终,每个研究人员的决定是由各自的动机驱动的。例如,当存在一个公开可行的能够获取完全访问权限的方法时,研究人员通常会隐瞒这种安全漏洞。这么做可以确保在厂商修补已披露的漏洞后,他们仍能进行必要的访问。这也意味着,这些安全问题仍然未得到修补,恶意攻击者仍会利用这些漏洞。在某些情况下,研究人员会选择公布经过深度混淆的漏洞攻击代码,这样让厂商难以发现被利用的安全漏洞,而高级用户也可以更长时间地使用这些漏洞攻击。很多时候,这些漏洞攻击代码中使用的安全漏洞只有在对设备进行物理访问时有用,这也有助于平衡两大利益相关者群体各自具有冲突性的需求。

厂商也在努力地在安全性和开放性之间寻求平衡。所有的厂商都希望满足客户需求。前面提到过,厂商修改Android是为了取悦用户,并试图差异化自己的产品。Bug可能会在这个过程中被引入,从而有损整体的安全性。厂商必须决定是否作出这样的修改。另外,厂商在卖出设备后要承担设备的质保。然而高级用户的修改会让系统变得不稳定,从而导致了一些原本不必要的技术支持。保持技术支持的低成本以及防止欺诈性的保修更换显然更符合厂商们的最大利益。为了处理这些问题,厂商采取了引导加载程序锁定机制。遗憾的是,这些机制也让有技术能力的高级用户难以修改他们的设备。出于妥协,许多厂商会向终端用户提供解锁设备的方法。你可以在第3章中阅读到更多有关的方法。

1.3.5 公开披露

最后要提及的一项复杂性跟安全漏洞的公开披露或声明有关。在信息安全领域,这些公告的作用在于提醒系统管理员和精明的消费者更新软件以消除已有漏洞。有几个指标(包括是否充分参与了安全漏洞披露过程)可以用来衡量一个厂商的安全成熟度。遗憾的是,这样的披露在Android生态圈中是极其罕见的。这里我们记录了已知的几次公开披露,并探讨如此发生的可能原因

2008年,谷歌在Google Groups中启用了android-security-announce邮件列表,但很遗憾,这个邮件列表仅包含一个介绍列表的帖子。你可以查看这个帖子,网址是https://groups.google.com/d/msg/android-security-announce/aEba2l7U23A/vOyOllbBxw8J。在这个帖子发布之后,甚至没有一个正式的官方公告。于是,跟踪Android安全问题的唯一方法是阅读AOSP的修改日志,跟踪Gerrit的修改记录,或者从Android问题跟踪服务器(https://code.google.com/p/android/issues/list)上大海捞针。这些方法都非常消耗时间,而且容易出错,因此不太可能成为安全漏洞评估的最佳实践。

尽管目前尚不清楚为何谷歌没能坚持发布安全性公告,但可能存在以下几个原因。一种可能性是担心这种做法会更大程度地暴露Android生态圈中的安全漏洞。基于此,可能谷歌也认为公开披露已修补的安全漏洞是不负责任的。但是许多安全专家(包括笔者)都认为,通过这种途径披露安全漏洞所造成的危险远比让漏洞自己逐步曝光要小得多。另一种可能性则涉及谷歌与设备制造商、运营商的复杂合作关系。很容易理解,披露一个仍然在业务合作伙伴产品中存在的安全漏洞,可能会被视为不友好的举动。如果是这种情况,那就意味着谷歌将业务关系的优先级摆在了公众利益之上。

撇开谷歌不论,很少有厂商会对安全漏洞进行公开披露。许多OEM都完全避免公开披露,甚至回避媒体关于热点安全漏洞的问询。例如,HTC尽管在上张贴了披露政策,但却从未公开披露过任何安全漏洞。在少数情况下,运营商会提到在他们的更新中包含了“重要的安全补丁”——他们几乎不会引用安全问题的CVE(通用漏洞与披露)编号。

CVE项目旨在创建一个集中的、标准化的安全漏洞跟踪编号。安全专业人员,特别是安全漏洞研究专家,会使用这些编号来跟踪软件或硬件中的安全问题。使用CVE编号极大地提升了跨越组织边界识别与讨论同一个安全问题的能力。接受CVE项目的公司通常会被认为是非常成熟的企业,因为他们意识到了在产品中记录和分类安全漏洞的必要性。

在利益相关者中的厂商这一边,已经有一家公司站出来认真地对安全漏洞进行公开披露,这就是高通公司。高通公司通过Code Aurora论坛公开披露漏洞。这个小组由几家服务移动无线业界的厂商联合成立,由高通公司运营。Code Aurora网站提供了安全公告页面(https://www.codeaurora.org/projects/security-advisories),其中包含了关于安全问题与CVE编号的详细信息。这种安全成熟度应该是其他利益相关者学习的榜样,这样才能让Android生态圈的整体安全性得到提升。

总体而言,安全研究人员是Android生态圈中对安全漏洞公开披露的最大支持者。尽管并非所有研究人员都会尽心尽力,但他们还是会让安全问题受到所有其他利益相关者的关注。安全问题的披露往往是由独立研究人员或安全公司操作的,他们会在邮件列表、安全会议或其他公开论坛上对这些问题进行公开披露。越来越多的研究人员正在与厂商一方的利益相关者协调有关安全漏洞披露的事项,意图能在不知不觉间改善Android的安全性。

1.4 小结

在本章中,你看到了Android操作系统是如何经过多年的发展,由零开始逐渐征服移动操作系统市场的。本章介绍了Android生态圈的主要利益相关者,解释了他们各自的角色及参与动机。本章详细介绍了困扰Android生态圈的各种复杂性问题,以及它们是如何影响Android安全性的。有了对Android生态圈复杂性的深刻理解,你就可以很容易地找出关键问题领域,进而更有效地致力于解决Android安全性问题。

下一章将概述Android的安全设计与架构,揭开Android工作原理以及实施安全机制的技术内幕。

目录