第九章 Android 安全访问机制
Android 是一个多进程系统,在这个系统中,应用程序(或者系统的部分)会在自己的进程
中运行。系统和应用之间的安全性通过 Linux 的 facilities(工具,功能)在进程级别来强制
实现的,比如会给应用程序分配 user ID 和 Group ID。更细化的安全特性是通过"Permission"
机制对特定的进程的特定的操作进行限制,而"per-URI permissions"可以对获取特定数据的
access 专门权限进行限制。 所以,应用程序之间的一般是不可以互相访问的,但是 anroid
提供了一种 permission 机制,用于应用程序之间数据和功能的安全访问。
9.1 安全架构
Android 安全架构中一个中心思想就是:应用程序在默认的情况下不可以执行任何对其他应
用程序,系统或者用户带来负面影响的操作。这包括读或写用户的私有数据(如联系人数据
或 email 数据),读或写另一个应用程序的文件,网络连接,保持设备处于非睡眠状态。
一个应用程序的进程就是一个安全的沙盒。它不能干扰其它应用程序,除非显式地声明了
“permissions”,以便它能够获取基本沙盒所不具备的额外的能力。它请求的这些权限
“permissions”可以被各种各样的操作处理,如自动允许该权限或者通过用户提示或者证书来
禁止该权限。应用程序 需要的那些“permissions”是静态的在程序中声明,所以他们会在程
序安装时被知晓,并不会再改变。
所有的 Android 应用程序(。apk 文件)必须用证书进行签名认证,而这个证书的私钥是由
开发者保有的。该证书可以用以识别应用程序的作者。该证书也不需要 CA 签名认证(注:
CA 就是一个第三方的证书认证机构,如 verisign 等)。Android 应用程序允许而且一般也都
是使用 self- signed 证书(即自签名证书)。证书是用于在应用程序之间建立信任关系,而不
是用于控制程序是否可以安装。签名影响安全性的最重要的方式是通过决定谁可以进入基于
签名的 permisssions,以及谁可以 share 用户 IDs。
9.2 用户 IDs 和文件存取
每一个 Android 应用程序(。apk 文件)都会在安装时就分配一个独有的 Linux 用户 ID,这
就为它建立了一个沙盒,使其不能与其他应用程序进行接触(也不会让其它应用程序接触它)。
这个用户 ID 会在安装时分配给它,并在该设备上一直保持同一个数值。
由于安全性限制措施是发生在进程级,所以两个 package 中的代码不会运行在同一个进程当
中,他们要作为不同的 Linux 用户出现。我们可以通过 使用 AndroidManifest。xml 文件中
的 manifest 标签中的 sharedUserId 属性,来使不同的 package 共用同一个用户 ID。通过这
种方式,这两个 package 就会被认为是同一个应用程序,拥有同一个用户 ID(实际不一定),
并且拥有同样的文件存取权限。注意:为了保持安全,只有当两个应用程序被同一个签名签
署的时候(并且请求了同一个 sharedUserId)才会被分配同样的用户 ID。