Android安全机制介绍

Android的安全机制包含下面几个方面:

? 进程沙箱隔离机制。

? 应用程序签名机制。

? 权限声明机制。

? 訪问控制机制。

? 进程通信机制。

? 内存管理机制。

? SELinux

一、进程沙箱隔离机制

Android应用程序在安装时被赋予独特的用户标识(UID),并永久保持;应用程序及其执行的Dalvik虚拟机执行于独立的Linux进程空间。与UID不同的应用程序全然隔离。

二、应用程序签名机制

应用程序包(.apk文件)必须被开发人员数字签名;同一开发人员可指定不同的应用程序共享UID,进而执行于同一进程空间,共享资源。

签名的过程:

? 生成私有、公共密钥和公共密钥证书

? 相应用进行签名

? 优化应用程序

签名的作用:

? 识别代码的作者。

? 检測应用程序是否发生了改变。

? 在应用程序之间建立信任,以便于应用程序能够安全地共享代码和数据。

三、权限声明机制

应用程序须要显式声明权限、名称、权限组与保护级别。不同的级别要求应用程序行使此权限时的认证方式不同:Normal级申请就可以用;Dangerous级需在安装时由用户确认才可用;Signature与Signatureorsystem则必须是系统用户才可用。

? 通过manifest文件里声明下面属性

<uses-permissionandroid:name="string" />

请求android:name相应的权限。

?  通过下面属性加入自己定义权限

<permission

xmlns:android="http://schemas.android.com/apk/res/android"

android:name="com.test.android.ACCESS_FRIENDS_LIST"

android:description="@string/permission_description"

android:label="@string/permission_label"

android:protectionLevel="normal" />

?  系统组件权限,如activity组件

<activity

android:permission="com.test.android.ACCESS_FRIENDS_LIST"

四、訪问控制机制

传统的 Linux訪问控制机制确保系统文件与用户数据不受非法訪问。

Linux用户与权限

? 超级用户(root)。具有最高的系统权限,UID为0。

? 系统伪用户,Linux操作系统出于系统管理的须要,但又不愿赋予超级用户的权限,须要将某些关键系统应用

文件全部权赋予某些系统伪用户,其UID范围为1~
499,系统的伪用户不能登录系统。

? 普通用户,仅仅具备有限的訪问权限,UID 为
500 ~ 6000。能够登录系统获得
shell

在Linux权限模型下,每一个文件属于一个用户和一个组,由UID与GID标识其全部权。

针对于文件的详细訪问权限

定义为可读(r)、可写(w)与可运行(x)。并由三组读、写、运行组成的权限三元组来描写叙述相关权限。

第一组定义文件全部者(用户)的权限,第二组定义同组用户(GID同样但UID不同的用户)的权限,第三组定

义其它用户的权限(GID与UID都不同的用户)。

五、进程通信机制

Binder进程通信机制提供基于共享内存的高效进程通信。Binder基于Client-Server模式,提供类似COM

与CORBA的轻量级远程进程调用(RPC);通过接口描写叙述语言(AIDL)定义接口与交换数据的类型,确保进程

间通信的数据不会溢出越界。污染进程空间。

六、内存管理机制

基于标准
Linux的低内存管理机制(OOM)。设计实现了独特的低内存清理(LMK)机制。将进程按重要性分级、分组。当内存不足时,自己主动清理最低级别进程所占用的内存空间。同一时候,引入不同于传统Linux共享内存机制的Android共享内存机制Ashmem,具备清理不再使用共享内存区域的能力。

七、SELinux

SELinux 拥有三个主要的操作模式

? Disabled:禁用SELinux策略

? Permissive:在Permissive模式下,SELinux会被启用但不会实施安全性策略,而仅仅会发出警告及记录行

动。Permissive模式在排除SELinux的问题时非常实用

? Enforcing:这个缺省模式会在系统上启用并实施SELinux的安全性策略。拒绝訪问及记录行动

SELinux 拥有三种訪问控制方法:

? 强制类型(TE):TE是针对型策略所採用的主要訪问控制机制

? 基于角色的訪问控制(RBAC):它以SELinux用户(未必等同Linux用户)为基础。但缺省的针对型策略并未

