某客户制作的app需要对灯的节点进行echo操作,但操作失败并会出现以下log:
type=1400 audit(0.0:280): avc: denied { write } for name="fw" dev="sysfs" ino=37586 scontext=u:r:untrusted_app:s0:c93,c256,c512,c768 tcontext=u:object_r:sysfs:s0 tclass=file permissive=0
分析:
主体类型(scontext):untrusted_app
客体类型(tcontext): sysfs
客体文件名(name):fw
客体类别(tclass):file
需要的权限:write
根据以上可得知,untrusted_app对节点fw的写操作被SELinux拦截。
而应客户需求,会将app做成system app,故以下解决方案会以system app为对象,以高通平台为例:
1.在/qcom/sepolicy/vendor/common/file_contexts内,定义实际节点路径的安全标签: /devices/platform/soc/78b6000.i2c/i2c-2/2-006a/leds/u:object_r:sysfs_leds:s0
2.在/qcom/sepolicy/common/system_app.te,申请权限:
allow system_appsysfs_leds:file rw_file_perms;
3. 重新编译源码。
4. 将app做成system app。
信息补充:
SELinux将app划分为主要的三种类型:
1)untrusted_app:第三方app,没有android平台签名,没有system权限;
2)platform_app:有android平台签名,没有system权限;
3)system_app:有android平台签名和system权限。
安全标签的定义规则:
标签的基本格式为:user:role:type:security_level
user:代表用户,目前为止可选值只有“u”一种。
role:代表角色,对于主体来说是r,对于客体来说是object_r。
type:代表类型。
security_level:代表安全级别,s0为最低级是默认的级别,s15是最高的级别。