本文将尝试分析,在开发 Android 12 MTK 平台时遇到了
vendor_mtk_audiohal_prop
属性相关的 SELinux 权限问题。包括如何修改 SELinux 策略以允许system_app
设置vendor_mtk_audiohal_prop
属性。
问题描述
希望允许 system_app
设置 vendor_mtk_audiohal_prop
属性,但在编译时遇到了 neverallow
规则的限制和属性类型定义冲突的问题。
遇到的问题及解决方案
问题1:属性类型定义冲突
vendor_mtk_audiohal_prop
属性被同时定义为 vendor_restricted_prop
和 system_internal_prop
,导致属性类型定义冲突。
FAILED: out/target/product/projectname/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows
/bin/bash -c "(ASAN_OPTIONS=detect_leaks=0 out/host/linux-x86/bin/checkpolicy -M -c 30 -o out/target/product/projectname/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp out/target/product/projectname/obj/FAKE/sepolicy_neverallows_intermediates/policy.conf ) && (out/host/linux-x86/bin/sepolicy-analyze out/target/product/projectname/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp neverallow -w -f out/target/product/projectname/obj/FAKE/sepolicy_neverallows_intermediates/policy_2.conf || ( echo \"\" 1>&2; echo \"sepolicy-analyze failed. This is most likely due to the use\" 1>&2; echo \"of an expanded attribute in a neverallow assertion. Please fix\" 1>&2; echo \"the policy.\" 1>&2; exit 1 ) ) && (touch out/target/product/projectname/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp ) && (mv out/target/product/projectname/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows.tmp out/target/product/projectname/obj/FAKE/sepolicy_neverallows_intermediates/sepolicy_neverallows )"
device/mediatek/sepolicy/basic/non_plat/property.te:39:ERROR 'Duplicate declaration of type' at token ';' on line 94212:type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
#line 39
checkpolicy: error(s) encountered while parsing configuration
17:41:49 ninja failed with: exit status 1
问题2:neverallow
规则限制
neverallow
规则限制了 system_app
对 vendor_mtk_audiohal_prop
属性的设置操作。
学习和发现
在解决这些问题的过程中,进行了多次尝试和分析,并总结了以下几点。
1. 修改 system_app.te
文件
在 device/mediatek/sepolicy/basic/non_plat/system_app.te
文件中增加了以下内容:
set_prop(system_app, vendor_mtk_audiohal_prop)
会生成以下内容:
# policy.conf文件就会生成下面这么多内容#line 239#line 239
allow factory property_socket:sock_file write;
#line 239
allow factory init:unix_stream_socket connectto;
#line 239#line 239
allow factory vendor_mtk_audiohal_prop:property_service set;
#line 239#line 239
allow factory vendor_mtk_audiohal_prop:file { getattr open read map };
#line 239#line 239
2. 修改 property.te
文件
在 device/mediatek/sepolicy/basic/non_plat/property.te
文件中,增加以下内容:
vendor_restricted_prop(vendor_mtk_audiohal_prop)
这会导致生成如下内容:
sepolicy_neverallows_intermediates/policy.conf.dontaudit:93689: type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
sepolicy_neverallows_intermediates/policy_2.conf:92231: type vendor_mtk_audiohal_prop, property_type, system_property_type, system_public_property_type;
sepolicy_neverallows_intermediates/policy_2.conf.dontaudit:91714: type vendor_mtk_audiohal_prop, property_type, system_property_type, system_public_property_type;
sepolicy_neverallows_intermediates/policy.conf:93953: type vendor_mtk_audiohal_prop, property_type, system_property_type, system_public_property_type;
3. 尝试添加 system_internal_prop
定义
为了使 vendor_mtk_audiohal_prop
属性在系统中也能使用,尝试在 property.te
文件中增加:
system_internal_prop(vendor_mtk_audiohal_prop)
这会生成以下内容:
sepolicy_neverallows_intermediates/policy.conf.dontaudit:93684: type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
sepolicy_neverallows_intermediates/policy_2.conf:92479: type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
sepolicy_neverallows_intermediates/policy_2.conf.dontaudit:91962: type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
sepolicy_neverallows_intermediates/policy.conf:94201: type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
4. 冲突的定义
在尝试同时定义 vendor_mtk_audiohal_prop
为 system_internal_prop
和 vendor_restricted_prop
时,会出现冲突:
device/mediatek/sepolicy/basic/non_plat/property.te:39:ERROR 'Duplicate declaration of type' at token ';' on line 96691:
#line 39type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
checkpolicy: error(s) encountered while parsing configuration
5. 生成的策略文件
在 /out/target/product/projectname/obj/FAKE/sepolicy_neverallows_intermediates/policy.conf
文件中搜索 vendor_mtk_audiohal_prop
,会发现以下定义:
sepolicy_neverallows_intermediates/policy.conf.dontaudit:93436: type vendor_mtk_audiohal_prop, property_type, system_property_type, system_public_property_type;
sepolicy_neverallows_intermediates/policy.conf.dontaudit:93689: type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
sepolicy_neverallows_intermediates/policy_2.conf:92231: type vendor_mtk_audiohal_prop, property_type, system_property_type, system_public_property_type;
sepolicy_neverallows_intermediates/policy_2.conf:92484: type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
sepolicy_neverallows_intermediates/policy_2.conf.dontaudit:91714: type vendor_mtk_audiohal_prop, property_type, system_property_type, system_public_property_type;
sepolicy_neverallows_intermediates/policy_2.conf.dontaudit:91967: type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
sepolicy_neverallows_intermediates/policy.conf:93953: type vendor_mtk_audiohal_prop, property_type, system_property_type, system_public_property_type;
sepolicy_neverallows_intermediates/policy.conf:94206: type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
MTK Policy Rule 解释
以下是不同属性类型的解释以及如果 vendor_mtk_audiohal_prop
添加这些属性类型的效果:
1. system_internal_prop
- 用途:用于
/system
中的属性。 - 效果:
vendor_mtk_audiohal_prop
只能在/system
分区内部使用。 - 定义:
system_internal_prop(vendor_mtk_audiohal_prop)
- 生成内容:
type vendor_mtk_audiohal_prop, property_type, system_property_type, system_internal_property_type;
2. system_restricted_prop
- 用途:在系统中使用,但不能被系统外部写入的属性。
- 效果:
vendor_mtk_audiohal_prop
只能在系统内部写入,外部进程不能修改。 - 定义:
system_restricted_prop(vendor_mtk_audiohal_prop)
- 生成内容:
type vendor_mtk_audiohal_prop, property_type, system_property_type, system_restricted_property_type;
3. system_public_prop
- 用途:没有任何访问限制的属性。
- 效果:
vendor_mtk_audiohal_prop
可以被系统中的任何进程读取或写入。 - 定义:
system_public_prop(vendor_mtk_audiohal_prop)
- 生成内容:
type vendor_mtk_audiohal_prop, property_type, system_property_type, system_public_property_type;
4. system_vendor_config_prop
- 用途:只能由
vendor_init
写入的属性。 - 效果:
vendor_mtk_audiohal_prop
只能被vendor_init
进程写入。 - 定义:
system_vendor_config_prop(vendor_mtk_audiohal_prop)
- 生成内容:
type vendor_mtk_audiohal_prop, property_type, system_property_type, system_vendor_config_property_type;
5. vendor_internal_prop
- 用途:仅用于
/vendor
中的属性。 - 效果:
vendor_mtk_audiohal_prop
只能在/vendor
分区内部使用。 - 定义:
vendor_internal_prop(vendor_mtk_audiohal_prop)
- 生成内容:
type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_internal_property_type;
6. vendor_restricted_prop
- 用途:在
vendor
中使用,但不能被vendor
外部写入的属性。 - 效果:
vendor_mtk_audiohal_prop
只能在vendor
内部写入,外部进程不能修改。 - 定义:
vendor_restricted_prop(vendor_mtk_audiohal_prop)
- 生成内容:
type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_restricted_property_type;
7. vendor_public_prop
- 用途:没有任何访问限制的
vendor
属性。 - 效果:
vendor_mtk_audiohal_prop
可以被vendor
分区中的任何进程读取或写入。 - 定义:
vendor_public_prop(vendor_mtk_audiohal_prop)
- 生成内容:
type vendor_mtk_audiohal_prop, property_type, vendor_property_type, vendor_public_property_type;
结论
通过分析和实验,了解了 vendor_mtk_audiohal_prop
属性在不同规则类型下的效果。由于规则类型定义的冲突,需要仔细选择适当的规则类型,确保属性在系统和供应商环境中的正确使用。