摘要:在嵌入式 ARM 终端上把指纹特征提取与比对运算放进 TrustZone 安全世界,让明文模板永远不进入富世界内存,是降低操作系统双因素认证被 dump 提取风险的关键工程路径。 正在上传图片... 关键词:操作系统双因素认证、电脑指纹登录、等保2.0、国密USBKey、离线双因子、共享账号追溯、远程登录安全、工控终端登录
在 x86 桌面时代,指纹驱动、特征提取库和比对算法常跑在操作系统用户态。这套做法搬到嵌入式 ARM 平台后会暴露三个问题。
第一,富世界(即内核与用户态)一旦被提权,攻击者可用内存 dump 或内核模块读走驻留的指纹模板。指纹是生物特征,泄露后无法像口令一样重置。
第二,比对所需的 minutiae 模板通常是定长或变长数组,开发者为性能常放在堆上反复读写,明文模板在富世界内存里"游荡",任何能读 /proc/<pid>/mem 的进程都能截获。
第三,工控终端登录、共享账号追溯等弱防护现场的终端,把安全边界全押在通用 OS 完整性上并不可靠。
ARM 的 TrustZone 在 SoC 层面把硬件资源划分成安全世界与富世界两个隔离域,富世界即便内核级被攻破也拿不到安全世界内存与寄存器。把指纹的"提取 + 比对 + 存储"三件事收口进安全世界,明文模板就永不出现在富世界可寻址内存。
理解 TrustZone 的隔离模型,要先明确哪些资源被硬件强制切分。下表给出两类世界在关键维度上的边界,这也是后续工程落地时每一行代码都要对齐的"红线"。
资源维度 | 富世界(Normal World) | 安全世界(Secure World) | 隔离机制 |
|---|---|---|---|
物理内存 | 仅能访问 NS(Non-Secure)RAM 区域 | 独占 Secure RAM,富世界硬件不可寻址 | TZASC 内存地址空间控制器 |
外设 | 指纹传感器经 NS 总线访问 | 可绑定传感器为安全外设 | TZPC 外设控制器 |
寄存器 | 访问安全协处理器被总线拒绝 | 可执行安全监控调用 | Secure Monitor 模式切换 |
加密引擎 | 仅有普通加密指令 | 独占真随机数、密钥槽、国密算法硬件 | 安全子系统的密钥保险库 |
调试接口 | JTAG 可被禁用或受限 | 安全世界调试默认关闭 | 安全调试鉴权 |
只要模板和比对运算落在安全世界,富世界拿到的比对结果只能是布尔值,而非模板。攻击者要从内存抠模板,需先攻破 TZASC 与监控切换,成本远高于 dump 用户态进程。

