Android 系统安全

        Android是一个开源的移动平台操作系统,主要用于移动设备。作为一个运行于实际应用环境中的终端操作系统,Android操作系统在其体系结构设计和功能模块设计上就将系统的安全性考虑其中。Android是一个支持多任务的系统,其安全机制依托于数字签名和权限,系统中的应用程序之间一般是不可以互相访问的,每一个应用程序都有独立的进程空间。
        Android系统本身具有一套比较完善的安全机制,正常情况下可以有效地保护系统的安全使其不受侵害。Android的安全机制是在Linux安全机制的基础上发展和创新的,是传统的Linux安全机制和Android特有的安全机制的共同发展。

Permission机制

        Android是一个权限分离系统,它利用Linux已有的权限管理机制,为每一个应用程序分配不同的UID和GID,使不同的应用程序之间的私有数据和访问达到隔离的目的。如果使不同的应用程序之间的私有数据和访问达到共享,就需要声明对应的权限。为此,Android在原有的基础上进行了扩展,提供了permission机制,它主要是用来对应用程序可执行的某些具体操作进行权限细分和访问控制。在manifest文件中添加一个permission标签,就定义了一个permission。另外,Android为了对某些特定的数据块进行ad-hoc方式的访问,还提供了per-URI permission机制。

1.系统安全构架


        Android系统安全构造的一个中心设计思想是:缺省情况下,应用无权执行可能对其它应用,操作系统或是用户造成影响的任何操作,这些操作可能包括读写用户个人数据,读写其它应用的文件,访问网络以及保持设置处于“唤醒”状态等。

        Android系统使用“沙箱”将多个应用分隔开来,因此如有需要,应用必须明确指明需要和其它应用共享的资源或数据。这需要通过申明缺省“沙箱”未支持的“Permissions”来获得这些额外的功能。应用在Manifest文件中静态声明所需权限,Android系统在安装应用时会询问用户是否赋予该应用所需权限。为避免用户决定安全问题的复杂性,Android系统不支持在运行时动态赋予应用所需权限。

           Android的“沙箱”机制独立于用来创建应用所使用的技术,尤其要注意的Dalvik虚拟机不是安全机制的界限,任意应用都可以运行Native代码。所有的应用,Java,Native或者是二者的混合,使用同样的“沙箱”安全机制并具有同等的安全等级。

2.应用签名

所有的Android应用(.apk文件)都必须使用安全证书来签名,证书的密钥由开发人员拥有。证书表明应用的开发人员身份。但这个安全证书并不要求是由某个公认的证书管理中心(CA)来签发。通常开发人员多使用自己签发的证书。Android使用证书的目的是为了用来区分应用的作者。这使得Android可以据此来赋予或拒绝应用所需的权限,或者拒绝或者赋予某个应用申请使用其它应用同样的Linux用户来运行该应用的请求。

3.Permission机制的设计目标


        通知用户:通过列出应用程序可能执行的所有敏感的操作,让用户更多地意识到安装这个应用存在的潜在风险。这假定用户会阅读在安装时弹出的权限列表,并基于这些信息来作出是否安装应用的决定。

        降低风险:通过限制应用程序访问Android系统敏感的API接口,来降低应用程序对整个系统带来的伤害。

4.使用Permission


        缺省情况下一个基本的Android应用不含有任何Permission定义,也就是说该应用无权执行一些可能对用户或者设备上数据造成不良影响的操作。为了访问设备的某些受限的功能,你必须在AndroidManifest.xml中定义一个或多个<uses-permission>标记来申明应用中所需的权限。

        在安装应用时,应用所需的权限由应用安装程序来赋予应用,这将根据应用证书签名并由用户来决定。而在应用运行时无需用户再检查权限。要么是在安装时赋予应用使用某些功能对应的权限,之后应用可以任意使用该功能,要么是安装时拒绝赋予了某些权限,之后应用在使用这些功能时会失败而不会提示用户。

        通常情况下,在权限失败时会导致抛出SecurtyException异常,但系统不保证总是会这样。比如,方法sendBroadcast(Intent)在就数据发送到每个Receiver过程中会检查所需权限,在方法结束后,如果有权限失败,你不会接收到异常。而在几乎所有情况下,所有的权限失败都会在写到系统日志中。

        Android系统支持的所有Permission都可以在包Manifest.permission中找到。应用程序也可以自己定义和强化权限。

5. Permission机制的实现


        应用程序在AndroidManifest.xml文件中使用<usespermission>标签申请Permission。当一个应用程序加载到内存时,应用程序包管理服务PackageManagerService会在其成员域mPackages中维护该程序包的信息。该服务为Android的一个系统服务。包的信息用一个PackageParser.Package类的实例保存,包括了组成程序的组件信息和Permission信息。在PackageParser.Package类的成员域mExtras中包含着应用程序的设定信息,包括程序包的签名和申请的权限。

        应用程序组件可以和系统资源一样采用Permission机制进行访问控制,防止自身被滥用。为此,应用程序组件需要定义权限标示,以及在组件中用权限标示指定对访问者的权限能力要求。这些应用程序自主的Permission信息作为组件的固有属性保存在mPackages的相应的组件成员域中。PackageManagerService中保存的应用程序的Permission信息均来自对应用程序的AndroidManifest.xml文件的解析。

        Android 系统的 Permission机制保证了应用程序的访问能力与其软件包中的声明一致,即其执行过程中的访问能力与用户认可确认的能力是一致的。应用程序不能在运行中动态地修改自己的访问能力。应用程序中的所有组件共享一组访问能力,每个组件不会有自己特殊的访问能力。

        对于应用程序自主实施的Permission机制,也采用类似的过程。不同的是,系统服务PackageManagerService在生成程序的动态能力时,还会解析AndroidManifest.xml文件中应用程序自主的Permission标示定义。

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值