首页 > 代码库 > 论文相关笔记5
论文相关笔记5
五、Android安全机制分析与解决方案初探(2011《科学技术与工程》)
1.Android简介
(1)Android平台框架
Android是在移动设备上执行应用程序的环境。
Android平台框架公由5部分组成:
Android软件栈的基础是Linux2.6内核,它主要提供安全、驱动、内存管理、网络协议栈等核心系统服务。
Linux内核上面是Android本地库,是一套C/C++库,被上层各种各样的系统组件调用。
在Android程序内通过Java本地调用(JNI)实现合并这些库。
Android运行环境包括Dalvik虚拟机和核心库。Dalvik运行.dex(Dalvik-executable)文件,一种被认为比Java类文件更加简洁和节省内存的文件;核心库由Java语言编写,提供了大量的Java5 SE包的子类和一些Android特有的库。
应用程序框架仍然都是由Java语言编写,它是开发者进行Android开发的基础。该层主要由View、通知管理器、活动管理器等由开发人员直接调用的组件组成。
应用程序由Java语言编写,运行在虚拟机上。
Android平台框架图如下:
(2)Android应用构成
Android应用程序的常规发布格式是一个经过数字签名的.apk文件包,类似于Java jar,包含程序所有的代码和非代码文件。
其中一个XML文件即Android Manifest文件,该布局文件包含应用程序的基本信息,如包名、组件描述、权限声明。
一个Android应用程序包含4种类型的组件:activity、service、content provider和broadcast receiver。Activity工作在手机屏幕前台与用户进行通信;Service工作在后台没有用户界面;Content provider为应用程序提供数据存储;Broadcast-receiver帮助程序组件之间相互通信。每个组件独立地被实例化和执行的同时也相互作用其他的组件,必要时可以被其他程序启动。
2.Android安全机制
(1)Linux机制
Android Linux内核层包含两个基本的安全机制:可移植操作系统接口(POSIX)用户和文件访问控制。这些机制的基本元素是用户(表现为一个整数号码或者一个ID),用户拥有对象(如进程和文件),用户再进一步分配到用户组。
(a)POSIX用户:每个安装在移动设备上的Android包(.apk)文件都会分配一个唯一Linux(POSIX)用户ID。所以,两个不同包的代码不能再同一个进程里运行。这就创造了沙箱,阻止拥有程序对其他程序或系统其他部分施加恶意影响。一个Android应用程序主要运行在一个安全的沙箱内,因此,它不允许访问其他资源,除非明确地授权允许访问。当然,可以通过设置每个Android包的Android Manifest.xml文件的manifest标签内的sharedUserId属性,给它们分配同一个用户ID。这样,两个包被认为是同一个程序,拥有同样的用户ID和文件存取权限。注意:为了保证安全,只有具有相同签名的应用程序(且请求相同的sharedUserId属性),才能分配相同的用户ID。
(b)文件访问控制:Android文件(包括应用程序文件和系统文件)管理属于Linux权限机制。每个文件与用户ID和用户组ID以及三组Read/Write/Execute(RWX)权限密切相关。通常,“system”或“root”用户拥有Android系统文件,而特定应用程序的用户拥有应用程序的文件。
(2)Android特有的安全机制
Google为Android引进了以下特有的安全机制:
(a)应用程序权限机制:Android通过在每台设备上实施了基于权限的安全策略来处理安全问题,采用权限来限制安装应用程序的能力。权限是一段唯一的各不相同的字符串。当某个权限与某个操作和资源对象绑定在一起,我们必须获得这个权限才能在对象上执行操作。Android框架提供一套默认的权限存储在android.anifest.permission类中,同时也允许定义新的权限。写应用程序时声明权限,程序安装时新权限被引入系统。权限授权在应用程序安装时执行。
权限策略:
每个权限被定义成一个字符串,用来传达权限以执行某个特殊的操作。所有权限可以分为两个类别:一种是执行程序时被应用程序所请求的权限,一种是应用程序的组件之间通信时被其他组件请求的权限。
开发者在XML manifest文件中编写权限标签来定义以上两种类别的权限策略。XML元素<application>由一系列代表组件的子元素构成,如<activity>、<service>、<provider>和<receiver>。应用程序可以用一个<permission>元素来声明权限,用于限制访问特定组件或应用程序。应用程序列出所有需要用来完成任务的权限,分别用<use-permission>元素标识,即权限请求。ICC(inter-component communication),<application>元素和组件元素都有android:permission的属性,这里,我们称这个属性分别为应用程序和组件的权限标签;应用程序内的组件可以继承应用程序元素设置的权限标签。
防护等级:
防护等级是权限的一个属性,它决定了权限怎样被授权。现今的Android安全架构支持四种防护等级:normal、dangerous、signature和signatureOrSystem。
Android自身缺陷:
应用程序可以自由命名一个新权限,无须遵循一定命名规则和限制。
权限一经授权给应用程序,在程序的声明周期间,它不会被移除,即使声明此权限的源程序被删除。
一个系统内两个不同的权限可以共用相同的名字,以至于他们中的一个权限可以在未声明的前提下正常使用。
(b)组件包装
Android应用程序把组件包装在程序内容内,阻止其他应用程序访问。主要通过“exported”属性来实现。如果“exported”属性被设置为“false”,该组件只能被拥有它的应用程序(或者其他通过sharedUserId属性共用一个用户ID的应用程序)访问。如果设为“true”,该组件可以被其他外部程序调用。
(c)数字签名
所有应用程序都必须有数字签名,Android系统不会安装没有数字证书的应用程序。数字证书都是有有效期的,Android只在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。sharedUesrId机制和权限机制都用到签名方法来执行signature和signatureOrSystem权限。
(3)其他保护
硬件设备,如内存管理单元(MMU)保障每个用户进程都拥有自己的独立的地址空间,减少了特权升级(Privilege Escalation)的可能性。
编程语言,如其类型安全特性能使编写的程序不易受到专制的代码执行(arbitrary code execution)的影响。
手机载体,如电话系统的AAA系统(authentication, authorization和accounting)用于识别用户、监控操作和向客户收取费用等。
3.安全解决方案
优先选取SELinux访问控制机制、入侵检测和Context-aware访问控制,次要选取数据加密、垃圾邮件过滤、可选择性的Android权限机制、远程管理虚拟专用网络(VPN)和身份验证等。
(1)基于主机的入侵检测框架(HIDS,host-based intrusion-detection system)
机器学习(machine learning)和时序推理(temporal reasoning)方法分析采集的数据,进而推断设备的状态。
(2)SELinux在Android上的实施
论文相关笔记5