论文模板123 联系客服

发布时间 : 星期六 文章论文模板123更新完毕开始阅读6948c18e84868762caaed53d

Android系统安全机制

刘青

(河北科技师范学院 欧美学院 信息技术系)

摘 要: 分析和讨论了基于Linux的Android系统安全机制 ,在此机制中有许多优点 ,例如沙箱机制的灵活性等。但也由于系统的开放与自由性,现今面临着病毒的威胁。 关键词: 安卓 沙箱机制 手机系统 权限分离

Android System Security Mechanism

Liu Qing

(Hebei Normal University of Science and Technology,E&A College, Department of Information Technology)

Abstract: Analysis and discuss the Android system security mechanism based on mobile Agent. In this mechanism, several advantages can be achieved, such as the Flexibility of the sandbox mechanism. But because the system is open and free, it faces to the threat of viruses now.

Key words: Grid Computing Grid Monitoring Model Mobile Agent LDAP (Lightweight Directory Access Protocol)

引言

Android操作系统使用了沙箱(sandbox)机制,所有的应用程序都会先被简单地解压缩到沙箱中进行检查,并且将应用程序所需的权限提交给系统,并且将其所需权限以列表的形式展现出来,供用户查看[1]。例如一个第三方浏览器需要“连接网络”的权限,或者一些软件需要拨打电话,发送短信等权限。用户可以根据权限来考虑自己是否需要安装,用户只有在同意了应用程序权限之后,才能进行安装。

1. Android 安全机制概述

Android 是一个权限分离(privilege-separated)的系统。这是利用 Linux 已有的权限管理机制,通过为每一个应用程序分配不同的用户ID 和群ID,从而使得不同的

应用程序之间的私有数据和访问( native 以及 java 层通过这种沙箱sandbox机制,都可以)达到隔离的目的[5]。与此同时,Android还在此基础上进行扩展,提供了权限列表(permission)机制,它主要是用来对应用程序可以执行的某些具体操作进行权限细分和访问控制,同时提供了URI级别的权限(per-URI permission)机制,用来提供

[3]

对某些特定的数据块进行ad-hoc方式的访问。

1.1 uid、gid 、gids

Android的权限分离的基础是建立在Linux已有的uid、gid、gids基础上的。 UID :Android 在安装一个应用程序,就会为它分配一个uid(参考 Package Manager Service 中的 newUserLP实现)。其中普通Android应用程序的 uid 是从10000 开始分配(参见 Process.FIRST_APPLICATION_UID ),10000以下是系统进程的uid。 GID :对于普通应用程序来说,gid等于uid。由于每个应用程序的uid和gid都

[5]

不相同,因此不管是native层还是java层都能够达到保护私有数据的作用。 GIDS :gids是由框架在Application安装过程中生成,与Application申请的具体权限相关。如果Application申请的相应的permission被granted,而且中有对应的 gids,那么这个Application的gids中将包含这个gids。

1.2 permission

一个权限主要包含三个方面的信息:权限的名称;属于的权限组;保护级别。一个权限组是指把权限按照功能分成的不同的集合。每一个权限组包含若干具体权限,每个权限通过 protectionLevel来标识保护级别:normal,dangerous,signature,

signatureorsystem。不同的保护级别代表了程序要使用此权限时的认证方式。normal 的权限只要申请了就可以使用;dangerous 的权限在安装时需要用户确认才可以使用; signature和signatureorsystem的权限需要使用者的app和系统使用同一个数字证书。 Package的权限信息主要通过在AndroidManifest.xml中通过一些标签来指定。如 标签,标签等标签。如果package 需要申请使用某个权限,那么需要使用标签来指定[7]。

2. 安全构架

Android安全构架的一个中心设计要点就是默认来说没有程序有进行任何可能对其他程序、操作系统或是用户产生负面影响的任何操作的许可(permission)。这包括了读写用户私人数据(例如通讯录或是电子邮件),读写其他程序的文件,执行网络接入

[8]

或保持设备不进入睡眠状态等。

因为内核将程序通过沙盒分离,所以程序必须显式地共享资源及数据。它们通过声明许可来获取它们所需的没有通过基本沙盒提供的额外功能。程序静态地声明它们所需的许可,Android系统将在程序安装时向用户征求许可。Android没有动态(在运行时)担保许可的机制,因为这将使安全性受损,使得用户体验变糟[4]。

只有内核负责将程序通过沙盒与其他程序分离。尤其要注意Dalvik VM以及任何可以运行原生代码(native code)的程序(参见Android NDK)并不是安全边界。所有类型的程序——Java,原生(native)或是混合(hybrid)——都以同样方式被沙盒化,相互之间拥有相同的级别的安全性。

3. 应用程序签名

所有的Android应用程序(.apk文件)必须用一个开发者拥有其私钥的认证证书(certificate)来进行签名认证。该认证用于识别应用程序的权限。一个认证不需要由认证权威来进行签名:Android程序完全可以,而且通常也会,使用自签名的认证。Android的认证的目的是为了识别应用程序作者。证书是用于在应用程序之间建立信任关

系,而不是用于控制程序是否可以安装。签名影响安全性的最重要的方式是通过决定谁可以进

[8]

入基于签名的许可,以及谁可以共享用户IDs。

4. 用户ID与文件读取

在安装时,Android分给每一个包(package)一个独自的Linux用户ID。该识别将在这个包在设备上的整个周期内保持不变。在不同的设备上,同一个包可能会有不同的UID。不过重要的是在给定的某一个设备上每一个包都有一个独自的UID。