採用它

? 多层保障(MLS):未被採用,并且常常隐藏在缺省的针对型策略内。

SELinux策略文件:

? android/external/sepolicy文件夹下

? wing-common/sepolicy自己定义策略

SELinux默认宏:

? global_macros

? mls_macros

? te_macros

SELinux常见概念

? 主体:在SELinux中主体通常指的是进程。

? 客体:客体一般是一些系统资源(如文件、文件夹、套接字、共享内存等)。

? 客体类型:一个客体类别代表某个确定类型(如文件或套接字)的全部资源。

? DAC:Linux基于用户识别的訪问控制。

? MAC:主体对客体所採用的訪问类型,即强制訪问控制(TE)。

? 类型强制的安全上下文:訪问属性叫做安全上下文;一个安全上下文包含用户、角色和类型标识符。

? 域:因为历史原因,一个进程的类型通常被称为一个域或域类型。

我们觉得域、域类型、主体类型和进程类型

都是指相允许思。

? 策略:由于SELinux默认不同意不论什么訪问,所以在SELinux中,通过allow语句对主体授权对客体的訪问权限。

? 域转换

SELinux策略

Selinux策略语言眼下支持四类AV规则:

allow。dontaudit,auditallow。neverallow规则由四部分组成

? 源类型(SourceType),一般是尝试訪问进程的域类型。

? 目标类型(TargetType),被进程訪问的客体的类型。

? 客体类别(ObjectClass),同意訪问的客体类型(如file,dir,socket等)。

? 许可(Permission)象征目标同意源类型訪问客体类型的訪问种类。

? 如allowdev_type tmpfs:filesystem associate;

SELinux域转换

? 域转换发生条件

? 进程的新域类型对可运行文件类型有entrypoint訪问权限

? 进程的域类型对入口文件类型有execute訪问权限

? 进程当前的域类型对新的域类型有transition訪问权限

SELinux属性

attribute概念能够被理解为“具有一组共性的type集合”,或者“这组type所具有的共性”。语法例如以下:

attribute attribute_name;

比方定义一个名为”file_type”的属性:

attribute file_type;

在定义某个type时建立它与某个attribute的关联,比方:

type shadow_t,file_type;

使用attribute可以有效地降低类似规则的数目。比方为了让domain==backup_t可以读取文件系统中的全部文

件。则理论上必须为全部可能存在的文件type定义对应的allow规则:

type backup_t;

allow backup_t shadow_t:file read;

allow backup_t var_t:file read;

能够通过attribute来有效解决问题。

allow backup_t file_type:file read;

SELinux角色

SELinux通过SC中的role实现了“基于角色的訪问控制”(RBAC-Role Based Access Control)。在SELinux中,

并不直接建立用户和type之间的联系,而是通过角色作为桥梁。

user u roles { r }

role r types domain;

SELinux訪问控制

? ls -Z 显示文件系统客体的安全上下文

? Ps -Z 显示进程的安全上下文

? 显示「用户:角色:类型:安全级别」

SELinux问题分析

当SELinux处于enforcing模式下时某些程序的运行会失败,在这里总结此类问题的整体分析方法。

? 首先排除DAC权限的问题,使用“ls –l”检查相关文件的属主和权限。假设DAC的权限许可。则就是SELinux的策略显式地拒绝了当前操作的运行。

? 然后检查用户当前所扮演的角色。某些操作仅仅有特定的角色才有足够的权限运行。

? 进入permissive模式,从分析失败操作对应的AVC Denied Msg入手区分问题的根源。

时间: 2024-10-06 09:23:20

Android安全机制介绍的相关文章

Android Binder机制介绍

做过Android开发的同学可能有些体会,入门初期,工作内容主要是实现各式各样的UI界面,以及实现应用的业务逻辑.在这个阶段,我们会逐渐熟悉View系统,逐渐学会实现各种各样的界面以及动画效果.再往后,当我们想更深入的学习android系统,比如学习android四大组件的启动过程.AMS.PMS等等时,都会遇到一个叫做Binder的东西.结合笔者的经验,Binder可以说是深入理解Android系统的重要基础.binder作为android系统进程间通信的机制,贯穿在方方面面.我们平时使用最多