把指纹比对放进 TEE 后的典型链路如下:
注意第 1、5 步仍在富世界,但都不接触明文模板——前者只碰一次性原始图像缓冲,后者只碰签名结果。敏感数据始终在 TEE 内部闭环。
在 TEE 客户端(富世界侧)与安全世界 TA 之间的通信,通常走 GP(GlobalPlatform)标准的 TEEC_InvokeCommand。下面是一段示意性的调用片段,展示富世界如何发起一次"比对",以及 TA 侧如何只在安全世界完成模板加载与比对。
富世界客户端调用:
/* 富世界侧:仅传入采集缓冲与待验证用户标识,不传模板 */
TEEC_Operation op;
memset(&op, 0, sizeof(op));
op.paramTypes = TEEC_PARAM_TYPES(
TEEC_MEMREF_TEMP_INPUT, /* 安全缓冲中的采集图像 */
TEEC_VALUE_INPUT, /* 用户槽位编号 */
TEEC_NONE, TEEC_NONE);
op.params[0].tmpref.buffer = cap_buf;
op.params[0].tmpref.size = cap_len;
op.params[1].value.a = user_slot;
/* 命令 ID:安全世界内执行"提取+比对" */
res = TEEC_InvokeCommand(&sess, CMD_FP_MATCH_IN_SECURE, &op, &origin);
if (res == TEEC_SUCCESS && op.params[1].value.a == MATCH_OK) {
/* op.params[2] 中拿回的是签名结果令牌,不是模板 */
verify_token(op.params[2].tmpref.buffer, op.params[2].tmpref.size);
}安全世界 TA 伪代码:
/* 安全世界侧:模板永不出安全世界边界 */
TEE_Result TA_InvokeCommandEntryPoint(...)
{
if (cmd == CMD_FP_MATCH_IN_SECURE) {
/* 1. 从安全存储读取已注册模板(密文落盘,密钥在密钥槽) */
load_template_from_secure_storage(slot, &enrolled_tmpl);
/* 2. 在安全世界内存提取本次特征 */
extract_minutiae(cap_buf, &probe_tmpl);
/* 3. 本地比对,得分不离开 TA */
score = compare_template(&enrolled_tmpl, &probe_tmpl);
/* 4. 只回传判定 + 签名令牌 */
params[1].value.a = (score >= THRESHOLD) ? MATCH_OK : MATCH_FAIL;
sign_result(slot, score, &token);
return TEEC_SUCCESS;
}
}这段代码的要点是:富世界传进来的只有采集缓冲和槽位号,TA 回传的只有判定与签名令牌。enrolled_tmpl 和 probe_tmpl 全程在安全世界栈或安全堆上,连内核态的 dmesg、富世界的 gdb 都看不到。
"模板不外泄内存"分两层含义:运行时不进富世界内存,落盘时是密文。
运行时不外泄:由 TA 结构保证,模板只活在 TEE 私有内存,富世界进程、内核模块乃至物理 DMA 都无法读安全 RAM。
落盘加密:已注册模板写入 RPMB、加密分区或 TEE 安全文件系统时,用安全世界密钥槽的密钥加密,密钥不离硬件保险库。拆闪存离线镜像也只得到密文。
防调试提取:安全世界默认关闭调试端口,TZPC 把传感器绑为安全外设后富世界无法操控重放;配合 Secure Boot 校验 TA 签名,可防替换 TA 打印模板。
活体分级与防重放:比对前在安全世界做活体分级(图像质量、脊线连续性、多模态一致性),把硅胶、照片、薄膜等假体挡在匹配之前。
在国产 ARM 平台(如飞腾、鲲鹏等基于 ARM 架构的 SoC)上落地这套方案,有几个工程细节要单独处理。
一是 TEE 运行环境差异。不同国产平台的可信执行环境可能是自研 TEE、OP-TEE 移植或国标可信计算中间件,GP 调用层一致,但安全存储后端(RPMB、加密分区驱动)与密钥槽接口需按平台适配。迁移前确认 TEEC_InvokeCommand 调用栈完整、RPMB/安全文件系统容量足够,否则限制可注册用户数。
二是 国密算法接入。等保2.0 场景要求 SM2/SM3/SM4。TEE 内签名令牌与落盘加密应走硬件国密引擎,需确认安全世界是否暴露国密指令或协处理器。无硬件国密时 TA 内软件实现要评估 0.3 秒延迟预算,必要时仅对结果令牌做国密签名、模板落盘用 SM4 加速。
三是 操作系统适配面。同一 TEE 逻辑上层接不同登录管理器:Windows 走 Credential Provider,Linux 走 PAM,麒麟、统信等在其桌面与 PAM 框架对接。TEE 内逻辑稳定,变的是富世界胶水层。常见坑是胶水层把模板缓冲映射进富世界进程,集成时要用内存扫描脚本确认富世界地址空间搜不到模板特征串。
四是 安全启动对齐。国产平台自带 Secure Boot/可信启动,须确认 TEE 加载、TA 校验密钥与整机启动链绑定,否则可替换未签名 TA 读模板。安全世界与富世界信任根统一到同一硬件信任根(ROM 或 eFuse 根密钥)。
完整信任链从芯片 ROM 起:ROM 校验 BL1,BL1 校验 BL2,逐级到安全世界内核再到 TA 镜像,任一环签名失败即拒启。对指纹 TA 集成三件事:TA 镜像打发布签名并由安全世界加载校验;模板密钥不硬编码,从密钥槽或安全存储已封装密钥解开;启用反回滚(anti-rollback)防旧版漏洞 TA 覆盖。三者合起来把防 dump 从运行时延伸到启动前。
评估安全性要逐条对照攻击者能力。常见攻防点:
把这些点写进等保2.0 测评的差距分析文档,比任何宣传句式都更有说服力。
要把延迟稳定压在 0.3 秒以内,工程上有几条可操作的手段:
验证阶段用三把尺子:第一,富世界内存扫描工具在比对高峰反复 dump 进程内存,确认搜不到模板特征;第二,安全世界插入带时间戳日志,统计"采集→提取→比对→签名"各阶段耗时定位瓶颈;第三,构造假体样本(硅胶、薄膜、高清照片)跑增强档活体分级,确认拒绝率达标再上线。
指纹比对放进安全世界后,工程上最关心的两个可量化指标是延迟和成功率,二者往往受活体分级策略强度影响。
活体分级档位 | 判定逻辑 | 单次比对延迟 | 典型成功率 | 适用场景 |
|---|---|---|---|---|
一级(基础) | 图像质量 + 脊线连续性 | < 0.2s | 98.5% | 室内办公终端 |
二级(标准) | 加电容/光学一致性校验 | < 0.3s | 99.2% | 工控终端登录 |
三级(增强) | 多模态信号 + 活体攻击库 | 0.3~0.4s | 99.7% | 供应链审核、涉密现场 |
延迟压到 0.3 秒以内的关键,是特征提取与比对都在安全世界内定点化实现,避免浮点在大体量模板上反复迭代;模板检索只对本机已注册小规模集合,无跨库开销。

