鸿蒙OpenHarmony【Seccomp策略使能开发】子系统init启动引导组件

概述

功能简介

Seccomp(Secure computing mode)是Linux kernel支持的一种安全机制。在Linux系统中,大量的系统调用可以不受限制地向用户态程序开放,但用户态程序并不需要所有的系统调用,此时不安全的代码如果滥用系统调用会对系统造成威胁。例如,一个进程中存在安全漏洞,攻击者可以运行一段Shellcode去触发正常执行中不会触发的系统调用,从而导致提权或者私密信息被窃取。针对这类安全隐患,Seccomp机制通过限制程序可使用的系统调用范围,来减少系统的暴露面,提高安全性。

运作机制

  1. 基本机制

    Seccomp策略以策略文件的形式存在。在编译构建时,首先相关脚本解析策略文件来生成含BPF指令策略的源文件,然后编译成策略动态库。最后,用户态进程启动过程中,使用Seccomp系统调用将BPF指令策略加载到内核中。

  2. 基本特点

    • 子进程继承父进程的Seccomp策略。
    • 在进程运行时Seccomp策略被加载到内核后,以单向链表的形式存在于内存中,且内容不能被修改。
    • 进程可多次设置Seccomp策略。进程在执行系统调用时,内核会遍历单向链表中每个节点的策略,比较每个节点策略的返回值,最后得到优先级最高的返回值。

约束与限制

  • 支持标准系统,且标准系统的内核已开启下列选项。产品的内核选项配置文件路径为//kernel/linux/config/{linux_version}/arch/{target_cpu}/configs/。

    CONFIG_HAVE_ARCH_SECCOMP=y
    CONFIG_HAVE_ARCH_SECCOMP_FILTER=y
    CONFIG_SECCOMP=y
    CONFIG_SECCOMP_FILTER=y
    shell
    
  • 特性限制

    • 非特权进程Seccomp策略遵循基线黑名单机制。
    • 若进程需使用基线黑名单系统调用,则要在特权进程策略文件中声明。
    • 所有应用进程使能同一个Seccomp策略。
    • 大部分系统服务进程使能同一个Seccomp策略。
    • 支持init进程孵化的Native service进程使能个性化Seccomp策略。

产品使能Seccomp机制

场景介绍

产品可根据自身对安全性的要求,需要使能Seccomp机制来限制进程可使用的系统调用范围。按照下面的开发步骤,系统可使能Seccomp的基本功能与基本策略。

开发步骤

  1. 在vendor/产品厂商/产品名/config.json添加以下字段。

    "build_seccomp": true
    

    产品配置文件添加build_seccomp字段的示例如下:

    {
        "product_name": "MyProduct",
        "version": "3.0",
        "type": "standard",
        "target_cpu": "arm",
        "ohos_version": "OpenHarmony 1.0",
        "device_company": "MyProductVendor",
        "board": "MySOC",
        "enable_ramdisk": true,
        "build_seccomp": true
        "subsystems": [
        {
            "subsystem": "ace",
            "components": [
            { "component": "ace_engine_lite","features":[""] }
            ]
        },
        ...
        ]
    }
    
  2. 产品代码进行全量编译,生成镜像。

    ./build.sh --product-name 产品名称 --ccache --build-target make_all --target-cpu 指定CPU
    
  3. 设备烧写镜像。

调测验证

查看应用进程与系统服务进程是否使能Seccomp机制。

  1. 使用Shell命令获取目标进程的进程号target pid。

    ps -ef | grep xxx
    

    显示信息示例如下,其中1686为target pid。

    media         1686     1 0 08:16:12 ?     00:00:00 xxx
    root          1869  1678 4 10:32:29 pts/0 00:00:00 grep xxx
    
  2. 查看进程状态信息来判断Seccomp机制是否使能。

    cat /proc/[target pid]/status | grep Seccomp
    

    显示信息示例如下。

    Seccomp:        2
    Seccomp_filters:        1
    

    表1 Seccomp使能状态说明

    字段 说明
    Seccomp - 0:未使能; - 1:使能,为严格模式,只允许使用read/write/exit/sigreturn四个系统调用; - 2:使能,filter模式,可通过加载BPF指令集合来使能自定义策略。
    Seccomp_filters 进程设置Seccomp策略的个数

进程使能个性化Seccomp策略

场景介绍

产品已使能Seccomp基本策略的情况下,某个init孵化的Native service进程可以根据实际需要使能自定义的个性化Seccomp策略,以适配进程自身所需的安全要求,此时其它Native service进程的Seccomop策略不变。

开发步骤

  1. 统计32位架构与64架构位需要使用的系统调用,先使用[统计系统调用方法]的静态分析方法与Strace统计方法,得到Seccomp初始策略。

  2. 编写编译BUILD.gn。

    1. 在业务子系统代码仓内存放编写完成的策略文件,创建BUILD.gn。例如,在业务代码仓创建seccomp_policy文件夹,在该文件中创建策略文件与BUILD.gn。

      //path/to/code/seccomp_policy
      ├── BUILD.gn
      └── example.seccomp.policy
      
    2. 为了解析策略文件以及构建策略动态库,在BUILD.gn中需要使用ohos_prebuilt_seccomp模板声明进程的Seccomp策略文件路径等内容。ohos_prebuilt_seccomp模板在//base/startup/init/services/modules/seccomp/scripts/seccomp_policy_fixer.gni中定义,下表为该模板的字段说明。

      表2 ohos_prebuilt_seccomp模板字段说明

      字段 说明
      sources 必填,策略配置文件的路径。
      filtername 必填,该内容与进程[引导启动配置文件]中的services name保持一致,否则会使能失败。该字段决定了动态库的名称。例如,将filtername设置为xxx,则编译生成的策略动态库名称为libxxx_filter.z.so。
      process_type 必填,根据使能进程类型填写不同的字符串。若使能的进程为init孵化的进程,则该字段赋值"system";若是应用进程,则该字段赋值"app"。
      part_name 必填,部件名。
      subsystem_name 必填,子系统名。
      install_enable 必填,是否安装到镜像,为true。

你可能感兴趣的:(记录,harmonyos,华为,鸿蒙,鸿蒙系统,ui,组件)