android uid 跟 gid 安全机制
www.MyException.Cn 发布于:2012-12-29 10:28:09 浏览:15次
-
android uid 和 gid 安全机制
Android系统是基于Linux内核的,也继承了Linux的基于用户和文件权限的安全机制,并将这种机制用于管理应用程序。
Linux系统对用户的管理:Linux系统可以有多个用户,每个用户都有一个用户名:UserName,同时拥有一个UserID,两者是一一对应的。每个用户可以属于一个或者多个组。
Linux系统的文件权限机制:每个文件都是属于某个用户的,这个用户称作文件的所有者。文件对于所有者、所有者所在组的用户、以及其它任意用户分别开放了不同的操作权限,操作权限分为:读、写、运行三种。只有获得了文件操作权限的应用才能对文件做相应的操作。这就保护了文件的安全性,保证用户对自己不具备权限的文件是不能进行操作。但是,这种机制太过于机械,有时候需要一定的灵活性,所以就出现了超级用户:root,用户root对所有的文件拥有所有权限。-----我的理解:这是一种对静态文件进行保护的安全机制,即文件对用户开放的权限,是指这个文件被操作的权限。
进一步的解释:所谓某用户对文件具有操作权限。除了在控制台中,直接以用户设分手动进行操作,大多数情况下,所谓用户的操作,就是指用户所运行的进程的操作。以某用户身份运行某个进程时,默认地这个进程所拥有的权限,就是用户的权限。当用户对某个文件拥有读权限时,这个进程就可以读这个文件;当用户对某个文件拥有写权限时,这个进程就可以对这个文件进行改写;当用户对某个目录有些权限时,该进程就可以在目录中创建文件,所创建的文件的归该用户所有。----这时候,这个进程的权限,是主动权限,即进程主动对某些文件进行操作的权限。
用户运行的进程默认的只能拥有用户的操作权限,而不管这个进程对应的程序文件本身有什么权限。这太死板。有时候,某些进程需要临时进行一些root用户才有权限执行的操作。为了满足这种需求,就出现了下面的两个权限:
另外,还有两个很特殊的权限,不是对文件进行描述的,而是对文件运行时的进程进行规定的权限,分别对应为setuid和setgid。拥有这两个权限的文件,在运行时,其runner会获得root权限。
Android,在应用安装成功后,就为其指定了一个系统中唯一的UserName,对应着系统中唯一的UID。这个UserName和UID实际上就是传统上的Linux的userName和UID。
转自http://inspurhjx.blog.163.com/blog/static/201579055201211411036973/
转】Android权限之共享UID和签名
共享UID
安装在设备中的每一个Android包文件(.apk)都会被分配到一个属于自己的统一的Linux用户ID,并且为它创建一个沙箱,以防止影响其他应用程序(或者其他应用程序影响它)。用户ID 在应用程序安装到设备中时被分配,并且在这个设备中保持它的永久性。
通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据. 也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.
对于一个APK来说,如果要使用某个共享UID的话,必须做三步:
1、在Manifest节点中增加Android:sharedUserId属性。
2、在Android.mk中增加LOCAL_CERTIFICATE的定义。
如果增加了上面的属性但没有定义与之对应的LOCAL_CERTIFICATE的话,APK是安装不上去的。提示错误是:Package com.test.MyTest has no signatures that match those in shared user Android.uid.system; ignoring!也就是说,仅有相同签名和相同sharedUserID标签的两个应用程序签名都会被分配相同的用户ID。例如所有和media/download相关的APK都使用android.media作为sharedUserId的话,那么它们必须有相同的签名media。
3、把APK的源码放到packages/apps/目录下,用mm进行编译。
举例说明一下。
系统中所有使用Android.uid.system作为共享UID的APK,都会首先在manifest节点中增加android:sharedUserId="android.uid.system",然后在Android.mk中增加LOCAL_CERTIFICATE := platform。可以参见Settings等
系统中所有使用Android.uid.shared作为共享UID的APK,都会在manifest节点中增加android:sharedUserId="android.uid.shared",然后在Android.mk中增加LOCAL_CERTIFICATE := shared。可以参见Launcher等
系统中所有使用Android.media作为共享UID的APK,都会在manifest节点中增加android:sharedUserId="android.media",然后在Android.mk中增加LOCAL_CERTIFICATE := media。可以参见Gallery等。
另外,应用创建的任何文件都会被赋予应用的用户标识,并且正常情况下不能被其他包访问。当通过getSharedPreferences(String,int)、openFileOutput(String、int)或者openOrCreate Database(String、int、SQLiteDatabase.CursorFactory)创建一个新文件时,开发者可以同时或分别使用MODE_WORLD_READABLE和MODE_WORLD_RITEABLE标志允许其他包读/写此文件。当设置了这些标志后,这个文件仍然属于自己的应用程序,但是它的全局读/写和读/写权限已经设置,所以其他任何应用程序可以看到它。
关于签名:
build/target/product/security目录中有四组默认签名供Android.mk在编译APK使用:
1、testkey:普通APK,默认情况下使用。
2、platform:该APK完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system。
3、shared:该APK需要和home/contacts进程共享数据。
4、media:该APK是media/download系统中的一环。
应用程序的Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.
转自:http://www.linuxidc.com/Linux/2011-03/33279.htm