引言:为什么需要 TrustZone 保护人脸识别?
人脸识别(Face Recognition)技术已广泛应用于手机解锁、支付认证等场景。然而,用户的人脸模板数据是高度敏感的生物特征信息。如果这些模板存储在普通的操作系统(Normal World, NW),一旦系统被Root或遭受恶意软件攻击,模板可能被窃取,造成不可逆的隐私泄露。
ARM TrustZone 技术提供了一个硬件隔离的执行环境,即安全世界(Secure World, SW)或可信执行环境(TEE)。它将设备资源(如内存、外设)严格划分为安全和非安全两部分,使得敏感数据和核心算法可以在隔离的环境中运行,有效抵御来自非安全侧的攻击。
本文将聚焦于如何利用 TrustZone 架构,将人脸识别的“比对”核心算法和存储的“主模板”置于 Secure World 中,确保比对过程的安全性和模板的不可访问性。
核心概念:TA 与 CA 的协作
在基于 TEE 的实现中,我们主要涉及两个角色:
- CA (Client Application): 运行在 Normal World (例如 Android/Linux) 的客户端应用,负责图像采集、预处理、特征提取(生成实时模板)。
- TA (Trusted Application): 运行在 Secure World 的可信应用,负责存储主模板,并执行安全敏感的比对操作。
CA 和 TA 之间的通信通过 TEE 驱动程序和共享内存机制实现,确保数据传输的控制权始终在 TEE 内核手上。
实践步骤:实现安全比对功能
我们的目标是:NW 仅发送实时的、刚生成的特征模板;SW 内部存储安全的主模板,并执行比对,最后只返回布尔结果(成功或失败)。
步骤一:定义 TA 的接口命令
在 TEE 中,CA 通过命令 ID 来调用 TA 中的特定功能。我们定义一个用于人脸比对的命令。
// Trusted Application (TA) Header
#define TA_FR_UUID { 0x12345678, 0x90AB, 0xCDEF, { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 } }
// Command IDs
#define TA_FR_CMD_ENROLL_TEMPLATE 0x01 // 存储模板
#define TA_FR_CMD_COMPARE_TEMPLATE 0x02 // 比对模板
步骤二:Secure World (TA) 逻辑实现
TA 的核心任务是接收来自 CA 的实时模板数据,加载存储在安全存储区(Secure Storage)中的主模板,执行比对算法,并返回结果。
注意: Secure Storage 确保即使 NW 被完全控制,也无法读取存储在其中的数据。
// Trusted Application (TA) Source Code (Simplified)
static TEE_Result compare_face_templates(void *live_template, size_t live_size) {
// 1. 从 Secure Storage 加载预先存储的主模板
// 假设 g_master_template 是从安全存储区加载的
void *master_template = load_secure_storage("master_face_data");
size_t master_size = get_master_size();
if (!master_template) {
return TEE_ERROR_ITEM_NOT_FOUND;
}
// 2. 执行人脸比对核心算法(此算法位于 Secure World 内部)
// 核心算法函数,如 cosine similarity, L2 distance 等
int match_score = secure_biometric_matcher(live_template, live_size, master_template, master_size);
// 3. 设定阈值进行判断
if (match_score >= THRESHOLD_PASS) {
IMSG("Match successful!");
return TEE_SUCCESS;
} else {
IMSG("Match failed.");
return TEE_ERROR_ACCESS_DENIED; // 使用通用错误码表示比对失败
}
}
// 主入口函数处理 CA 发来的命令
TEE_Result TA_InvokeCommandEntryPoint(void *sess_ctx, uint32_t cmd_id, uint32_t param_types, TEE_Param params[]) {
switch (cmd_id) {
case TA_FR_CMD_COMPARE_TEMPLATE:
// 确保参数类型正确,通常使用 Shared Memory (MEMREF)
void *live_template = params[0].memref.buffer;
size_t live_size = params[0].memref.size;
return compare_face_templates(live_template, live_size);
// ... 其他命令 (如 Enrollment)
default:
return TEE_ERROR_BAD_PARAMETERS;
}
}
步骤三:Normal World (CA) 客户端实现
CA 负责与 TEE 驱动通信,将实时模板安全地传递给 TA。
// Client Application (CA) Source Code (Pseudo-C/C++ using TEE Client APIs)
bool authenticate_user(void *live_template, size_t size) {
// 1. 打开 TA Session
TEEC_Context context;
TEEC_Session session;
TEEC_Operation operation;
TEEC_Result res;
res = TEEC_OpenSession(&context, &session, &TA_FR_UUID, ...);
if (res != TEEC_SUCCESS) { /* Handle error */ return false; }
// 2. 配置参数:使用共享内存传递实时模板
// TEE Client API 会将 live_template 映射到 Secure World 可访问的共享内存区域
operation.paramTypes = TEEC_PARAM_TYPES(TEEC_MEMREF_TEMP_INPUT, TEEC_NONE, TEEC_NONE, TEEC_NONE);
operation.params[0].memref.buffer = live_template;
operation.params[0].memref.size = size;
// 3. 调用 TA 内部的 COMPARE 命令
res = TEEC_InvokeCommand(&session, TA_FR_CMD_COMPARE_TEMPLATE, &operation, NULL);
// 4. 判断结果
TEEC_CloseSession(&session);
if (res == TEE_SUCCESS) {
printf("Authentication granted.\n");
return true;
} else {
printf("Authentication failed or TEE error.\n");
return false;
}
}
总结
通过将人脸识别的主模板存储和比对算法封装在 ARM TrustZone 的 Secure World 中,我们实现了以下目标:
- 数据隔离: 主模板永不暴露给 Normal World。
- 代码完整性: 比对算法在受保护的环境中执行,无法被 NW 篡改。
- 结果最小化: NW 仅获得比对的成功或失败的布尔结果,无法通过分析比对过程获取敏感信息。
这种架构是目前移动设备上保护生物识别数据(如指纹、人脸)和密钥管理的核心安全实践。
汤不热吧