SELinux配置property

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

android5.X之后,在system\core\init\property_service.c以及其他文件,没有看到对property_perms的定义。
在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。

在上一篇文章: http://blog.csdn.net/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;
也可以对prop进行设置,所以当其他的domain process无法设置prop时,可以添加allow语句添加权限。

总结:
SEAndroid对property的配置,和kikat4.4版本的AID配置一样,对应的前缀,指定对应的SContext即可。以及当其他domain的process需要设置property时,可以通过allow语句添加权限(不确定是否会违反neverallow).

你可能感兴趣的:(android移动开发)