Android多媒体开发介绍(转)

Android多媒体开发介绍 转自:http://blog.csdn.net/reiliu/article/details/9060557 一.       多媒体架构 基于第三方PacketVideo公司的OpenCORE来实现,支持所有通用的音频/视频/静态图像格式,包括:MPEG4.H.264.MP3.AAC.AMR.JPG.PNG.GIF等.从功能上分为两部分,一是音/视频的回放(PlayBack),二是音视频的纪录(Recorder). CODEC(编解码器)使用OpenMAX 1L

第三章 Android绘图机制与处理技巧

1.屏幕尺寸信息 屏幕大小:屏幕对角线长度,单位“寸”:分辨率:手机屏幕像素点个数,例如720x1280分辨率:PPI(Pixels Per Inch):即DPI(Dots Per Inch),它是对角线的像素点数除以屏幕大小得到的:系统屏幕密度:android系统定义了几个标准的DPI值作为手机的固定DPI.(注,最后一个有笔误,正确的是1080x1920)独立像素密度(DP):android系统使用mdpi屏幕作为标准,在这个屏幕上1dp=1px,其他屏幕可以通过比例进行换算.在hdpi中,

Android 安全机制(1)uid 、 gid 与 pid

1.概述 Android 安全机制来源于Linux,并且以Linux权限管理为基础,要了解Android的安全机制,需要从linux中的安全机制了解开始,而用户的权限管理又是linux安全机制的最基本的一个组成 2.linux中的用户(UID).组(GID).进程(PID) 在 Linux 中,一个用户 UID 标示一个给定用户.Linux系统中的用户(UID)分为3类,即普通用户.根用户.系统用户. 普通用户是指所有使用Linux系统的真实用户,这类用户可以使用用户名及密码登录系统.Linux

android binder 机制二(client和普通server)

在讲它们之间的通信之前,我们先以MediaServer为例看看普通Server进程都在干些什么. int main() { -- // 获得ProcessState实例 sp<ProcessState> proc(ProcessState::self()); // 得到ServiceManager的Binder客户端实例 sp<IServiceManager> sm = defaultServiceManager(); -- // 通过ServiceManager的Binder客户

Android反射机制实现与原理

本文介绍Android反射机制实现与原理,在介绍之前,要和Java进行比较,所以先看下Java中的反射相关知识: 一.反射的概念及在Java中的类反射 反射主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.在计算机科学领域,反射是一类应用,它们能够自描述和自控制.这类应用通过某种机制来实现对自己行为的描述和检测,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义. 在Java中的反射机制,被称为Reflection(大家看到这个单词,第一个想法应该就是去开发文档中

Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用

在上一篇文章Android IPC机制(二)用Messenger进行进程间通信中我们介绍了使用Messenger来进行进程间通信的方法,但是我们能发现Messenger是以串行的方式来处理客户端发来的信息,如果有大量的消息发到服务端,服务端仍然一个一个的处理再响应客户端显然是不合适的.另外,Messenger用来进程间进行数据传递但是却不能满足跨进程的方法调用,接下来我们来使用AIDL来实现跨进程方法调用,此前我们都是用Eclipse来实现的,这次我们看看在Android Studio中使用AI

【转】Android 消息机制

Android 消息机制 本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础架构 首先,我们需要从整体架构上了解一下Android线程通信都做了哪些工作.我们都知道,进程是操作系统分配资源的最小单位,一个进程中可以启动多个线程来执行任务,这些线程可以共享进程的资源但不分配资源,这里讲的资源主要是只内存资源.Android的线程间消息传递机制其实和我

深入讲解Android Property机制

侯亮 1      概述 Android系统(本文以Android 4.4为准)的属性(Property)机制有点儿类似Windows系统的注册表,其中的每个属性被组织成简单的键值对(key/value)供外界使用. 我们可以通过在adb shell里敲入getprop命令来获取当前系统的所有属性内容,而且,我们还可以敲入类似“getprop 属性名”的命令来获取特定属性的值.另外,设置属性值的方法也很简单,只需敲入“setprop 属性名 新值”命令即可. 可是问题在于我们不想只认识到这个层次