前言
Android security model 基于:
- Linux 基于用户的保护 Linux user-based protection
- 保证APP对系统中其他进程的绝缘,APP不应该被其他APP或者进程直接读写数据或内存
- root 和系统进程是最常受到恶意攻击,所以保持最小数量的root和系统进程对于安全设备是至关重要的
- APK签名 APK Signing
- 用户权限 User Permissions
UID 和 GID
UID(User IDs)
- 每一个安装在系统的程序和资源都会获取一个UID,例如“u0_a15”
- 默认时,进程只能够访问同一个UID下的资源。也就是说,android为UID下的资源启动保护机制,禁止不同UID的进程访问
- 每一个APP都是在自己的sandbox中执行
UID 在android framework定义如下:
- root:0
- system:1000
- reserved for system use: >1000 and <10000
- Users applications (u0_a*): >= 10000
更多信息在
system/core/include/private/android_filesystem_config.h
#define AID_ROOT 0 /* traditional unix root user */
#define AID_SYSTEM 1000 /* system server */
#define AID_RADIO 1001 /* telephony subsystem, RIL */
...
#define AID_APP 10000 /* first app user */
...
static const struct android_id_info android_ids[] = {
{ "root", AID_ROOT, },
{ "system", AID_SYSTEM, },
{ "radio", AID_RADIO, },
GID
GID是一个包含一个或者多个user的唯一标示
Android用UID和GID为资源分配不同的特权,比如SD card、network。UID和GID映射在Linux权限下
默认时,系统为APP生成UID,你也可以在AndroidManifest.xml中指定
如果两个进程想要同一个UID,他们必须用同一个证书进行签名。
举例:system UID是1000,如果APP想使用这个UID,APP必须用platform签名并且设置UID
android:sharedUserId="android.id.system"
每一个用户至少是一个group的一员,默认时,GID和UID一样。一个用户也可能被列在多个group里。
当APP请求具有GID保护的权限时,APP将被加入到相应的group中。
以下文件的那个一了所有和Linux group相关的权限。
framework/base/data/etc/platform.xml
<permission name="android.permission.BLUETOOTH_ADMIN" >
<group gid="net_bt_admin" />
</permission>
<permission name="android.permission.BLUETOOTH" >
<group gid="net_bt" />
</permission>
怎么查找进程的UID, GID
启动APP的时候检查log
如果APP想要运行是查询GID,使用:
mContext.getPackageManger().getPackageGids("PACKAGE_NAME");
每一个GID都和一个特权相关,比如1006是Camera, 3003 network socket
APK signing
Android用signing作为一个作者标示的方式,并且在APP之间建立信任关系
signing并不等同加密,也并没有加密任何东西
证书是为了标示APP的作者
举例来说,证书分为:platform,shared, media
可以在Android.mk中定义sign的证书
LOCAL_PACKAGE_NAME := Bluetooth
LOCAL_CERTIFICATE := platform
所有的APP都必须经过证书signing。没有signing的APP是不能被安装的。
用SDK开发的时候,APP会被会SDK编译工具signing,用的是SDK build tools生成的debug key。这样signing的APP是没有办法发布的
生成自己的额key并且sign
方法1: key tool + jarsigner(available in JDK)
方法2: openssl + signapk
证书
证书全部在
“/build/target/product/security”
私有证书的类型
platform - a key for packages that are part of the core platform
shared - a key for things that are shared in the home/contacts process
media - a key for packages that are part of the media/download system
releasekey(testacy) - a generic key for packages that do noe otherwise specify a key
release key 用在商业ROM,testacy用在debug ROM
如果APP没有在Android.mk中定义 LOCAL_CERTIFICATE :=, 那么默认会被releasekey sign
Use Permission
如果一个APP想要使用系统特权,需要在AndroidManifest.xml中声明权限
APP 没有申请资源,访问受限的西苑会又SecurityException
Protection Level