Android Q system_app默认写persist.sys.系统属性SEliux权限来源

自己在调试Settings.apk时。

发现作为平台系统签名应用竟然无权限给一个自定义的persist.st_nfc_debug系统属性签名。

修改成persist.sys.开头的命名竟然可以。

虽然最后自己以一句:

persist.st_nfc_debug u:object_r:system_prop:s0

搞定。

 

这是为什么?

 

 

这就一步步跟踪Android中的SeLinux权限保护。

同样地是因为系统默认给persist.sys.授权了, 把它归类到了system_prop中。

alps/system/sepolicy/private/property_contexts

persist.log.tag         u:object_r:log_tag_prop:s0
persist.mmc.            u:object_r:mmc_prop:s0
persist.netd.stable_secret      u:object_r:netd_stable_secret_prop:s0
persist.sys.            u:object_r:system_prop:s0
persist.sys.safemode    u:object_r:safemode_prop:s0
persist.sys.fflag.override.settings_dynamic_system    u:object_r:dynamic_system_prop:s0

那么system_prop又是在哪儿定义的呢?

它是属于property_type和core_property_type。

alps/system/sepolicy/public/property.te

79 type shell_prop, property_type, core_property_type;
80 type system_boot_reason_prop, property_type;
81 type system_prop, property_type, core_property_type;
82 type system_radio_prop, property_type, core_property_type;
83 type system_trace_prop, property_type;
84 type test_boot_reason_prop, property_type;

授权, 下方最后一行,set_prop(system_app, system_prop)。

alps/system/sepolicy/private/system_app.te

7 typeattribute system_app coredomain;
8 
9 app_domain(system_app)
10 net_domain(system_app)
11 binder_service(system_app)
12 
13 # android.ui and system.ui
14 allow system_app rootfs:dir getattr;
15 
16 # Read and write /data/data subdirectory.
17 allow system_app system_app_data_file:dir create_dir_perms;
18 allow system_app system_app_data_file:{ file lnk_file } create_file_perms;

33 # Write to properties
34 set_prop(system_app, bluetooth_a2dp_offload_prop)
35 set_prop(system_app, bluetooth_audio_hal_prop)
36 set_prop(system_app, bluetooth_prop)
37 set_prop(system_app, debug_prop)
38 set_prop(system_app, system_prop)

那么这个set_prop又是何方神圣?

alps/system/sepolicy/public/te_macros

305 #####################################
306 # set_prop(sourcedomain, targetproperty)
307 # Allows source domain to set the
308 # targetproperty.
309 #
310 define(`set_prop', `
311 unix_socket_connect($1, property, init)
312 allow $1 $2:property_service set;
313 get_prop($1, $2)
314 ')
315 
316 #####################################
317 # get_prop(sourcedomain, targetproperty)
318 # Allows source domain to read the
319 # targetproperty.
320 #
321 define(`get_prop', `
322 allow $1 $2:file { getattr open read map };
323 ')

 它是声明的一个通用方法。

所以根据这意思,完全可以拼凑出如下权限声明:

allow system_app system_prop:property_service set;

 

使用真机进入手机目录查找验证才是王道:

5032E:/system/etc/selinux # grep -rni "allow system_app system_prop" .                                                                                                 
./plat_sepolicy.cil:19108:(allow system_app system_prop (property_service (set)))
./plat_sepolicy.cil:19109:(allow system_app system_prop (file (read getattr map open)))
5032E:/system/etc/selinux #

 

小结:

正因为Android编译系统默认已经将相关权限赋予了,所以直接使用就可以了,而自定义的需要额外授权。

 

额外小知识:

在alps项目中加入编译之前在.te文件将编译后导入到cil文件。

Android Q当前有cil文件有:

./vendor/etc/selinux/vendor_sepolicy.cil
./vendor/etc/selinux/plat_pub_versioned.cil
./system/etc/selinux/mapping/27.0.cil
./system/etc/selinux/mapping/29.0.cil
./system/etc/selinux/mapping/26.0.cil
./system/etc/selinux/mapping/28.0.cil
./system/etc/selinux/plat_sepolicy.cil

property_contexts文件将导入到plat_property_contexts文件。

./system/etc/selinux/plat_property_contexts:61:persist.sys.            u:object_r:system_prop:s0
./system/etc/selinux/plat_property_contexts:62:persist.sys.safemode    u:object_r:safemode_prop:s0
./system/etc/selinux/plat_property_contexts:63:persist.sys.theme       u:object_r:theme_prop:s0
./system/etc/selinux/plat_property_contexts:64:persist.sys.fflag.override.settings_dynamic_system    u:object_r:dynamic_system_prop:s0
./system/etc/selinux/plat_property_contexts:66:persist.sys.audit_safemode      u:object_r:safemode_prop:s0
./system/etc/selinux/plat_property_contexts:81:persist.sys.boot.reason u:object_r:last_boot_reason_prop:s0
./system/etc/selinux/plat_property_contexts:346:persist.sys.dalvik.vm.lib.2 u:object_r:exported2_system_prop:s0 exact string
./system/etc/selinux/plat_property_contexts:347:persist.sys.media.avsync u:object_r:exported2_system_prop:s0 exact bool

 

而Android Q当前所有以_contexts结尾的文件有:

./vendor/etc/selinux/vndservice_contexts
./vendor/etc/selinux/vendor_file_contexts
./vendor/etc/selinux/vendor_hwservice_contexts
./vendor/etc/selinux/vendor_property_contexts
./vendor/etc/selinux/vendor_seapp_contexts
./system/etc/selinux/plat_file_contexts
./system/etc/selinux/plat_service_contexts
./system/etc/selinux/plat_hwservice_contexts
./system/etc/selinux/plat_seapp_contexts
./system/etc/selinux/plat_property_contexts
./sys/fs/selinux/initial_contexts

而NFC模块对应的服务就在./vendor/etc/selinux/vendor_file_contexts:

5032E:/ # cat ./vendor/etc/selinux/vendor_file_contexts | grep nfc                                                                                                     
/(vendor|system/vendor)/bin/hw/android\.hardware\.nfc@1\.1-service		u:object_r:hal_nfc_default_exec:s0
/(vendor|system/vendor)/bin/hw/android\.hardware\.nfc@1\.2-service		u:object_r:hal_nfc_default_exec:s0
/(vendor|system/vendor)/bin/hw/android\.hardware\.nfc@1\.0-service		u:object_r:hal_nfc_default_exec:s0
/(system\/vendor|vendor)/bin/hw/android\.hardware\.nfc@1\.1-service-st		u:object_r:hal_nfc_default_exec:s0
/data/nfc_socket(/.*)?		u:object_r:nfc_socket:s0
/data/vendor/nfc_socket(/.*)?		u:object_r:vendor_nfc_socket:s0
/dev/st21nfc		u:object_r:st21nfc_device:s0
5032E:/ # 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章