把指纹放进安全世界只是"第二因子"这一环。完整的登录双因素体系包含多因子与多部署形态:
拔 Key 自动锁屏、离线应急 OTP、全链路审计作用于富世界与策略层:拔 Key 触发锁屏;断网时 OTP 或本地模板比对仍完成离线双因子;每次登录、校验、失败尝试均入审计日志,支撑共享账号追溯。它们与 TEE 内比对互补——前者管流程与责任,后者管模板与算法机密性。
供应链审核指纹登录:无尘车间操作员频繁登录工位,放进安全世界后既得 99.7% 成功率、低于 0.3 秒体验,又确保模板不散落或被现场 dump,戴手套可用贴合产线规范。
轨交外场离线 USBKey:作业车常无稳定网络,国密 USBKey + 本地模板比对构成离线双因子,断网仍完成工控终端登录与身份绑定,审计本地留存回传。
军用指挥车一人一钥:每操作员绑定独立 USBKey 与生物特征,登录即确认主体,满足共享账号追溯与责任界定;无网环境仍依赖本地安全世界比对与审计。
误区一:"模板加密了就可以放富世界"。加密能挡离线镜像,但挡不住运行期内存 dump 与内核提权读取。运行期明文模板必须留在安全世界。
误区二:"比对快就行,活体分级可省"。没有活体分级,假体(硅胶、薄膜)可绕过匹配;分级强度直接决定攻击面,需在延迟预算内选合适档位。
误区三:"国产平台直接用 x86 的 TEE 代码"。ARM 平台的 TZASC/TZPC 配置、安全存储后端、国密引擎接口都不同,需按 SoC 重新适配安全世界侧的存储与密钥管理。
误区四:"远程登录安全靠把指纹传到服务器比"。把模板或图像传到远端,等于把生物特征暴露在网络链路上,违反最小化原则。正确做法是终端本地在 TEE 内完成比对,远端只校验签名结果令牌。
面向嵌入式 ARM 终端与国产系统的操作系统双因素认证改造,给出以下通用落地建议:
上述要点的共同思路是终端侧闭环:第二因子嵌入 Windows、Linux 以及国产系统的登录流程后,指纹比对的底层运算收口在终端侧的安全世界或等效可信环境内,富世界只负责把采集缓冲投递进去并收回签名结果,让模板在终端本地完成闭环、不回传任何服务器。这一架构思路同样可作为自建操作系统双因素认证时的参考范式。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。