因为安全强化实在进程级别进行的,所以两个不同包的代码无法正常运行于同一个进程,他们需要作为不同的Linux用户运行。可以在每一个包的AndroidManifest.xml的manifest标签中使用sharedUserId属性来将其标为相同的用户ID。这样一来,这两个包就被认为是同一个程序,有同样的用户ID和文件权限了。注意:为了保持安全性,只有两个有同样签名(且请求了同样的sharedUserId)的程序才会被分配同样的用户ID。

一个程序存储的任何数据会被分配以这个程序的用户ID,而无法被其他包正常访问。当使用getSharedPreferences(String, int),openFileOutput(String, int)或openOrCreateDatabase(String, int, SQliteDatabase.CursorFactory)来创建新文件时,可以用MODE_WORLD_READABLE和/或MODE_WORLD_WRITEABLE 标志允许其他包读/写该文件。当设置了这些标志后,文件仍然属于原来的程序,但是因为设置了全局读/写许可,所以对任何其他程序都可见[6]。

5. URI许可

在使用内容提供者时,至今所描述的标准许可系统常常是不足以胜任的。内容提供者可能需要读写许可以保护自己,同时它的直接客户端也需要处理其他程序的特殊URI以供执行操作。典型的例子是邮件程序中的附件。应当通过许可来保护对邮件的访问,因为这是用户敏感数据。不过,如果一个指向图像附件的URI被交给了图像查看器,该查看器将不会有打开附件的许可,因为它没有理由持有访问所有电子邮件的许可。 这个问题的解决方案是单URI许可(per-URI permission):当启动一个活动或是向一个活动返回结果时,调用者可以设置Intent.FLAG_GRANT_READ_URI_PERMISSION和/或Intent.FLAG_GRANT_WRITE_URI_PERMISSION。这将许可接收方访问Intent内的指定数据URI,而不论它是否拥有任何访问和Intent相对应的内容提供者中数据的许可[2]。 这一机制使得常见的能力-风格模型(capability-style model)得以实现,用户交互操作(打开附件,从列表中选择联系人等)可以创建临时的细化许可权限。这是减少程序所需许可至仅有和其行为直接相关许可的工具。

然而,对细化URI许可的授权也需要一些拥有那些URI的内容提供者的配合。强烈建议内容提供者应用这一工具,通过android:grantUriPermissions属性或是标签来声明它们支持这一特性。

6. 病毒威胁

由于Android操作系统的开放和自由性,一些恶意程序和病毒也随之出现。2010年8月,卡巴斯基病毒实验室报告称发现了Android操作系统上首个木马程序,并将其

命名为“Trojan-SMS.AndroidOS.FakePlayer.a”,这是一个通过短信方式感染智慧型手机的木马,并且已经感染了一定数量的Android设备。除了短信感染方式,这些Android木马还可以伪装成一些主流的应用程序,并且还可以隐藏在一些正规的应用程序之中。 尽管Google通过定期的检查撤除这些存在于Google Play上的恶意程序和病毒,但是这并不能完全阻止其他病毒通过第三方网络的方式产生并且传播。

目前Android操作系统上已经拥有防病毒程序来防止设备中毒,例如 F-Secure、Kaspersky、Trend Micro、Symantec 等防护软件也已经发布了Android版本。 美国国家安全局在2012年1月发布SEAndroid开源项目和程序码,使Android系统支持强制存取控制(Mandatory Access Control)以增加系统安全性[3]。

7. 结束语

Android系统的安全机制随着版本的升级在不断地完善之中。系统安全面临威胁一般在面临应用安装或更新时。从用户角度看,一款Android应用通常会要求如下的权限: 拨打电话、发送短信或彩信、修改/删除SD卡上的内容、读取联系人的信息、读取日程信的息,写入日程数据、读取电话状态或识别码、精确的(基于GPS)地理位置、模糊的(基于网络获取)地理位置、创建蓝牙连接、对互联网的完全访问、查看网络状态,查看WiFi状态、避免手机待机、修改系统全局设置、读取同步设定、开机自启动、重启其他应用、终止运行中的应用、设定偏好应用、震动控制、拍摄图片等。

一款应用应该根据自身提供的功能,要求合理的权限。用户也可以分析一款应用所需权限,从而简单判定这款应用是否安全。如一款应用是不带广告的单机版,也没有任何附加的内容需要下载,那么它要求访问网络的权限就比较可疑。

参考文献:

[1] Lextrait, Vincent. The Programming Languages Beacon, v10.0 [5 January 2010]. [2] Licenses. Android Open Source Project. Open Handset Alliance [2010-06-10]. [3] Android之父Andy Rubin:生而Gee作者:Wuzhimin本文来自《程序员》杂志2010 年9期。

[4]Google's Android becomes the world's leading smart phone platform (Canalys research release: r2011013). Canalys. 31 January 2011 [1 February 2011]. [5]Tarmo Virki and Sinead Carew. Google topples Symbian from smartphones top spot. Reuters. 2011-01-31 [1 February 2011]. [6]开发简介developerWorks IBM 2009年6月08日。 [7] Christina Bonnington. Google’s 10 Billion Android App Downloads: By the Numbers. wired.com. 8 December 2011 [12 December 2011]. [8] Tarmo Virki and Sinead Carew. Google topples Symbian from smartphones top spot. Reuters. 2011-01-31 [1 February 2011].