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

Android应用分类和安全Domain

2016-04-25 16:26 302 查看

Android系统应用

System APP vs. (Non-system) Ordinary APP

在Android系统中,应用可以分为系统应用(安装在/system/app分区上的)和非系统应用(安装在/data/app分区上的)。由于没有root权限的话/system分区是只读的,因此普通用户无法卸载系统应用。

注意系统应用和是否用ROM platform key签名没有关系,一个用platform key签名的应用也可以安装在普通/data/app分区上。用platform key签名的APP可以访问某些signatureOrSystem权限的操作。比如,静默安装和卸载其他非系统应用(background installation or uninstallation)的权限。

系统应用拥有某些system-only的权限,这些权限普通应用是无法访问的。注意,这里所说的权限和root/sudo/su权限是不同的。比如,Android 2.3之前允许普通应用重置系统中错过的电话计数(missed call),而这一权限从Android 2.3开始,是一个只有system-only的权限。如果一个重置上面的计数的应用被放置在/system分区,那么该应用不需要root权限就能使用重置功能。类似的系统权限还比如禁止(Disable)设置gps mock location.

系统应用可以像普通应用一样升级,但是升级后的APP不会放到原有的ROM中,相比普通应用,系统应用有一个特殊能力就是能重置到ROM第一次安装时的版本。

系统应用不能像普通应用一样移动到外部的SD卡上,如果卸载了系统应用的升级版本,那么升级版本占用的内部空间会释放。

Privileged系统应用

从Android 4.4 KK起(之前系统分区中的APP都有signatureOrSystem permission),为了进一步控制好系统权限,对系统应用进一步区分成了Privileged和Non-Privileged. 只有Privileged系统应用才具有系统权限 (“system”-level permission),而Privileged系统应用就是那些APK文件被放在/system/priv-app中的系统应用。比如WRITE_SECURE_SETTINGS的权限,在/system/app中的系统应用是无法访问的,只有Privileged系统应用才可以(APK在/system/priv-app中),这里的系统应用无需platform证书,就有signatureOrSystem权限。

Android系统中判断一个应用是否是系统应用还是用ApplicationInfo.FLAG_SYSTEM (表明应用在/system分区上),KK后新增了一个隐藏标志FLAG_PRIVILEGED来表示Priveleged系统应用。

Android APP的SE Context domain类别

应用的domain可以分成以下几个类别,具体的定义可以参考AOSP代码external/sepolicy/*_app.te.

platform_app

“Apps signed with platform key.” 用platform key签名的APP。比如,用于安装包的PackageInstaller.

system_app

“Apps that run with the system UID”, 比如com.android.settings. 注意system app的权限和system server不同。

untrusted_app

“Apps are labeled based on mac_permissions.xml and seapp_contexts”.

在目前的AOSP(M)中,所有non-system apps而且没有用platform key签名的system app的domain均为untrusted_app.

isolated_app

“APP with UID between AID_ISOLATED_START (99000) and AID_ISOLATED_END (99999)”. chrome sandbox isolated process.

系统应用,platform签名,安全域

System app?Platform signed?安装位置有权限signatureOrSystem?Security Domain
YESYES/system/appYESplatform_app
YESNO/system/app(< KK) YES; (>=KK) apk在/system/priv-app -> YES,否则NOProcess User:如果是system,那么是system_app,否则是untrusted_app/isolated_app
NOYES/data/appYESplatform_app
NONO/data/appNOuntrusted_app/isolated_app

查看APP运行时的Domain

如何查看一个APP的Domain

启动APP,用ADB shell ps命令找到该APP对应的进程PID

ps -Z PID

如何查看系统中某个Domain的进程

例如查看属于’platform_app’ domain的进程可以用如下命令:

ps -Z | grep 'platform_app'


Reference

[1]http://android.stackexchange.com/questions/17871/what-are-the-differences-between-a-system-app-and-user-app

[2]http://stackoverflow.com/questions/19868138/aosp-privileged-vs-system-app

[3]https://groups.google.com/forum/#!topic/android-platform/Vsa4IsJcOPE

[4]https://www.ricston.com/blog/explaining-behavior-android-application-system-apps-nonsystem-apps/

[5]http://stackoverflow.com/questions/28914215/is-it-possible-to-use-the-package-name-as-the-domain-name-in-android-selinux
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: