一、Android延用的linux权限模型

1.1 android沙箱

Android 系统中,应用是在Dalvik 虚拟机实例三运行的,而每一个虚拟机都是一个独立都进程,而在linux中,每一个进程都是相互隔离的,Android 这种基于 Linux 的进程 “沙箱” 机制,是整个安全设计的基础之一。

因为Android是继承于linux,因此继承了linux用户管理的特点,并根据移动端的特点进行了优化。

Android 沙箱的核心机制基于以下几个概念:

1、标准的 Linux 进程隔离;

2、大多数进程拥有唯一的用户 ID(UID);

3、以及严格限制文件系统权限。

1.2 AID

Android 系统沿用了 Linux 的 UID/GID 权限模型,即用户 ID 和用户组 ID,但并没有使用传统的 passwd 和 group 文件来存储用户与用户组的认证凭据,作为替代,Android 定义了从名称到独特标识符 Android ID(AID)的映射表。初始的 AID 映射表包含了一些与特权用户及系统关键用户(如 system 用户 / 用户组)对应的静态保留条目。

除了AID外,android还使用了辅助权限,如sdcard的读写。

1.3 UID

在 linux 中,一个用户标识(UID)识别一个给定用户;在 Android 上,一个 UID 则识别一个应用程序。在安装应用程序时向其分配 UID。应用程序在设备上存续期间内,其 UID 保持不变。

单两个app在manifest中配置了同样的UID,并且两个app签名一样,那么这两个app将运行在同一个用户下。


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

package="com.android.demo.a1"

android:sharedUserId="com.c">

如下图所示,使用ps命令,看到两个进程的id都是不同的,但是用户id一致,都是u0_a73

img

如果需要让两个activity运行在同一个进程下,需要给两个应用的application设置以下属性。

官方解析:https://developer.android.com/guide/topics/manifest/application-element#proc

<application android:process="com.cienet.test"

img

需要注意的是:即使设置了该属性,两个不同的应用也不能同时在同一个进程中执行!一个应用执行,另一个相应必定被关闭。

img

二、Android沙箱模型

2.1 应用程序在独立的进程

应用程序进程之间,应用程序与操作系统之间的安全性由 Linux 操作系统的标准进程级安全机制实现。在默认状态下,应用程序之间无法交互,运行在进程沙箱内的应用程序没有被分配权限,无法访问系统或资源。

img

Android 是一个多用户系统,每个应用是一个独立的用户。

系统为每个应用分配一个唯一的用户标识(UID),并为应用中所有文件设置该用户才能访问的权限。
每个进程中有一个独立的 VM。
每个应用在自己的进程中运行,应用的组件需要执行时,系统创建该进程;当系统内存不存时,系统会销毁该进程。

2.2 应用程序在同一个用户下(共享 UID)

官方解析:https://developer.android.com/guide/topics/manifest/manifest-element#uid

img

默认情况下,不同的Android应用运行在不同的独立的进程下,而在很多情况下,源自同一开发者或同一开发机构的应用程序,相互间存在信任关系,因此Android 系统提供一种所谓共享 UID(SharedUserID)机制。

通过该机制,不同的应用可以运行在统一进程中,共享彼此之间的数据和资源。

img

要达到这个效果,需要下面两个条件:
1、uid相同
2、签名相同

注意:
应用仍然是独立的进程,只是它们共处同一用户下,也就拥有了相同的文件访问权限,因此就能访问彼此之间的资源包括class,但是不能访问彼此之间的堆栈中的数据。

参考地址

https://blog.csdn.net/ljheee/article/details/53191397