property是android常用的一个TOOL(可以理解为TOOL),使用起来非常方便,不管是Java层还是c++层,都可以使用property。
1.非SEAndroid property限定
android 5.X之前,例如kikat4.4 :
system\core\init\property_service.c
property_perms[] = {
{ "ril.", AID_RADIO, 0 },
{ "gsm.", AID_RADIO, 0 },
{ "persist.radio", AID_RADIO, 0 },
{ "net.dns", AID_RADIO, 0 },
{ "sys.usb.config", AID_RADIO, 0 },
{ "net.", AID_SYSTEM, 0 },
{ "dev.", AID_SYSTEM, 0 },
{ "runtime.", AID_SYSTEM, 0 },
{ "hw.", AID_SYSTEM, 0 },
{ "sys.", AID_SYSTEM, 0 },
{ "sys.powerctl", AID_SHELL, 0 },
{ "service.", AID_SYSTEM, 0 },
{ "wlan.", AID_SYSTEM, 0 },
property根据AID不同,只能操作指定前缀的属性。比如gsm.* 只能是AID_RADIO process可以set & get,其他USER则无法设置此前缀的property。
AID和UID有如下对应关系:
system\core\include\private\android_filesystem_config.h
#define AID_SYSTEM 1000 /* system server */
#define AID_RADIO 1001 /* telephony subsystem, RIL */
#define AID_BLUETOOTH 1002 /* bluetooth subsystem */
#define AID_GRAPHICS 1003 /* graphics devices */
#define AID_INPUT 1004 /* input devices */
#define AID_AUDIO 1005 /* audio devices */
#define AID_CAMERA 1006 /* camera devices */
#define AID_LOG 1007 /* log devices */
#define AID_COMPASS 1008 /* compass device */
#define AID_MOUNT 1009 /* mountd socket */
#define AID_WIFI 1010 /* wifi subsystem */
通过busybox ps可以查看进程的UID:
PID USER TIME COMMAND
1741 10004 0:00 {d.process.media} android.process.media
1804 10011 0:01 {ndroid.systemui} com.android.systemui
1987 10005 0:00 {externalstorage} com.android.externalstorage
2083 10038 0:00 {utmethod.pinyin} com.android.inputmethod.pinyin
2176 1001 0:00 {m.android.phone} com.android.phone
2195 1000 0:01 {droid.launcher3} com.android.launcher3
在TvSettings.apk写demo验证:
SystemProperties.set("jacky.debug.prop","1");
SystemProperties.set("log.jacky.prop","1");
SystemProperties.set("gsm.jacky.prop","1");
get到结果:
[gsm.jacky.prop]: [1]
[jacky.debug.prop]: [1]
[log.jacky.prop]: [1]
gsm和log前缀对于kikat4.4,UID=1000的process是无法设置的,但是在android 5.1平台可以设置,说明android 5.X后已经没有对property前缀的限制了。
2.SEAndroid对property配置
在property_service.c里面没有对property的限制了,但是在SEAndroid还是有根据前缀,给予不同的SContext。
external\sepolicy\property_contexts
net. u:object_r:system_prop:s0
dev. u:object_r:system_prop:s0
runtime. u:object_r:system_prop:s0
hw. u:object_r:system_prop:s0
sys. u:object_r:system_prop:s0
sys.powerctl u:object_r:powerctl_prop:s0
service. u:object_r:system_prop:s0
wlan. u:object_r:system_prop:s0
dhcp. u:object_r:dhcp_prop:s0
dhcp.bt-pan.result u:object_r:pan_result_prop:s0
bluetooth. u:object_r:bluetooth_prop:s0
类似以前版本,不同的前缀,对应不同的AID,这里对应不同的Scontext。
在上一篇文章<SELinux app配置>:
http://blog.youkuaiyun.com/zhudaozhuan/article/details/50964832
有介绍,对于app,只有domain为system_app的process才可以进行prop相关操作。
因此当我们需要客制化property前缀试,需要在property_contexts进行相关的配置。
例如:
ms.media. u:object_r:audio_prop:s0
ms.dvfs. u:object_r:audio_prop:s0
其他domain,比如surfaceflinger.te中配置:
# Set properties.
allow surfaceflinger system_prop:property_service set;
allow surfaceflinger ctl_bootanim_prop:property_service set;
allow surfaceflinger system_prop:property_service set;
allow surfaceflinger ctl_bootanim_prop:property_service set;
也可以对prop进行设置,所以当其他的domain process无法设置prop时,可以添加allow语句添加权限。
总结:
SEAndroid对property的配置,和kikat4.4版本的AID配置一样,对应的前缀,指定对应的SContext即可。以及当其他domain的process需要设置property时,可以通过allow语句添加权限(不确定是否会违反neverallow).