何国锋,曾 莹/He Guofeng,Zeng Ying
(中国电信股份有限公司上海分公司 上海200085)
移动互联网的快速发展,离不开移动数据网络和移动智能终端的发展。移动数据网络从GPRS/cdma1x 2G时代开始,经历了WCDMA/Ev-Do时代,一直到4G时代,网络速度大大提升。移动智能终端市场出现过 Symbian、Windows Phone、Android 以及iOS等多个操作系统,有些已经退出市场,有些却成为市场主流,纵观当前各种活跃的移动应用,主要仍以iOS和Android两大阵营为主。
到2014年年底,智能手机全球出货量达12.86亿部,中国市场智能手机出货量也达4.5亿部,而全球智能手机用户数量更是达17.5亿人。在全球大多数发达地区,如北美、西欧等部分国家,智能手机的渗透率已超过六成;在全球智能手机整体出货量中,Android智能手机出货量达10.6亿部,市场份额高达82.3%;苹果智能手机出货量为1.78亿部,市场份额为14%;微软 Windows Phone智能手机出货量为3 500万部,市场占有率仅为2.7%[1]。
智能手机的发展与普及也为移动应用的快速发展带来了契机,越来越多的工作应用和生活应用在移动终端上被用户使用。与传统手机相比,移动智能终端已经成为信息获取和传播越来越重要的载体,并开始影响和改变人们的工作和生活,因此,移动终端的安全性也显得愈加重要。
不同阵营的移动智能终端由于设计理念的差异,其安全机制也不尽相同。只有深入了解其安全机制,才能充分利用其优势,设法弥补其不足,提升其安全性。本文将围绕移动终端两大阵营剖析其安全机制,并通过对比分析,最终提出安全建议。
客户对智能终端通常有以下几个主要方面的安全需求。
(1)数据存储安全
这是客户最核心的安全需求,例如,存在闪存中的数据是否安全?是否会被其他人通过非法途径获取?一些非法应用是否会偷偷读取用户数据?或者他人拿到终端通过芯片分析是否能获得原始数据?这需要在应用级、系统级、设备级层面都进行充分考虑。
(2)应用安全可信
安装的应用来源是否可信?一个非法应用一旦被安装在设备上,并且给予了授权,设备上的数据就变得不可控。同时考虑不同应用运行时是否有隔离,应用中输入的数据是否会被其他应用截获。
(3)身份认证和权限管理
通俗地说,这就是合适的人使用合适的工具,访问合适的数据。设备是否有合适的手段进行访问控制,设置只有授权人员才能访问终端;是否有合适的手段进行权限控制,设置不同的应用仅能访问的授权数据。
(4)网络安全
在用户对外传输数据时,要确保其他应用不能获得传输的数据。
为了便于分析,通常将移动智能终端模型分为5个层次,如图1所示。
最底层是硬件,主要包括终端的CPU、内存、存储为主的设备单元,组成一个可计算的终端。
固件则是在微代码层面组织各硬件单元,为上层操作系统提供标准化接口。硬件和固件组成一个可安装操作系统的智能终端。
操作系统可以分为两部分,一部分是操作系统核心,主要负责文件系统管理、进程调度等;另一部分是运行环境,主要包括沙箱、网络隔离、内存控制、接口独占等。
应用则是客户使用的功能软件。
各个层面安全需求考虑的安全因素也不尽相同。硬件层面需要考虑终端的CPU是否安全,内存数据是否会被窃取,存储中的数据是否安全被保护;固件层面需要考虑固件是否会被替换,是否存在安全漏洞等;操作系统核心需要考虑文件系统是否安全,进程间是否有漏洞;运行环境需要考虑网络数据是否隔离,内存是否共享,接口是否独占等;应用层面需要考虑应用是否合法,代码是否被篡改,是否存在漏洞等。
下面将分析当前市场两大移动终端阵营分别是如何保障安全的。
Android是业界流行的开源移动平台,受到广泛关注并被多个手机制造商作为手机的操作系统平台。Android作为一个移动设备的平台,其软件层次结构包括操作系统(OS)、中间件(MiddleWare)和应用程序(Application)。根据Android的软件框图,其软件层次结构自下而上分为以下4个层次[2],如图2所示。
(1)操作系统层
Android使用Linux 2.6作为操作系统,Linux是一个开放的操作系统,Linux 2.6也是一种标准技术。Android对操作系统的使用包括核心和驱动程序两部分,Android的Linux核心为标准的Linux 2.6内核;驱动包括显示、内存、相机、音频、Wi-Fi、键盘、蓝牙、电源灯。
(2)Android 运行环境
Android运行环境包括各种底层库和虚拟机。其中,库主要包括C库、多媒体框架、2D图像引擎、SSL、OpenGL、界面管理工具、SqLite、WebKit、FreeType等。库以系统中间件的形式提供,与移动设备的平台应用密切相关。
Android运行环境中的虚拟机技术使用Dalvik。Dalvik虚拟机和一般Java虚拟机(Java VM)不同,它执行的不是Java标准的字节码(Bytecode),而是Dalvik可执行格式(.dex)的执行文件。在执行过程中,每一个应用程序即一个进程 (Linux的一个Process)。二者最大的区别在于Java VM是基于栈的虚拟机(Stack-Based),而 Dalvik是基于寄存器的虚拟机(Register-Based)。后者最大的好处在于可以根据硬件实现更大的优化,这更适合移动设备的特点。
(3)应用程序框架
Android的应用程序框架为应用程序层的开发者提供APIs。主要提供UI程序中所需控件:Views(视图组件),包括 Lists(列表)、Grids(栅格)、Text Boxes(文本框)、Buttons(按钮)等以及嵌入式的Web浏览器。Android的应用程序可以利用应用程序框架中的API开发以下几个组件:Activity(活动)、Broadcast Intent Receiver(广播意图接收者)、Service(服务)、Content Provider(内容提供者)。
(4)应用程序
Android的应用程序主要是用户界面(User Interface),通常以Java程序编写,其中还可以包含各种资源文件(放置在res目录中)。Java程序及相关资源经过编译后,将生成一个APK包。Android本身提供了主屏幕(Home)、联系人(Contact)、电话(Phone)、浏览器(Browsers)等众多的核心应用。 同时,应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。
Android主要从系统安全、权限管理、数据保护、应用安全4个方面进行安全设计。
Android采用开源模式,OS和终端生产商没有绑定关系。因此,在系统设计时,硬件和软件采用松耦合设计。
由于Android是基于Linux 2.6的,因此大部分沿用了Linux的系统安全特性。Linux系统是开源的,并且在业界广泛使用,代码经过数万人检查,其安全性值得信赖。
在硬件设备启动时,会启动设备自身的固件,固件再启动Android系统。在初次安装Android系统时,固件会检查Android系统的完整性,然后才能进行安装,一般而言,终端厂商会验证是否为自己公司所签发的系统。如果设备上安装的是第三方的操作系统,则首先修改引导固件。
在Android系统中,不会对最终用户开放Root权限,这利用了Linux本身的管理机制。因此,一般用户无法修改系统Kennel,甚至系统级应用。一些用户为了精简系统,修改系统核心,则需要获得Root权限,即所谓的Root,然而Root后会给系统带来安全风险。
Android系统是一个权限分离的系统,利用Linux已有的权限管理机制,通过为每一个应用程序分配不同的用户标识(UID)和GID,从而使得不同应用程序之间的私有数据和访问(Native以及Java层通过这种Sandbox机制,都可以实现)达到隔离的目的。系统中的UID分为3类,即普通用户、根用户和系统用户。普通用户是指所有使用系统的真实用户,这类用户可以使用用户名及密码登录系统;根用户也就是Root用户,它的ID是0,也被称为超级用户,Root账户拥有对系统的完全控制权,可以修改、删除任何文件,运行任何命令;系统用户是指系统运行时必须有的用户,但并不是指真实的使用者。在Android系统中,一个UID表示一个应用程序。应用程序在安装时被分配UID,应用程序在设备上的存续期间内,UID保持不变。对于普通的应用程序,GID即UID。
与此同时,Android还在此基础上进行扩展,提供了Permission机制,它主要是用来对应用可以执行的某些具体操作进行权限细分和访问控制,同时提供了PER-URI权限机制,用来提供对某些特定的数据块进行点到点方式的访问。
在系统底层上,Android限制了应用对一些API的存取,如Android并不提供直接操纵SIM卡的API。当第三方APP存取相关地理位置、相机、蓝牙、短信等受保护的API时,需要得到使用者另外的许可。
在Android系统中,对权限的管理是在应用安装时确定的,一般在Mainfest中描述,如果用户不能接受应用的权限需求,则不能安装应用。在Android 4.2后,也可以在安装应用后再更改权限。
Android系统采用进程沙箱隔离、权限声明、访问控制、进程通信、内存管理等机制来确保系统及应用的数据安全。
(1)进程沙箱隔离机制
Android应用程序在安装时被赋予独特的UID,并永久保持,应用程序及其运行的Dalvik虚拟机运行于独立的Linux进程空间,与UID不同的应用程序完全隔离。同一开发者可指定不同的应用程序共享UID,进而运行于同一进程空间,共享资源。使用相同数字签名的不同应用程序可以相互授予权限来访问基于签名的API。如果应用程序共享UID,则可以运行在同一进程中,从而允许彼此访问对方的代码和数据。
(2)权限声明机制
应用程序需要显式声明权限、名称、权限组与保护级别。不同的级别要求应用程序行使此权限时的认证方式不同:普通级申请即可用;敏感级需在安装时由用户确认才可用;系统级则必须是系统用户才可用。
(3)访问控制机制
来自于阿美或自他承包商,有能力、经验和资格识别脚手架安全风险,验证脚手架是否符合阿美相关标准要求,同时记录脚手架检查及验收结果。脚手架检查工程师也必须经过阿美认证,其证书有效期也是三年
传统的Linux访问控制机制能确保系统文件与用户数据不受非法访问。APP只有通过Android系统许可权检查后,才可以存取个人信息,进行敏感性输入设备。
(4)进程通信机制
Android采用Binder进程通信机制,提供基于共享内存的高效进程通信。Binder基于Client-Server模式,提供类似COM与CORBA的轻量级远程进程调用(RPC),通过接口描述语言(AIDL)定义接口与交换数据的类型,确保进程间通信的数据不会溢出越界、污染进程空间。
(5)内存管理机制
基于标准Linux的低内存管理(OOM)机制,设计实现了独特的低内存清理(LMK)机制,将进程按重要性分级、分组,当内存不足时,自动清理最低级别进程所占用的内存空间。同时,引入不同于传统Linux共享内存机制的Android共享内存机制Ashmem(Anonymous Shared Memory),具备清理不再使用共享内存区域的能力。
Android数据存储基于Linux系统,没有使用硬件级加密和文件加密系统。
Android应用程序包(.apk文件)必须被开发者数字签名。在Android系统中预置了众多可信的数字证书签发机构,所有这些签发机构签发的企业证书都可以签发应用。同时,为了开发方便,还支持不检查来源的应用安装方式。
在应用市场方面,Google会在Google Play上自动扫描市场中已经存在的所有APP,分析它们是否包含潜在的安全威胁。同时通过构建在云端的模拟器模拟APP在设备上执行的状态,进而找出隐藏的恶意行为。此外,Google Play还会扫描开发者账户,以防止恶意软件开发者再度向Google提交恶意APP,通过此举保证Google Play Store上APP的安全性。但由于生态不同,Android支持第三方市场的Android APP,很难保证所有的市场都是按照Google Play的安全标准执行。
在系统层面,Android在4.2及以后的版本中增加了APP验证机制。当使用者安装第三方市场的APP时,该验证机制便会向Google的服务器发送验证信息来确认其安全性,如果返回的结果是否定的,那么系统便会阻止使用者继续安装。为了丰富自己的资料库,除了Google Play外,Google还扫描网络上各类APK文件。后续Google还将升级APP验证机制,升级后,APP验证机制将可以在后台运行,以监测已经安装的APP是否有不轨行为。此举大大降低了安装第三方市场的APP给用户带来的风险。
iOS在系统设计时采用软硬一体化的设计思路,操作系统采用闭源模式,其安全模型如图3所示。
其模型和上文中的Android模型基本一致,但增加了一些部件,如在硬件中增加了加密模块;在固件中增加了加密引擎提供给操作系统使用;在操作系统层面采用加密文件系统;在数据存储、访问方面利用了软硬一体的优势。它主要从系统安全、权限管理、数据保护和应用安全4个方面进行了安全设计[3]。
iOS采用可信计算模型,确保在设备上运行的每个软件都是可信的、有效的。从设备启动到操作系统运行,每个环节都需要验证,确保软/硬件的正常、安全运行。设备启动时从ROM读取BootROM,这是在芯片生产时固化的,毫无疑问是可信的。BootROM含有苹果根证书,可以验证后续的底层启动装载器(Low-Level Bootloader,LLB),当 LLB 启动完成后,再验证启动装载器(iBoot),将验证iOS Kernel。这个启动链确保底层的软件未被修改或植入木马,确保iOS运行在有效的苹果设备上。带有移动通信或Wi-Fi设备的通信子系统同样通过这样的启动链验证,系统是完整有效的。在整个启动过程中,任何一个环节出现验证失败,将使iOS设备界面出现“Connect to iTunes”进入恢复模式。如果BootRom不能验证LLB,则将直接进入设备固件升级模式(Device Firmware Upgrade,DFU)。
在操作系统补丁发布或iOS升级时,设备同样会验证补丁或新版iOS是否由苹果签发,只有验证合法才会进行修补或升级。
iOS系统对终端使用用户不开放管理权限,因此,用户不能直接修改系统核心或更改系统应用。如果用户需要更改核心应用或安装非APP Store的应用,则需要获得系统管理权限,就是通常所说的越狱,越狱是通过系统漏洞获得系统管理权限的。
iOS采用系统控制权限的方式限制应用对敏感数据或敏感输入设备的访问。由于iOS的所有应用都进行了安全检查,终端使用者不必关心程序中的权限问题,但也因此给软件开发者带来了烦恼,他们可能因为权限问题而无法正常使用应用。
iOS采用多种机制保障数据的安全,包括进程沙箱隔离、权限管理、内存管理等机制保障系统及应用的数据安全。同时,利用软硬一体的机制,在数据存储安全方面独树一帜。
每个应用在独立的沙箱中运行,每个应用都有独立的根目录,确保自己的数据不被其他应用访问或修改,同时也不能访问其他应用的数据。如果需要访问共享的资源,必须通过iOS提供的API。绝大多数应用都以非特权用户“mobile”身份运行,不允许自我提权。iOS采用地址空间随机化 (ASLR)技术,使黑客攻击更为困难,确保运行时内存安全,同时还采用全局权限管理机制,确保敏感数据或设备不被恶意程序访问。
iOS采用硬件和软件加密机制保护数据存储和访问安全。每一个iOS设备都有内置的AES 256加密引擎,通过DMA通道连接闪存存储和主系统内存,使数据加/解密得以高效实现。每台设备在制造过程中确定唯一识别码 (UID)和一个设备组ID(GID),这些组合成AES 256位密钥,此密钥无法从外部读取,只能通过AES引擎使用这个密钥。UID是唯一的,苹果不做任何记录,GID代表设备类型。所有存储在闪存中的数据都使用该密钥加密,使加密数据被绑定到特定设备。例如,iOS文件系统加密就包括UID,如果存储芯片在物理上从一个设备转移到另一个设备,文件将无法读取。
苹果还提供安全擦除功能。大批量擦除数据对闪存是一个极大的挑战,为了解决这个问题,iOS设备引入了可擦除存储(Effaceable Storage)设计。此功能设计只需访问底层存储技术来直接寻址和擦除小块数据,就可以使全部数据失效。
除了内置于iOS设备的硬件加密功能外,苹果还采用了层次化数据保护技术,以进一步保护存储在闪存上的数据。数据保护使该设备既能满足通用功能需求,如响应电话呼叫,又能实现敏感数据高水平的加密。无论是苹果自带程序还是第三方应用程序,都能使用层次化数据保护。
数据保护是在内置iOS设备的硬件加密技术的基础上,通过构建和管理密钥的层次结构得以实现的,如图4所示。
在文件系统中,所有文件的元数据都用文件系统密钥进行加密,文件系统密钥是第一次安装的iOS组合UID、GID等产生的。文件系统密钥存储在可擦除存储区域。文件系统密钥存储在设备上,因此不使用此密钥维护数据的保密性。它的目的是迅速擦除数据,擦除此密钥后,所有文件都无法访问。
文件内容由文件元数据中的文件密钥进行加密;文件密钥由类密钥加密,加密的文件内容和文件元数据都由文件系统密钥加密保存在存储上。类密钥由硬件的UID或用户的密码来保护,这种层次结构提供了灵活的性能。例如,更改文件的类密钥只需要重新打包的每个文件的密钥,密码的改变只是再重新包装类密钥。类密钥提供4种类型,分别对应完整保护、关保护 (文件打开时可使用)、无认证保护(认证后可使用)、无保护,适用于不同的场景。
苹果通过两种机制保证应用的安全,包括代码签名和沙盒模式。
应用是客户使用终端的直接界面,如果一个应用本身是恶意的,则会导致客户数据损失。前面在系统安全中描述,iOS保证其内核是安全的。同样在启动应用时,也会检查应用的数字签名,通过信任链检查,确保应用来自可信的来源,并且是完整的、未被篡改的,iOS不允许运行未经数字签名检查的应用程序。同时,iOS应用程序在沙箱里执行,确保用户数据只能自己使用,并且不能访问其他应用的数据。
应用包括随设备提供的应用程序,如Mail和Safari浏览器,是由苹果公司签署的。同时支持第三方应用程序,为了开发iOS设备上的应用程序,开发人员必须注册APP ID并加入iPhone开发者计划。每个开发人员的真实身份,无论是个人还是企业,由苹果公司证实并给予其签发数字证书,开发程序提交APPStore必须采用此证书签发,以确保应用程序来源可信。同时苹果也会审查应用,确保应用功能和描述一致,并且不含有明显的缺陷或其他问题。
当然,企业也可以开发自己的企业应用,不需要发布到APP Store。企业需要凭借DUNS号码申请企业证书,同时获得设备配置文件,安装企业应用的设备必须同时安装设备配置文件,证明其设备和应用属于同一个企业,这样确保应用不会被恶意使用。
根据前面对Android和iOS安全机制的详细分析可以发现,两者都采用了很多安全机制来保证终端的安全,包括操作系统安全、应用安全、数据保护及权限管理。
可以按照纠错机制、操作系统安全、数据保护、内存安全、应用安全、权限管理等多个维度对两大主流系统进行比较,详见表1。
在操作系统方面,Android采用成熟的开源Linux技术,其安全基础较好,可以发挥社区的综合能力,促进系统安全性的完善;iOS采用闭源模式,主要依赖自身的安全积累。
在信任链处理上,两者也不完全一致。iOS采用从硬件到应用统一信任链的模式,而Android采用更开放的信任模式,由用户自主决定信任源。Android和iOS都采用了数字签名技术来保证应用的可靠性,但由于生态不同,对数字签名证书的管理采用了不同的方式。在iOS中,数字签名证书只有两类,一类来自苹果自身,另一类来自苹果认可的企业。iOS不仅在安装时检查数字签名的有效性,同时还在每次运营时检查数字签名的有效性。Android上并没有“中央权威”来控制所有APP的签名,各运营商、OEM以及第三方市场都可以给APP签名。
表1 Android和iOS安全机制比较
对权限管理的处理方式也不同。iOS采用全局控制的方式,使用户不能单独对某个应用进行限制;Android采用显式权限管理模式,仅在安装时检查权限,由开发者决定权限需求。
总体来看,虽然Google和苹果对各自系统的掌控能力不同,但双方都在自己可控的范围内为Android和iOS做了很多安全考虑,包括系统、APP安装及APP运行方面,所以两者各有优势。相对于iOS,Android把更多的选择权交给了使用者,让他们自行选择。只要遵循安全机制,不随意Root,安装可信应用,Android同样可以安全、可靠。
通过对Android和iOS的安全机制比较,笔者认为没有哪个系统绝对安全。随着应用领域越来越广,两者被发现的安全漏洞也越来越多。相信在不断的迭代开发中,两个系统会越来越安全,安全机制也会越来越完善,让用户可以更放心地享受移动互联网给生活带来的改变。
然而再安全的机制,如果没有遵循设计者理念的使用,就如同再安全的汽车,酒后驾驶总是会出现事故,无论是开发者还是用户,都应该遵照最小安全原则,安全使用手机。
第一,不要越狱和Root。对苹果用户而言,尽管越狱能让其享受各种插件带来的乐趣,但也会让苹果精心设计的安全机制功亏一篑;对Android用户而言,Root同样会在给其带来便利的同时,也给恶意软件带来便利。
第二,只从正规应用商店获取APP。对苹果而言,就是只从 APP Store获取APP。APP Store上的所有APP都在发布前经过苹果审查,确保其不存在任何恶意代码。Android应用商店相对较多,但用户应尽量选择到其官方网站下载应用,或到有人工审核的应用商店下载应用。
第三,不要随意信任计算机。在用户将苹果设备第一次连接至某台电脑时,iOS会弹出对话框询问你是否信任这台计算机。一旦你选择了信任,这台电脑就有权访问你存储在设备上的所有个人信息。尽管iOS可以阻止安装在设备中的APP窃取你的隐私,但是像Wirelurker这样的恶意软件还是可以通过感染被设备信任的电脑来绕过沙盒机制并读取你存储在设备中的资料。对Android设备而言,用户应关闭USB调试模式,避免电脑中恶意软件随意在设备上安装软件。
第四,谨慎赋予APP的隐私读取权限。在某个APP第一次申请读取你的某项隐私(如照片、通讯录、使用麦克风或相机等)前,iOS和Android系统都会询问你是否批准。如果你认为某个APP不需要读取你的资料(如一款游戏APP要求读取你的通讯录和照片),那么请坚定地选择 “不允许”。对于Android应用,则需要在安装时仔细审查应用需要的权限,如果应用需要的权限过多且不必要,则不应安装此应用。
第五,不要随意连接Wi-Fi。因为你有可能登录的是钓鱼Wi-Fi,从而导致你的终端和外部网络的通信被全部截获,可能包括你设备应用登录的账号和密码,导致意外损失。
随着越来越多移动互联网应用的出现,除了原生态的APP应用,HTML 5的应用和混合应用也将给移动终端的安全带来更大的挑战,未来的移动互联网安全会越来越受到各方重视。
[1] 赛迪智库.移动智能终端产业发展白皮书(2015版)[R].2015.
[2] 吴倩,赵晨啸,郭莹.Android安全机制解析与应用实践[M].北京:机械工业出版社,2013.
[3]iOS Security Guide[EB/OL].http://www.docin.com/p-1199599678.htm l,2014.