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:/ # 

 

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