OpenHarmony子系统开发 - 安全(九)

发布于:2025-04-03 ⋅ 阅读:(9) ⋅ 点赞:(0)

OpenHarmony SELinux开发指导(二)

一、OpenHarmony SELinux新增进程策略配置方法

新增Native进程

适用场景

由init、chipset_init通过cfg文件孵化的Native进程,例如ueventd、installs。

配置指导

  1. 在本进程的cfg文件中,新增secon字段,建立进程与标签的映射关系。如果未配置secon字段,进程在SELinux使能状态会被拦截启动。

    {
        "services" : [{
                "name" : "demo",
                "path" : ["/system/bin/demo"],
                "uid" : "demo",
                "gid" : ["demo"],
                "secon" : "u:r:demo:s0"
            }
        ]
    }
    
  2. 在type.te中定义SELinux标签u:r:demo:s0中的SELinux类型demo,使u:r:demo:s0是合法的。

    如果demo是由init孵化,则定义:

    type demo, native_system_domain, domain;
    

    如果demo是由chipset_init孵化,则定义:

    type demo, native_chipset_domain, domain;
    

新增SA服务进程

适用场景

由init通过cfg文件孵化的SA服务进程,例如accountmgr、foundation。

配置指导

  1. 在本进程的cfg文件中,新增secon字段,建立进程与标签的映射关系。如果未配置secon字段,进程在SELinux使能状态会被拦截启动。
    {
        "services" : [{
                "name" : "demo",
                "path" : ["/system/bin/sa_main", "/system/profile/demo.json"],
                "uid" : "demo",
                "gid" : ["demo"],
                "secon" : "u:r:demo:s0"
            }
        ]
    }
    
  2. 在type.te中定义SELinux标签u:r:demo:s0中的SELinux类型demo,使u:r:demo:s0是合法的。
    type demo, sadomain, domain;
    

新增HDF服务进程

适用场景

由init、chipset_init通过cfg文件孵化的HDF服务进程,例如wifi_host、camera_host。

配置指导

  1. 在本进程的cfg文件中,新增secon字段,建立进程与标签的映射关系。如果未配置secon字段,进程在SELinux使能状态会被拦截启动。

    {
        "services" : [{
                "name" : "demo",
                "path" : ["/vendor/bin/hdf_devhost", "0", "demo"],
                "uid" : "demo",
                "gid" : ["demo"],
                "secon" : "u:r:demo:s0"
            }
        ]
    }
    
  2. 在type.te中定义SELinux标签u:r:demo:s0中的SELinux类型demo,使u:r:demo:s0是合法的。

    type demo, hdfdomain, domain;
    

新增应用进程

适用场景

由appspawn孵化的系统应用进程,期望以独立标签运行,例如com.ohos.permissionmanager

配置指导

  1. 在sehap_contexts文件中,建立应用APL等级、包名与应用进程标签、数据目录标签的映射关系。这里表示,当安装的应用APL为normal且包名为com.ohos.permissionmanager时,安装的应用数据目录标签会被配置为u:object_r:permissionmanager_hap_data_file:s0,应用运行时的进程标签会被配置为u:r:permissionmanager_hap:s0

    apl=normal name=com.ohos.permissionmanager domain=permissionmanager_hap type=permissionmanager_hap_data_file
    

    APL说明参考权限等级说明

  2. 在type.te中定义permissionmanager_happermissionmanager_hap_data_file,使u:r:permissionmanager_hap:s0u:object_r:permissionmanager_hap_data_file:s0是合法的。

    type permissionmanager_hap, normal_hap_attr, hap_domain, domain;
    type permissionmanager_hap_data_file, normal_hap_data_file_attr, hap_file_attr, data_file_attr, file_attr;
    

    这里使用APL等级为normal的应用作为示例,其他APL等级的应用参考下表配置:

    表1 APL等级与应用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_ha

二、OpenHarmony SELinux新增文件策略配置方法

只读分区新增文件

适用场景

为避免对文件系统恶意破环,OpenHarmony将部分镜像挂载为只读,如system.img、vendor.img,这些镜像内的文件在编译阶段就会被赋予SELinux标签。

配置指导

  1. 在file_contexts中,建立文件绝对路径与文件标签的映射关系,可以使用正则表达式。
    /system/lib(/.*)?    u:object_r:system_lib_file:s0
    
  2. 在type.te中定义system_lib_file,使u:object_r:system_lib_file:s0是合法的。
    type system_lib_file, system_file_attr, file_attr;
    

读写分区新增文件

适用场景

在OpenHarmony操作系统中,存在一些读写分区,如/data目录为用户数据存储目录,通常用来存储应用程序和用户产生的数据,允许应用程序在其中创建、读取和写入文件,这些文件一般是动态生成的,默认会继承父目录的标签,在业务安全防护需要时,可以在文件创建完成后为其配置独立的文件标签。

配置指导

  1. 在file_contexts中,建立文件绝对路径与文件标签的映射关系,可以使用正则表达式。

    /data/service/el0(/.*)?    u:object_r:data_service_el0_file:s0
    
  2. 在type.te中定义data_service_el0_file,使u:object_r:data_service_el0_file:s0是合法的。

    type data_service_el0_file, file_attr, data_file_attr;
    
  3. 使标签生效,file_contexts只是映射了文件路径和标签的对应关系,标签不会自动更新到文件上,需要进程主动触发标签更新操作。按文件创建的时机,可以分为以下场景:

    适用场景 更新标签位置
    通过init从cfg拉起的进程,在cfg内使用mkdir创建目录或文件 由于init在解析cfg中的mkdir命令时,已经集成了SELinux更新标签函数Restorecon,所以mkdir会更新标签
    在开机阶段cfg内使用mkdir创建的目录或文件 由于init在解析cfg中的mkdir命令时,已经集成了SELinux更新标签函数Restorecon,所以mkdir会更新标签
    在进程运行期间,由进程本身创建的目录或文件 需要进程在创建目录或文件后,调用SELinux更新标签函数Restorecon更新标签

    其中,SELinux更新标签函数参考OpenHarmony SELinux对外接口

虚拟文件系统新增文件

适用场景

对于虚拟文件系统,例如/proc、/sys等目录下的文件标签,可以在 virtfs_contexts文件内对文件或目录进行标签配置。

配置指导

  1. 虚拟文件系统的标签映射方式和普通文件系统的标签映射方式不一样,在virtfs_contexts中,用genfscon语法来配置。
    genfscon  proc /iomem  u:object_r:proc_iomem_file:s0
    
  2. 在type.te中定义proc_iomem_file,使u:object_r:proc_iomem_file:s0是合法的。
    type proc_iomem_file, fs_attr, proc_attr;
    

三、OpenHarmony SELinux新增参数策略配置方法

适用场景

新增系统参数,期望使用SELinux进行访问管控,对参数配置独立SELinux标签,参数定义参考系统参数规范

配置指导

参数和参数标签的对应关系是在parameter_contexts文件内,参数名以"."结尾表示通配参数,否则表示固定参数。

通配参数标签映射方法,表示以'init.svc.'开头的参数的标签都是u:object_r:init_svc_param:s0

init.svc. u:object_r:init_svc_param:s0

固定参数标签映射方法,表示参数'const.secure'的标签是u:object_r:secure_param:s0

const.secure u:object_r:secure_param:s0

当使用通配参数标签映射方法时,按最合适的前缀进行匹配,如paramter_contexts同时存在标签映射:

init. u:object_r:init_param:s0
init.svc. u:object_r:init_svc_param:s0

那么:

  • 参数init.a的标签是u:object_r:init_param:s0
  • 参数init.svc的标签是u:object_r:init_param:s0
  • 参数init.svc.a的标签是u:object_r:init_svc_param:s0

以新增前缀为init.svc.的参数标签init_svc_param为例,流程如下:

  1. 在parameter_contexts文件内,新增映射关系。

    init.svc. u:object_r:init_svc_param:s0
    
  2. 在type.te中定义对应的init_svc_param,使对应的标签合法。

    type init_svc_param, parameter_attr;
    

四、OpenHarmony SELinux新增SA或HDF策略配置方法

新增SA

适用场景

某个进程向samgr注册SA服务,其他进程在与该进程进行IPC通信之前,需要获取该SA服务,SA提供方需要为该SA配置SELinux标签,否则该SA会被SELinux配置为u:object_r:default_service:s0标签,配置访问default_service的策略会被neverallow禁止。

配置指导

  1. 在service_contexts文件内,新增SAID与SA标签的映射关系,

    10      u:object_r:sa_render_service:s0
    
  2. 在type.te中定义对应的sa_render_service,使对应的标签合法。

    type sa_render_service, sa_service_attr
    

新增HDF

适用场景

某个进程向hdf_devmgr注册HDF服务,其他进程在与该进程进行IPC通信之前,需要获取该HDF服务,HDF提供方需要为该HDF配置SELinux标签,否则该HDF会被SELinux配置为u:object_r:hdf_default_service:s0标签,配置访问hdf_default_service的策略会被neverallow禁止。

配置指导

  1. 在service_contexts文件内,新增HDF服务名与HDF标签的映射关系,

    thermal_interface_service  u:object_r:hdf_thermal_interface_service:s0
    
  2. 在type.te中定义对应的hdf_thermal_interface_service,使对应的标签合法。

    type hdf_thermal_interface_service, hdf_service_attr