Android系统是基于Linux内核开发的,因此,Android系统不仅保留和继承了Linux操作系统的安全机制,而且其系统架构的各个层次都有独特的安全特性[2]

1. Linux内核层安全机制

Android的Linux内核包含了强制访问控制机制和自主访问控制机制。强制访问控制机制由Linux安全模块来实现,但Google出于某种原因,并没有将LSM编译进Android内核。自主访问控制机制通常由文件访问控制来实现,Linux文件系统的权限控制是由user、group、other与读(r) 、写(w) 、执行(x)的不同组合来实现的。这样,每个文件都有三个基本权限集,它们的组合可以容许、限制、拒绝用户、用户组和其他用户的访问。通常,只有uid是“system”或“root”用户才拥有Android系统文件的访问权限,而应用程序只有通过申请Android权限才能实现对相应文件的访问,也正因为此,Android使用内核层Linux的自主访问控制机制和运行时的Dalvik虚拟机来实现Android的“沙箱”机制。

2. Android的“沙箱”机制

Android“沙箱”的本质是为了实现不同应用程序和进程之间的互相隔离,即在默认情况下,应用程序没有权限访问系统资源或其它应用程序的资源。每个APP和系统进程都被分配唯一并且固定的User Id,这个uid与内核层进程的uid对应。每个APP在各自独立的Dalvik虚拟机中运行,拥有独立的地址空间和资源。运行于Dalvik虚拟机中的进程必须依托内核层Linux进程而存在,因此Android使用Dalvik虚拟机和Linux的文件访问控制来实现沙箱机制,任何应用程序如果想要访问系统资源或者其它应用程序的资源必须在自己的manifest[23]文件中进行声明权限或者共享uid。

3. Android的权限检查机制

Android是一个“权限分离”的系统,任何一个应用程序在使用Android受限资源(网络、电话、短信、蓝牙、通讯录、SdCard等)之前都必须以XML文件的形式事先向Android系统提出申请,等待Android系统批准后应用程序方可使用相应的资源,权限与Java的API是多对多的映射关系。

当Android应用程序获得相应权限后,它就能通过调用API来完成相应的功能。一个API调用可被分为三个步骤[3]:第一,应用程序获取相应权限后会调用公共库中的API;第二,公共API会调用一个叫API代理的接口(RPC stub);第三,RPCstub把请求以IPC绑定的形式传递给系统服务,由系统服务进程完成具体的功能,权限检查恰恰发生在对系统服务和系统进程中。权限检查不仅包括安装时的静态检查,还包括APP运行时的动态检查。动态检查是指APP在运行期间调用的系统服务或系统组件需要经过授权检查。动态检查并不发生在APP本身,而是发生在系统服务或系统组件的进程中。在Android4.0版本之前,Android的权限检查机制是可以被绕过的,这是因为权限检查机制存在漏洞,即调用者不需要具有被调用者的相关权限,Android4.0版本不仅使用函数“checkUidPermission”来决定权限是否应授予相应的进程而且使用了函数“checkCallingPermission”来检查调用者是否有相应的权限。因此,Android权限机制一般不能被绕过,但Android权限机制有些不容忽视的缺陷,具体表现在如下几个方面:

第一,权限一经授予应用程序,那么此权限在该应用程序生命期间都将有效,用户无法剥夺权限;

第二,权限机制缺乏灵活性,要么全都批准应用程序所要求的所有权限,要么拒绝应用程序的安装;

第三,权限机制安全性不够,不能阻止恶意软件通过JNI技术直接调用C库,从而获取系统服务。

4. Android的数字签名机制

所有安装到Android系统中的应用程序都必须拥有一个数字证书[4],此数字证书用于标识应用程序的作者和应用程序之间的信任关系。Android系统不会安装一个没有数字证书的应用程序,如果一个权限的保护级别为signature,只有当应用程序所用数字签名与声明此权限的应用程序所用数字签名相同时,Android系统才会授权。如果一个权限的保护级别为signatureOrSystem,Android系统会将该权限授予具有相同数字签名的应用程序或Android包类。

