Android系统权限及签名

Android系统权限及签名

2015-03-23 19:13:33CSDN-chen52671-点击数:
50

Android权限及签名

引子

现象:系统中的一个定制Service,服务是对外开放的,使用系统签名

LOCAL_CERTIFICATE := platform

应用层调用这个系统服务,获取底层的一些信息。如果在IDE里进行开发,普通签名,无法调用到该服务, 改成在系统编译环境里编译,并在Android.mk中加入如下语句:

LOCAL_CERTIFICATE := platformandroid:sharedUserId="android.uid.system“android:process="com.android.phone"

就可以顺利的获取到系统服务。其内在的原因是什么?

Linux权限

说起Android的权限和签名,就要先从Linux的权限说起,我们都知道Linux的文件系统是有权限限制的,对于每一个文件或者目录,我们执行 ls -l 指令都会看到类似如下的显示: -rw-r–r–  1 xxxxx xxxxx  681 2013-05-24 09:16 Android.mk 分别代表:文件种类和权限;硬链接个数;User;Group;大小;最后访问/修改时间;文件/目录名  文件权限代表是否对对应用户,用户组,其他用户开放读或者写权限。而User;Group则是代表了该文件是属于谁的,比如用户ABC创建的一个文件,该文件的User则为ABC。linux就是通过文件权限和用户用户组这种方式来保证安全的。 而文件权限是通过进程来体现的,用户访问一个文件,总是要通过进程来访问,即便是打开一个终端界面,也是打开了一个bash进程来查看文件的。 就如下图所示: 图1

对于Android而言,启动一个Application,一般同样要启动一个单独的进程来运行,就像这样:

drwxr-x--x u0_a49   u0_a49            2013-01-01 08:00 com.example.testdrwxr-x--x radio    radio                  2013-01-03 06:35 com.android.phone

上面的test应用启动了一个单独的进程,它的用户的用户组都是u0_a49。这样如果没有意外的话,其只能访问到该应用自己的data数据。 问题来了,如果我想访问其他不适自己data的文件及目录该怎么办呢?首先想到的就是能不能把自定义的应用的用户组改成和其他某应用一样呢?比如User改成radio。

答案是可以的。不过Android为了保证系统安全,还有个规定: 必须在AndroidManifest.xml具有相同签名+相同shareUserId属性的两个App,才可以分配相同的用户ID。因为com.android.phone是系统应用,其签名是LOCAL_CERTIFICATE := platform 系统签名,所以我必须同样采用LOCAL_CERTIFICATE := platform系统签名,并且android:sharedUserId=”android.uid.radio” 才可以让这个自定义的App和phone应用具有相同的UID。(当然如果只是想访问,android:sharedUserId可以设为更高权限的用户也可以实现)。

AndroidManifest.xml中还有一个标签android:process,比如:android:process=”com.android.phone”,它可以单独应用于某个Activity或者Service,也可以直接应用于Application。作用就是将对应的Activity或者Service放在com.android.phone这个进程中运行。而使用这个标签的前提就是前一段所说的:具有相同签名+相同shareUserId属性。 标签android:process的作用比如phone应用中运行的某个动态库或者持有的某个单例对象,如果另外一个app想要使用或者说调用的话,是没法使用,或者拿到的是另外一个单例—因为是另一个进程了。这个时候通过android:process将对于的Activity让其在phone进程中运行。这样就可以很方便的使用phone应用中的资源了。 图2

签名和APK的关系:通常APK对于的是Linux中的User和Process。APK的运行,就代表一个独特的进程的运行,而该进程又属于某个User。具有相同签名和相同shareUserId属性的两个APK,才会属于同一个User.(APK安装时,PackageManagerService会检查) 签名和权限的关系:签名是为了让系统识别是不是同一个作者,除了前面提到的系统签名外,每个作者都可以自定义自己的签名。对于签名级的权限,比如一个作者的应用定义了一个权限。并设置权限的android:protectionLevel 为”signature”。那么只有该作者使用同样签名的另一个应用,才可以使用该权限。

Root后的手机呢

为什么root后就可以无视那些权限呢? 拿一个root过得手机,执行如下代码:

Process process = Runtime.getRuntime().exec("su");os = new DataOutputStream(process.getOutputStream());  os.writeBytes(“echo 1500000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq" + "/n"); 

su程序的权限如下所示:

System/bin/su-rwsr-xr-x root root 

关键就是那个执行权限标志位S,代表当任何用户执行该文件时,都拥有该文件所有者的权限—–root。 当然这里说的比较简略,其实在应用执行root权限操作的时候,向Superuser.apk申请超级用户请求, Superuser.apk利用系统漏洞,执行类似如下的操作。让su程序居然这些功能。

cp /data/tmp/su /system/bin/chown root:root su chmod 4775 /system/bin/su 

这样上面修改cpu频率的语句就可以顺利执行。

Q&A

Q:android:sharedUserId和android:process的关系? A:sharedUserId是对整个apk而言, android:process则是对某一个activity或者servicce而言,很多时候sharedUserId是android:process的前提 Q:android:sharedUserId和android:process分别对应用来说有什么作用。 A:sharedUserId可以让应用的uid变成类似system,phone,虽然没有root用户权限高,但是也可以做很多事了,具体要看其需求。具有phone的uid,然后才可以设定应用内的activity的android:process属性。 使用android:process的原因很多: a)比如Stk应用,想要使用CatService(单例模式),于是它调用CatService.getInstance(),调用时如果已经存在CatService实例才会正确返回,该实例还没有建立,是拿不到的。而这个CatService是在Phone应用中,使用CommandsInterface 对象(Ril)作为参数建立。这是就需要把Stk应用放在Phone进程里,才可以拿到CatService实例。 b)又或者想要设计一个系统应用,想要调用Phone  phone = PhoneFactory.getDefaultPhone()获得Phone对象,但是这个调用只能运行在phone进程中(原因见该函数源码)。这就必须把调用该语句的activity设为android:process=“com.android.phone“——如Setting里的IccLockSettings。

