在这里插入图片描述
在这里插入图片描述

一、前置思考

1.1 系统被攻破,你的钱还在吗?

如果整个系统只有一个"安全等级":
  → 攻破浏览器 = 攻破支付 = 攻破一切

安全隔离的哲学: 分而治之
  → 把系统切成多个隔离区
  → 攻破一个区 ≠ 攻破所有区
  → 高价值区(支付密钥)放最深处

1.2 鸿蒙的五层隔离体系

① TrustZone 硬件隔离: CPU 物理分区 (安全世界/普通世界)
② Hypervisor 虚拟机隔离: 多个 OS 互不可见
③ 进程沙箱: 应用互相隔离 (UID 沙箱)
④ 能力令牌 Capability: 访问权限最小化
⑤ 形式化验证: 数学证明安全属性

1.3 安全的核心原则

最小特权: 每个进程只给完成任务所需的最小权限
纵深防御: 多层隔离,破一层还有一层
默认拒绝: 未明确授予的访问一律拒绝

二、核心原理

2.1 TrustZone 硬件隔离

ARM TrustZone: CPU 硬件级分区

  ┌─────────────────────────────┐
  │ 普通世界 (Normal World)       │  ← 普通 OS/应用
  │   运行 HarmonyOS              │
  ├─────────────────────────────┤
  │ 安全世界 (Secure World)       │  ← TEE 可信执行环境
  │   运行 安全内核/可信应用       │
  └─────────────────────────────┘

硬件特性:
  → 内存总线级隔离 (Secure 位标记)
  → 安全世界数据普通世界不可读
  → 切换走专用指令 (SMC)

用途:
  → 指纹/人脸认证
  → 支付密钥存储与签名
  → DRM 版权保护

2.2 虚拟机管理器(Hypervisor)

Hypervisor: 硬件之上的虚拟化层
  → 管理多个 Guest OS
  → 每个 Guest 认为独占硬件

隔离能力:
  → Guest 间内存互不可见
  → Guest 间通信走受限通道
  → 一个 Guest 崩溃不影响其他

应用:
  → 车载: 仪表 OS + 娱乐 OS + 自动驾驶 OS 共存
  → 安全域: 普通系统 + 高安全系统

2.3 进程沙箱与能力令牌

进程沙箱:
  → 每个应用独立 UID + 独立文件空间
  → 应用间默认不可互访
  → 访问系统资源走权限申请

Capability (能力令牌):
  → 不是"你是谁",而是"你持有什么令牌"
  → 令牌 = 对特定资源的访问权
  → 令牌可传递、可撤销、可细分

对比:
  ACL (访问控制列表): 资源列出谁可以访问
  Capability: 主体持有访问令牌
    → 更适合分布式: 令牌可跨设备传递

三、源码/API 深度解析

3.1 应用层:安全能力使用

import { bundleManager } from '@kit.AbilityKit';
import { abilityAccessCtrl } from '@kit.AbilityKit';

// 能力令牌模型: 权限即令牌
async function capabilityDemo(): Promise<void> {
  const context = getContext(this) as common.UIAbilityContext;
  const atManager = abilityAccessCtrl.createAtManager();

  // 1. 检查是否持有某能力令牌
  const tokenId = atManager.getTokenID();
  const status = await atManager.checkAccessToken(
    tokenId, 'ohos.permission.CAMERA'
  );
  if (status !== 0) {
    // 未持有令牌 → 申请 (用户授权后获得令牌)
    await atManager.requestPermissionsFromUser(
      context, ['ohos.permission.CAMERA']
    );
  }

  // 2. 分布式能力令牌 (跨设备)
  //    设备 A 的能力可授权给设备 B 使用
  //    → 令牌在分布式网络中传递
  //    → 权限粒度: 单次/限时/限定数据
}

// 安全组件: 无需权限的敏感操作入口
// 如: 系统相机组件 (安全Camera)
//   → 应用不拿相机权限,通过安全组件间接拍摄
//   → 照片无法被应用直接读取 (防窃取)

3.2 TrustZone 接口(TEE 侧)

// TEE (TrustZone 安全世界) 调用模型
// 普通世界 → SMC 指令 → 安全世界

// 1. 普通世界请求 (客户端)
TEEC_Result request_payment_sign(uint8_t *data, uint8_t *sig)
{
    // 构造安全世界调用参数
    TEEC_Operation op = {0};
    op.paramTypes = TEEC_PARAM_TYPES(
        TEEC_MEMREF_TEMP_INPUT,     // 输入数据
        TEEC_MEMREF_TEMP_OUTPUT);   // 输出签名
    op.params[0].memref.buffer = data;
    op.params[1].memref.buffer = sig;

    // 2. 调用安全世界 (SMC 切换)
    TEEC_InvokeCommand(ctx, CMD_SIGN, &op);
    // 密钥全程在安全世界,普通世界不可见
}

// 3. 安全世界处理 (可信应用 TA)
TEE_Result TA_InvokeCommandEntryPoint(...)
{
    switch (cmd_id) {
    case CMD_SIGN:
        // 在安全世界内用受保护密钥签名
        // 密钥存于安全存储 (不可导出)
        tee_sign(data, len, key_handle, sig);
        break;
    }
}

3.3 Hypervisor 隔离模型

// 虚拟化隔离核心概念
struct vcpu {
    // 每个虚拟 CPU 的上下文完全独立
    u64 regs[31];        // 寄存器组
    u64 elr_el2;         // 异常返回地址
    u64 spsr_el2;        // 程序状态
    u64 vttbr_el2;       // 虚拟机页表基址 (内存隔离)
    // vttbr 不同 → 内存映射不同 → 物理隔离
};

// 世界切换 (EL2 Hypervisor 层)
void world_switch(struct vcpu *next)
{
    // 保存当前 Guest 上下文
    save_vcpu(current_vcpu);
    // 切换内存隔离 (换页表)
    write_sysreg(next->vttbr_el2, VTTBR_EL2);
    // 切换虚拟中断等虚拟化状态
    write_sysreg(next->hcr_el2, HCR_EL2);
    // 恢复目标 Guest 上下文
    restore_vcpu(next);
}

四、企业级实战落地

4.1 隔离层级应用矩阵

层级 技术 隔离强度 典型场景
L1 硬件 TrustZone/TEE 物理级 支付、密钥、生物识别
L2 虚拟 Hypervisor 虚拟化级 车载多系统共存
L3 进程 沙箱 UID 进程级 应用隔离
L4 权限 Capability 令牌级 细粒度授权
L5 证明 形式化验证 数学级 高安全内核

4.2 完整示例:安全隔离演示

@Entry
@ComponentV2
struct TrustZoneDemo {
  @Local logs: string[] = [];
  @Local state: string = '未开始';

  private runTeeDemo(): void {
    this.logs = [];
    this.state = 'TEE 隔离';
    this.log('🔐 TrustZone 安全世界演示');
    this.log('场景: 指纹支付');
    this.log('① 普通世界: 应用发起支付请求');
    this.log('② SMC 指令: 切换到安全世界');
    this.log('③ 安全世界: 指纹比对 (传感器直连)');
    this.log('   → 指纹模板存安全存储,不可导出');
    this.log('④ 安全世界: 用支付密钥签名');
    this.log('   → 密钥在 TEE 内,普通世界不可见');
    this.log('⑤ 返回签名 → 支付完成');
    this.log('攻击者即使攻破普通系统也无法');
    this.log('获取密钥/指纹 ✅');
  }

  private runSandboxDemo(): void {
    this.logs = [];
    this.state = '沙箱与令牌';
    this.log('📦 进程沙箱 + 能力令牌演示');
    this.log('应用 A (UID=10001): 沙箱隔离');
    this.log('  可读: 自己目录 + 申请到的资源');
    this.log('应用 B (UID=10002): 沙箱隔离');
    this.log('  不可读: A 的目录 (UID 不同)');
    this.log('  未申请相机权限 → 无相机令牌');
    this.log('能力令牌特点:');
    this.log('  相机令牌 = 可访问相机的凭证');
    this.log('  令牌可撤销: 用户取消授权立即失效');
    this.log('  令牌可跨设备: 分布式授权');
    this.log('结论: 默认拒绝 + 最小特权 ✅');
  }

  build() {
    Column({ space: 12 }) {
      Text('🛡️ 微内核安全隔离').fontSize(20).fontWeight(FontWeight.Bold)
      Text('状态: ' + this.state).fontSize(13).fontColor('#4FC3F7')

      Row({ space: 8 }) {
        Button('TEE 隔离').layoutWeight(1).height(40).fontSize(12)
          .onClick(() => this.runTeeDemo())
        Button('沙箱令牌').layoutWeight(1).height(40).fontSize(12)
          .onClick(() => this.runSandboxDemo())
      }
      .width('100%')

      Scroll() {
        Column() {
          ForEach(this.logs, (l: string) => {
            Text(l).fontSize(11).lineHeight(18).fontColor('rgba(255,255,255,0.8)').width('100%')
          }, (l: string, i: number) => l + i)
        }.width('100%')
      }
      .layoutWeight(1).width('100%').scrollBar(BarState.Off)
    }
    .width('100%').height('100%').padding(16)
    .backgroundColor('#0D1B2A')
  }
}

4.3 高安全系统设计清单

1. 分级隔离: 敏感数据下沉到 TEE,普通业务留普通世界
2. 最小特权: 每个进程/服务只授必要能力
3. 默认拒绝: 未声明的访问全部拒绝
4. 令牌生命周期: 授权-使用-撤销 全流程管理
5. 防侧信道: 时间/功耗/缓存侧信道防护
6. 安全启动: 镜像签名验证 → 防篡改

五、问题排查与性能优化

问题 原因 解决
安全调用变慢 世界切换开销 批量调用、减少切换次数
沙箱访问受限 权限未申请 补申请能力令牌
TEE 功能异常 TA 签名/版本不匹配 校验 TA 签名与版本
虚拟化性能差 未用硬件虚拟化特性 开启 EL2 加速特性
侧信道风险 共享硬件资源 缓存清理、隔离设计
授权失效 令牌被撤销 业务侧捕获授权变化

5.1 隔离安全优化

1. 减少世界切换: TEE 调用批处理,一次切多做
2. 沙箱精细化: 按业务拆多进程,各自最小权限
3. 令牌分级: 高频低危用长令牌,高危短令牌
4. 硬件加速: 用 TrustZone + 加密引擎硬件加速
5. 威胁建模: 定期做 STRIDE 威胁分析

六、高阶总结与最佳实践

  1. 纵深防御:TrustZone → Hypervisor → 沙箱 → 令牌 → 验证,五层防线层层设防。
  2. 硬件隔离最强:TrustZone 的物理隔离是其他所有软件方案的基础。
  3. 最小特权是灵魂:Capability 令牌让"默认拒绝 + 最小授权"可落地。
  4. 令牌面向分布式:能力令牌可跨设备传递,是分布式安全的关键设计。
  5. 安全与性能平衡:隔离有开销,关键是把开销花在真正敏感的操作上。

一句话记住:安全隔离五层防线——TrustZone 硬件分区(物理隔离)、Hypervisor 虚拟化(系统隔离)、进程沙箱(应用隔离)、能力令牌(权限隔离)、形式化验证(数学证明)——纵深防御 + 最小特权 + 默认拒绝,让"破一层还有一层"成为系统的安全底色。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