[置顶] Android安全机制分析的更多相关文章

  1. [置顶] Android源码分析-点击事件派发机制

    转载请注明出处:http://blog.csdn.net/singwhatiwanna/article/details/17339857 概述 一直想写篇关于Android事件派发机制的文章,却一直没 ...

  2. [置顶] [Android源码分析]inquiry result引起的上层变化分析

    在上一篇文章中,我们详细分析了android是如何解析蓝牙反馈上来的搜索到的设备信息,本文将会继续分析这些信息到了上层之后是如何处理. 8.inquiry result引起的上层变化 我们知道inqu ...

  3. [置顶] Android资源文件分析

    1)修改开机默认壁纸 Android开机默认资源文件为:frameworks/base/core/res/res/values/config.xml 我们找到wallpaper行: <strin ...

  4. Android内存机制分析1——了解Android堆和栈

    //----------------------------------------------------------------------------------- Android内存机制分析1 ...

  5. Android内存机制分析2——分析APP内存使用情况

    上面一篇文章说了Android应用运行在dalvik里面分配的堆和栈内存区别,以及程序中什么代码会在哪里运行.今天主要是讲解一下Android里面如何分析我们程序内存使用情况.以便后续可以分析我们程序 ...

  6. [置顶] android 心跳包的分析

    android 心跳的分析 最近在做一个项目中用到了心跳包的机制,其实就是传统的长连接.或许有的人知道消息推送的机制,消息推送也是一种长连接 ,是将数据有服务器端推送到客户端这边从而改变传统的“拉”的 ...

  7. [置顶] Android开发笔记(成长轨迹)

    分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...

  8. 【转】Android内存机制分析2——分析APP内存使用情况

    上面一篇文章说了Android应用运行在dalvik里面分配的堆和栈内存区别,以及程序中什么代码会在哪里运行.今天主要是讲解一下Android里面如何分析我们程序内存使用情况.以便后续可以分析我们程序 ...

  9. [置顶] Android开发之serviceManager分析

    Android 开发之serviceManager分析 在Android系统中用到最多的通信机制就是Binder,Binder主要由Client.Server.ServiceManager和Binde ...

随机推荐

  1. Android -------- eclipse平台上的单元测试框架

    eclipse平台上单元测试框架 继承android.test.AndroidTestCase类 清单文件中设置 设置指令集,与application标签同级 <instrumentation ...

  2. FalseEasting 和 FalseNorthing

    FalseEasting (东伪偏移) 和FalseNorthing(北伪偏移) FalseEasting (东伪偏移) 投影平面中为避免横轴(经度方向)坐标出现负值,而所加的偏移量.我国规定将高斯- ...

  3. abstract修饰符,具体类与抽象类的区别

    abstract修饰符 abstract可以修饰类,表示一个抽象类,注意:抽象类和具体类唯一的区别:类不能创建对象,而具体类是可以创建对象的 1.具体类有构造方法,抽象类也有构造方法 2.具体类可以有 ...

  4. 12 hdfs常用文件、目录拷贝操作、删除操作

    package com.da.hbase.tool.utils; import com.da.hbase.tool.common.Const; import org.apache.hadoop.con ...

  5. JavaScript学习笔记(三十八) 复制属性继承

    复制属性继承(Inheritance by Copying Properties) 让我们看一下另一个继承模式—复制属性继承(inheritance by copying properties).在这 ...

  6. 利用css进行网页布局

    网页布局: 又称版式布局,是网页UI设计师将有限的视觉元素进行有机的排列组合,将理性的思维个性的化的表现出来,是一种具有个人艺术特色的视觉传达方式.传达信息的同时有美感.网页设计特点(相对纸媒来说). ...

  7. C# 汉子增加UTF-8头

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Conv ...

  8. 网站UV,与IP、PV

    什么是网站UV,与IP.PV在概念上的区别? UV(独立访客):即Unique Visitor,访问您网站的一台电脑客户端为一个访客.00:00-24:00内相同的客户端只被计算一次. PV(访问量) ...

  9. lua好久没有用了

    lua好久没有用了, 最近用python有点多,现在用web.py搞个简单的页面来作通讯录,没美工,很纯白的, 无聊啊,准备去睡了,刚刚百度完lua的一些资料呢, google用不了,真悲剧啊, TM ...

  10. Codeforces 566F Clique in the Divisibility Graph

    http://codeforces.com/problemset/problem/566/F 题目大意: 有n个点,点上有值a[i], 任意两点(i, j)有无向边相连当且仅当 (a[i] mod a ...