时间: 2024-10-05 05:42:00

Android系统权限及签名的相关文章

对Android系统权限的认识

Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制 Android系统权限相关的内容 (一)linux文件系统上的权限 -rwxr-x--x system system 4156 2012-06-30 16:12 test.apk. 代表的是相应的用户/用户组及其他人对此文件的访问权限,与此文件运行起来具有的权限完全不相关. 比如上面的例子只能说明system用户拥有对此文件的读写执行权限:system组的用户对此文件拥有读.执行权限:其

Android系统权限管理

权限分级? Android系统中包含一般的权限和URI权限. 传统Android权限按照危险程度分为normal, dangerous, signature和signatureOrSystem.其中不同的权限根据签名或是否系统应用分配给第三方程序. URI权限用于权限临时分配,让其直接用户处理特定敏感数据.如电子邮件程序需要图片浏览器查看图片,而用户的电子邮件是用户隐私,不能使用传统的方式直接分配权限,只想让图片浏览器暂时只能读取特定图片. 权限如何添加和验证? Android权限通过两种方式声

android系统权限SET_PREFERRED_APPLICATIONS怎么获取

最近自己写个demo,需要用到SET_PREFERRED_APPLICATIONS权限 在网上找了半天,大概有两种方式: 1. 将手机root后,把apk强行push到system/app目录下,重启手机 2.SET_PREFERRED_APPLICATIONS是系统权限,需要有系统的shareUserID和签名 第一种尝试过,不行 第二种方式,因为用的是自己公司的手机,知道一种shareUserId和签名, 但是发现只有一部手机可用,其他手机都不能用 提示错误: java.lang.Secur

Android系统权限

android.permission.ACCESS_CHECKIN_PROPERTIES//允许读写访问"properties"表在checkin数据库中,改值可以修改上传android.permission.ACCESS_COARSE_LOCATION //允许一个程序访问CellID或WiFi热点来获取粗略的位置android.permission.ACCESS_FINE_LOCATION //允许一个程序访问精良位置(如GPS)android.permission.ACCESS_

[转]通过apk签名使应用程序有系统权限

[转]通过apk签名使应用程序有系统权限 (2013-01-08 13:40:50) 转载▼ it 分类: Android 出处:http://blog.csdn.net/doom66151/article/details/7085464 问题: 系统预装软件,需要访问一些配置文件,配置文件的owner都是设置为system.所以应用程序需要有授权才可以读写. google搜索找到以下文章,解决了这个问题. 以下内容解释了: android系统权限规则? 如何使应用程序获取系统权限? apk签名

Android动态权限申请

从Android 6.0开始,权限不再是在manifest文件中粘贴一下即可,这时候权限也正式走进大家的视野.项目的6.0适配就是我做的,当时没有仔细总结,最近在另一个项目添加权限的时候发现,同一个功能都没有添加申请权限的代码,一个会挂一个不会,花了几个小时在这个小问题上.因此多花点时间总结一下权限问题. Android系统权限的概念 Android是一个权限分隔的操作系统,每个应用都有独特的系统标识.一般情况下,应用没有权限执行对其它应用.系统.用户可能有不利影响的操作.每个应用都在应用沙盒中

(转)Android平台上如何让应用程序获得系统权限以及如何使用platform密钥给apk签名

Android中许多函数只能是系统程序或者有root权限的程序才可以调用,否则会有"Permission denied"异常.所以如果开发时要调用此类函数,必须授予程序root权限.下面是两种具体的实现方法,来自于<http://lufengdie.iteye.com/blog/918975>,我用的是方法二,方法一没有用过. 注:两种方法都不一定适用于所有android系统. 方法一:需要在Android系统源码的环境下用make来编译: 在应用程序的 AndroidMa

Android之——利用系统权限实现手机重启

在应用开发时经常会有这样的需求,如何在应用里用代码让手机重启,另外,我们知道在重启之后,我们的应用可以注册广播接收者,以保证我们的应用会第一个将我们的服务开启起来,这样我们的代码就可以第一个接收到接收短信的广播事件.好了,现在就让我们一起来实现一个利用系统权限实现手机重启的示例吧. 一.实现 我们实现很简单,就是给界面一个按钮,然后设置按钮的点击事情,在点击事件里完成手机重启操作. 1.布局文件 布局文件很简单,就是放置了一个Button按钮,设置点击事件. 具体代码如下: <LinearLay

Android如何通过shareduserid获取系统权限

转载:http://my.oschina.net/zhoulc/blog/119282 android会为每个apk进程分配一个单独的空间(比如只能访问/data/data/自己包名下面的文件),一般情况下apk之间是禁止相互访问数据的.通 过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样(使用IPC机制,