摘要:1.SEAndroidapp分類SELinux(或SEAndroid)將app划分為主要三種類型(根據user不同,也有其他的domain類型):1)untrusted_app 第三方app,沒有android平台簽名,沒有system權限2)platform_app 有android平台簽名,沒有system權限3)system_app 有android平台簽名和system權限從上面划分,權限等級,理論上:
- 1.SEAndroid app分類
SELinux(或SEAndroid)將app划分為主要三種類型(根據user不同,也有其他的domain類型):
1)untrusted_app 第三方app,沒有android平台簽名,沒有system權限 2)platform_app 有android平台簽名,沒有system權限
3)system_app 有android平台簽名和system權限
從上面划分,權限等級,理論上:untrusted_app < platform_app < system_app
2.seapp_contexts定義external\sepolicy\seapp_contexts
isSystemServer=true domain=system_server user=system seinfo=platform domain=system_app type=system_app_data_file user=bluetooth seinfo=platform domain=bluetooth type=bluetooth_data_file user=nfc seinfo=platform domain=nfc type=nfc_data_file user=radio seinfo=platform domain=radio type=radio_data_file user=shared_relro domain=shared_relro user=shell seinfo=platform domain=shell type=shell_data_file user=_isolated domain=isolated_app levelFrom=user user=_app seinfo=platform domain=platform_app type=app_data_file levelFrom=user user=_app domain=untrusted_app type=app_data_file levelFrom=user
從上面可以看出,domain和type由user和seinfo兩個參數決定。 比如:
user=system seinfo=platform,domain才是system_app
user=_app,可以是untrusted_app或platform_app,如果seinfo=platform,則是platform_app。
3.user和seinfo判定方式首先看user,user可以理解為UID,例如ps -Z結果如下:
u:r:system_app:s0 system 2414 1172 com.android.keychain u:r:platform_app:s0 u0_a6 2439 1172 com.android.managedprovisioning u:r:untrusted_app:s0 u0_a8 2460 1172 com.android.onetimeinitializer u:r:system_app:s0 system 2480 1172 com.android.tv.settings u:r:untrusted_app:s0 u0_a27 2504 1172 com.android.email u:r:untrusted_app:s0 u0_a28 2523 1172 com.android.exchange u:r:untrusted_app:s0 u0_a7 2567 1172 com.android.musicfx
第一列是SContext,第二列是UID,只要UID是system的基本都是system_app,反過來一樣。 其他的U0_XXX要么屬於platform_app或untrusted_app
seinfo由external\sepolicy\mac_permissions.xml決定,內容如下:
<!-- Platform dev key in AOSP --> <signer signature="@PLATFORM" > <seinfo value="platform" /> </signer> <!-- All other keys --> <default> <seinfo value="default" /> </default>
即如果簽名是platform,seinfo就是platform,其他的比如shared等,seinfo是default。 比如上面ps -Z的結果里面,OneTimeInitializer.apk是untrusted_app,ManagedProvisioning.apk是platform_app。分別查看這兩個app的Android.mk
packages\apps\OneTimeInitializer\Android.mk 沒有定義LOCAL_CERTIFICATE,默認是shared
packages\apps\ManagedProvisioning\Android.mk 有定義LOCAL_CERTIFICATE := platform
因為ManagedProvisioning.apk有platform簽名,所以seinfo是platform。
TvSettings是system_app,查看對應的參數:
packages\apps\TvSettings\Settings\Android.mk 有定義LOCAL_CERTIFICATE := platform
packages\apps\TvSettings\Settings\AndroidManifest.xml 有定義android:sharedUserId="android.uid.system"
TvSettings user是system,seinfo是platform,所以是system_app
packages\apps\ManagedProvisioning\AndroidManifest.xml 沒有定義android:sharedUserId="android.uid.system"
所以ManagedProvisioning雖然seinfo是platform,但是user不是system,因此只是platform_app,而不是system_app。
4.app對應的te文件 system_app -> external\sepolicy\system_app.te untrusted_app -> external\sepolicy\untrusted_app.te platform_app -> external\sepolicy\platform_app.te 對應的權限,通過allow語句給予,比如只有system_app才可以設置prop:# Write to properties unix_socket_connect(system_app, property, init) allow system_app debug_prop:property_service set; allow system_app net_radio_prop:property_service set; allow system_app system_radio_prop:property_service set; auditallow system_app net_radio_prop:property_service set; auditallow system_app system_radio_prop:property_service set; allow system_app system_prop:property_service set; allow system_app ctl_bugreport_prop:property_service set; allow system_app logd_prop:property_service set;
總結: 在引入SEAndroid后,app開發需要注意需要哪些權限,根據配置(shareuid和簽名)來決定domain,從而決定權限大小。