您的位置:首页 > 移动开发 > Android开发

Android Security Model

2015-11-07 12:16 661 查看

前言

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: