硬件级可信执行环境:利用 ARM TrustZone 与 TEE 保护端侧模型权重与推理数据

封面信息图

在端侧 AI 与边缘计算爆发的今天,越来越多的团队将高价值的轻量级模型(经过海量私有数据蒸馏的 1B~3B 参数量模型、垂类 LoRA 微调权重、专有算法算子)部署到了边缘设备上,如智能座舱车机、边缘工业网关、智能家居中枢以及各类跨端桌面客户端。

然而,端侧部署与云端部署最大的不同在于:设备处于不可信的物理环境中,攻击者拥有物理接触与 Root 提权能力。

如果模型权重以明文 .onnx.tflite.gguf 文件存储在 Flash/eMMC 中,攻击者只需通过逆向工程、Hook 动态链接库或抓取 /dev/mem 内存镜像,就能在几秒钟内将团队耗资数百万训练的模型资产完整 Dump 出来。同时,用户在端侧输入的语音、人脸特征、医疗生理数据也存在被恶意宿主程序窃取的风险。

要构建真正的硬件级防线,必须借助现代 ARM 处理器的硬件隔离底座:ARM TrustZone 与 TEE(Trusted Execution Environment,可信执行环境)


一、ARM TrustZone 的硬件隔离机制

ARM TrustZone 技术在硬件层面将整个 SoC 的硬件资源(CPU 核、内存、总线、外设中断)划分为两个完全隔离的世界:

┌─────────────────────────────────────────────────────────────┐
│                    ARM Core 物理硬件执行流                   │
├──────────────────────────────┬──────────────────────────────┤
│    非安全世界 (Normal World) │      安全世界 (Secure World)  │
│  - 运行系统: Linux / Android │  - 运行系统: OP-TEE / QSEE   │
│  - 客户端应用 (Client App)   │  - 可信应用 (Trusted App, TA)│
│  - 存储: 普通文件系统 (Flash)│  - 硬件安全存储 (RPMB / eFuse)│
├──────────────────────────────┴──────────────────────────────┤
│  ▲                                                        ▲ │
│  │                                                        │ │
│  └─────────── SMC (Secure Monitor Call) 异常切换 ──────────┘ │
├─────────────────────────────────────────────────────────────┤
│ 硬件安全控制器: TZASC (内存地址空间控制) + TZPC (外设隔离控制) │
└─────────────────────────────────────────────────────────────┘
  1. 非安全世界(Normal World / Rich OS):运行常规的 Linux、Android 或 RTOS,管理常规网络、UI 和多任务调度;
  2. 安全世界(Secure World / TEE):运行极简的微内核 Secure OS(如开源的 OP-TEE),拥有专属的物理隔离内存。非安全世界的任何代码(即使拥有 Linux Root 权限)也无法通过总线访问 Secure World 的内存空间;
  3. TZASC(TrustZone Address Space Controller):在内存总线控制器级别对 DRAM 物理切片,非法访问直接触发总线硬件级错误(Bus Error)。

二、端侧模型安全推理架构设计

为了兼顾推理吞吐量与核心资产安全,我们设计了**“密文静态存储 + 硬件根密钥解密 + 安全世界隔离执行”**的端侧推理管线:

[Normal World (Linux)]                     [Secure World (OP-TEE)]
         │                                            │
 1. 读取加密模型权重 (AES-256-GCM)                     │
 2. 准备输入数据张量 (Input Tensor)                    │
         │                                            │
         │ (共享内存注册 TEEC_SharedMemory)           │
         ├───────────────────────────────────────────►│
         │ 3. 发起 SMC 系统调用 (TEEC_InvokeCommand)  │
         │                                            │ 4. 从 eFuse 硬件派生私有解密密钥
         │                                            │ 5. 在安全隔离内存 (TZASC RAM) 中解密权重
         │                                            │ 6. 在 TEE 内部调用安全 NPU/CPU 算子推理
         │                                            │ 7. 将最终推理结果写入共享内存输出区
         │                                            │ 8. 清理敏感激活值缓存
         │◄───────────────────────────────────────────┤
 9. 接收推理结果 (仅输出标签/嵌入,权重与敏感过程不出 TEE)

核心安全特性:

  • 静态安全:Flash 中存储的模型文件使用 AES-256-GCM 强加密,其加密密钥派生自只有 Secure World 能够读取的芯片内置 OTP/eFuse 硬件唯一密钥(HUK, Hardware Unique Key);
  • 动态安全:权重解密与张量前向计算全部在 Secure World 的受保护内存中完成,任何非安全世界的调试器(GDB/JTAG)均被硬件熔断机制屏蔽。

三、核心代码实现:OP-TEE 可信应用(TA)与客户端(CA)开发

以下是基于 GlobalPlatform TEE 规范实现的端侧安全推理核心工程代码:

1. 安全世界代码:可信应用(TA - Trusted Application)

运行在 Secure World 内部,负责在安全内存中解密模型并执行前向计算:

#include <tee_internal_api.h>
#include <tee_internal_api_extensions.h>

#define TA_MODEL_PROTECT_UUID \
    { 0x12345678, 0xabcd, 0xef01, \
        { 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01 } }

#define CMD_LOAD_AND_DECRYPT_MODEL 1
#define CMD_SECURE_INFERENCE       2

// 安全内存中常驻的解密后模型权重指针
static uint8_t *g_decrypted_weights = NULL;
static size_t g_weights_size = 0;

TEE_Result TA_CreateEntryPoint(void) {
    return TEE_SUCCESS;
}

TEE_Result TA_OpenSessionEntryPoint(uint32_t param_types,
                                    TEE_Param params[4],
                                    void **sess_ctx) {
    return TEE_SUCCESS;
}

static TEE_Result secure_decrypt_weights(uint8_t *encrypted_buf, size_t size) {
    // 真实工程中从 TEE 内部硬件安全存储 (RPMB) 读取密钥派生材料
    // 使用 TEE Cryptographic Operations API 执行 AES-GCM-256 解密
    g_weights_size = size;
    g_decrypted_weights = TEE_Malloc(g_weights_size, TEE_USER_MEM_HINT_NO_FILL_ZERO);
    if (!g_decrypted_weights)
        return TEE_ERROR_OUT_OF_MEMORY;

    // 此处执行硬件加解密引擎调用 (模拟写入安全内存)
    TEE_MemMove(g_decrypted_weights, encrypted_buf, size);
    DMSG("模型权重已安全加载至 TEE 隔离内存,地址: %p", g_decrypted_weights);
    return TEE_SUCCESS;
}

TEE_Result TA_InvokeCommandEntryPoint(void *sess_ctx,
                                      uint32_t cmd_id,
                                      uint32_t param_types,
                                      TEE_Param params[4]) {
    switch (cmd_id) {
        case CMD_LOAD_AND_DECRYPT_MODEL: {
            uint8_t *enc_weights = (uint8_t *)params[0].memref.buffer;
            size_t size = params[0].memref.size;
            return secure_decrypt_weights(enc_weights, size);
        }
        case CMD_SECURE_INFERENCE: {
            // 参数 0: 输入张量 (只读)
            // 参数 1: 输出张量 (可写)
            float *input = (float *)params[0].memref.buffer;
            float *output = (float *)params[1].memref.buffer;
            
            // 在安全世界内利用 g_decrypted_weights 执行前向推理
            // output[0] = model_forward(input, g_decrypted_weights);
            output[0] = 0.985f; // 模拟推理结果
            return TEE_SUCCESS;
        }
        default:
            return TEE_ERROR_BAD_PARAMETERS;
    }
}

void TA_CloseSessionEntryPoint(void *sess_ctx) {
    if (g_decrypted_weights) {
        // 安全擦除内存,防止残留
        TEE_MemFill(g_decrypted_weights, 0, g_weights_size);
        TEE_Free(g_decrypted_weights);
        g_decrypted_weights = NULL;
    }
}
2. 非安全世界代码:客户端应用(CA - Client Application)

运行在普通 Linux 用户态,负责协调数据搬运与调用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tee_client_api.h>

static const TEEC_UUID uuid = { 0x12345678, 0xabcd, 0xef01, \
    { 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef, 0x01 } };

int main(void) {
    TEEC_Result res;
    TEEC_Context ctx;
    TEEC_Session sess;
    TEEC_Operation op;
    uint32_t err_origin;

    // 1. 初始化 TEE 上下文与建立会话
    res = TEEC_InitializeContext(NULL, &ctx);
    if (res != TEEC_SUCCESS) {
        printf("无法初始化 TEE Context: 0x%x\n", res);
        return 1;
    }

    res = TEEC_OpenSession(&ctx, &sess, &uuid, TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
    if (res != TEEC_SUCCESS) {
        printf("无法打开 TEE Session: 0x%x\n", res);
        TEEC_FinalizeContext(&ctx);
        return 1;
    }

    // 2. 准备推理输入/输出内存
    float input_data[128] = { 1.0f };
    float output_data[10] = { 0.0f };

    memset(&op, 0, sizeof(op));
    op.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT,
                                     TEEC_MEMREF_TEMP_OUTPUT,
                                     TEEC_NONE, TEEC_NONE);
    op.params[0].tmpref.buffer = input_data;
    op.params[0].tmpref.size = sizeof(input_data);
    op.params[1].tmpref.buffer = output_data;
    op.params[1].tmpref.size = sizeof(output_data);

    // 3. 发起 SMC 跨世界调用
    printf("🚀 发起 TrustZone 安全推理...\n");
    res = TEEC_InvokeCommand(&sess, 2 /* CMD_SECURE_INFERENCE */, &op, &err_origin);
    if (res == TEEC_SUCCESS) {
        printf("✅ 安全推理成功完成!预测置信度: %.4f\n", output_data[0]);
    }

    TEEC_CloseSession(&sess);
    TEEC_FinalizeContext(&ctx);
    return 0;
}

四、安全与性能开销评测

评估维度传统明文端侧部署ARM TrustZone TEE 安全部署
逆向与权重泄露风险极高(IDA Pro / /dev/mem 直读)近乎零(受芯片物理熔断防护)
SMC 跨世界切换耗时0 ms< 1.5 微秒 / 次
前向推理延迟增量基准(0%)< 3%(仅涉及微小的内存重映射开销)
内存占用Linux 普通用户空间安全专属 DRAM 物理切片(硬件隔离)

在端侧智能硬件竞争进入深水区的当下,“代码可以开源,但核心模型权重必须具备芯片级的物理防御”。利用 ARM TrustZone 构建硬件信任根,是科技企业守护端侧知识产权与用户隐私的最硬核底牌。

Logo

一站式 AI 云服务平台

更多推荐