OpenHarmony子系统开发 - 安全(十二)

发布于:2025-04-09 ⋅ 阅读:(40) ⋅ 点赞:(0)

OpenHarmony SELinux开发指导(五)

一、OpenHarmony SELinux常见问题

neverallow编译报错处理

现象描述

编译SELinux时会进行neverallow检查,当配置的策略不合理时,可能出现违反neverallow编译报错。

neverallow check failed at obj/base/security/selinux_adapter/updater/system.cil:3887 from ../../base/security/selinux_adapter/sepolicy/base/public/domain.te:96
  (neverallow domain dev_parameters_file (file (write)))
    <root>
    allow at obj/base/security/selinux_adapter/updater/system.cil:14124
      (allow init dev_parameters_file (file (write create relabelfrom relabelto)))

可能原因

配置的策略不合理,违反neverallow,需要重新审视。

解决方法

当违反neverallow时,需要审视当前配置的策略合理性,尽量避免违反neverallow。确实应业务需要,必须屏蔽neverallow检查时,将违反neverallow的SELinux类型在neverallow策略中进行豁免,例如:

违反的策略:allow init dev_parameters_file:file { write };
修改前:neverallow domain dev_parameters_file:file 
修改后:neverallow { domain -init } dev_parameters_file:file write;

unrecognized character报错

现象描述

编译SELinux时会检查文件是否为unix格式,当配置的策略文件格式不正确时,可能出现编译报错。

' on line 3350:rity/selinux_adapter/sepolicy/base/public/domain.te:16:ERROR 'unrecognized character' at token '
allow domain init:process sigchld;

可能原因

新增的策略文件格式为dos格式。

解决方法

使用dos2unix命令转换编译报错中打印的文件:

dos2unix ./sepolicy/base/public/domain.te

unknown type报错

现象描述

编译SELinux时会检查SELinux类型是否定义,没定义或者定义位置错误时,会出现编译报错。

../../base/security/selinux_adapter/sepolicy/ohos_policy/security/access_token/vendor/access_token.te:2:ERROR 'unknown type accesstoken_data_file' at token ';' on line 10334:
allow accesstoken_service accesstoken_data_file:dir { search add_name open read write remove_name };
#line 1 "../../base/security/selinux_adapter/sepolicy/ohos_policy/security/access_token/vendor/access_token.te"
checkpolicy:  error(s) encountered while parsing configuration

可能原因1 & 解决方法

SELinux类型未定义。

排查是否有进行定义,需要使用type进行定义,格式如下:

type init, xxx

可能原因2 & 解决方法

SELinux类型定义在当前策略编译时不可见,比如在system子目录定义某个SELinux类型,在vendor子目录使用这个SELinux类型,由于芯片相关的策略编译时遍历的策略是vendor子目录和public子目录,不会遍历system子目录,所以会出现unknown type问题。

排查是否在当前策略编译时不可见,将SELinux类型定义移到编译可见目录下,一般SELinux类型定义位置最好在public子目录下,且一般文件命名为type.te。

二、OpenHarmony SELinux策略自检

概述

根据avc日志转换出来的SELinux策略,不一定都是合理的,需要重新审视配置的SELinux策略,这里提供一些SELinux策略自检建议。

涉及应用的SELinux策略自检

目前OpenHarmony SELinux根据应用的三个APL等级,将应用进程的SELinux类型分为对应的三个attribute,将应用数据目录的SELinux类型也分为对应的三个attribute,如下:

APL等级 应用进程归属的attribute 应用数据目录归属的attribute
normal normal_hap_attr normal_hap_data_file_attr
system_basic system_basic_hap_attr system_basic_hap_data_file_attr
system_core system_core_hap_attr system_core_hap_data_file_attr

APL说明参考权限等级说明

另外还有一个attribute表示所有应用进程,为hap_domain。

当配置的SELinux策略涉及应用SELinux类型时,需要根据实际的开放范围做对应的修改,比如根据avc日志配置的策略是:

allow normal_hap huks_service:binder { call };

表示允许以normal_hap为标签的应用进程和huks_service进行binder通信。考虑实际情况,huks_service会为所有应用提供huks能力,那么这里的normal_hap应该改为hap_domain,即

allow hap_domain huks_service:binder { call };

策略开放范围详细的对应关系,参考下表:

面向应用进程的开放范围 替换为attribute
所有normal等级的应用 normal_hap_attr
所有system_basic等级的应用 system_basic_hap_attr
所有system_core等级的应用 system_core_hap_attr
所有应用 hap_domain
面向应用数据目录的开放范围 替换为attribute
所有normal等级的应用数据目录 normal_hap_data_file_attr
所有system_basic等级的应用数据目录 system_basic_hap_data_file_attr
所有system_core等级的应用数据目录 system_core_hap_data_file_attr
所有应用的数据目录 normal_hap_data_file_attr & system_basic_hap_data_file_attr & system_core_hap_data_file_attr

涉及新增ioctl的SELinux策略自检

涉及配置ioctl相关的SELinux策略时,除了配置allow规则以外,还需要根据avc日志对ioctl的ioctlcmd进行限制,否则会导致所有的ioctlcmd权限都被开放,不满足权限最小化原则。例如,有下面的avc日志:

#avc:  denied  { ioctl } for  pid=1 comm="init" path="/data/app/el1/bundle/public" dev="mmcblk0p11" ino=652804 ioctlcmd=0x6613 scontext=u:r:init:s0 tcontext=u:object_r:data_app_el1_file:s0 tclass=dir permissive=0

根据该avc日志配置了允许ioctl的SELinux策略:

allow init data_app_el1_file:dir { ioctl };

同时,还需要根据avc日志中的ioctlcmd=0x6613字段,进一步限制ioctl的开放范围:

allowxperm init data_app_el1_file:dir ioctl { 0x6613 };

使用neverallow对业务做安全防护

neverallow可以阻止不合理的策略配置,因此可以作为安全防护手段,避免本业务的SELinux业务被恶意修改。

例如,主体进程accesstoken_service的数据库文件SELinux类型为accesstoken_data_file。按业务安全需要,该数据库文件理论上只允许本进程读写,那么可以通过neverallow进行限制:

neverallow { domain -accesstoken_service } accesstoken_data_file:file *;

表示不允许除了accesstoken_service以外的其他进程对accesstoken_data_file进行文件操作。