Android 与Linux分别有自己一套严格权限机制
1.linux权限
只有体现到文件系统上才使用linux权限设置
-rwxr-x–x system system test.apk
用户-用户组-其他用户
1.1SUID和SGID、stick bit(粘贴位)
1.数字
chmod 0777 test.txt :表示没有设置SUID. SGID . sticky bit相关
chmod 4777 test :表示设置了SUID -rwsr-xr-x
2.字母
rwsrw-r-- 表示有setuid标志 (rwxrw-r--:rwsrw-r--)
rwxrwsrw- 表示有setgid标志 (rwxrwxrw-:rwxrwsrw-)
rwxrw-rwt 表示有sticky标志 (rwxrw-rwx:rwxrw-rwt)
- SUID(4) :设置了该位可执行文件,被执行时,将以所有者的权限运行。如果所有者是 root 的话,那么执行人就有超级用户的特权了。
-rws--x--x
. - SGID(2):设置了该位可执行文件,运行时拥有该文件组的权限。如果是目录,被复制到这个目录下被设置和这个目录一样。除非加
-p
(perserve)参数。 - stick bit(1):程序运行完在内存中有备份,也可以是目录。只有拥有者或root才能删除。
1.2设备权限
Android系统启动时候,内核引导参数上会这设置init=/init,此时内核挂载成功了这个系统,首先运行这个根目录下init程序。第一个用户进程。增加设备节点时,需要更改system/core/init/devices.c
中文件,其中
static struct perms_ devperms[]={"/dev/tty",0666,AID_ROOT,AID_ROOT,0}
用户名相关id
static struct android_id_info android_ids[]={"root",AID_ROOT}
android_dirs
定义子目录属性
static struct fs_path_config android_dirs[]={00770,AID_SYSTEM,AID_CACHE,“cache”}
Android_files
定义了默认文件属性
static struct fs_path_config android_files[]={00555,AID_ROOT,AID_ROOT,"system/etc/ppp/ip-up"}
2.Android权限
2.1Android中apk签名
android系统有的权限是基于签名的:system等级权限有专门对应签名,签名不对,权限也获取不到。默认的apk是debug签名。
2.1.1apk签名的原理
a.消息摘要-Message Digest
摘要不是签名。
消息摘要就是再消息数据上执行一个单向hash函数,生成一个固定长度的hash值。这个hash值即消息摘要也称为数字指纹。消息摘要有以下特点:
- 1.消息摘要无法推算出消息本身
- 2.如果修改了了消息,那么摘要一定会变化。(长明文生成短摘要hash必然会产生碰撞)
准确说:很难找到一种模式,修改了消息,但它摘要不会变化。
消息摘要就是md5值,注意,消息摘要只能保证完整性,不能保证消息不可篡改性。
md5/SHA-0 SHA-1:这些摘要生成算法,和签名无关。签名只是借助了摘要技术。
b.数字签名-signature
数字签名信息发送者用自己的私钥对消息摘要加密产生一个字符串。(改字符串是对发送信息真实性的证明)
数字签名过程:
1.发送者将私钥加密信息摘要的字符串和原文一起传送给接收者。
2.接收者只有用对应的公钥解密字符串得到信息摘要,然后与用原文的产生的信息摘要进行比对。如果相同信息,说明是完整的,传输过程没有被修改。
数字签名是非对称密钥加密技术、+数字摘要技术结合
c.数字证书-certificate
数字证书是一个经证书授权 中心数字签名的包含公开密钥拥有者信息,以及公开密钥的文件。
CERT.RSA包含一个数字签名和一个数字证书。
Android apk中CERT.RSA证书是自签名的,并不需要这个证书第三方权威机构认证的,
用户可以在本地机器自行生成这个自签名证书。
2.2基于UserID进程级别安全机制
Android每个APK分配唯一的linux userID(进程名:app_)。
Android提供一个机制:
AndroidManifest.xml中利用sharedUserId属性给不同package分配相同的userId,
这样可以当成一个程序,分配给两个程序相同UserID。但是安全,两个必须APK相同签名。
2.3AndroidManifest.xml
- MODE_WORLD_READABLE、全局读写。现在版本可能不可了。
2.4提升用户权限
- a.Android:shareUserId=”android.uid.system”
android.mk中添加 LOCAL_CERTIFICATE:=platform#其实就是签名
提升到system,但是root还是不能访问。 - b.Runtime.getRuntime().exec(String command);
Runtime.getRuntime().exec("/system/xbin/su");
- 由init启动的Service,来帮助Android应用程序执行root权限的命令或者实现一个虚拟设备,这个设备帮助Android应用程序执行root权限的命令。
- uperuser.apk