本节摘要:TEE 不是万能盾,它的安全承诺只在特定的威胁模型下成立。本节把攻击者按能力分成非特权软件、特权软件、物理三类,说清每一类 TEE 能不能防、防到什么程度;再把机密性、完整性、可用性这三个安全目标拆开,讲它们各自靠什么机制保证、又怎么互相牵制。读完你会对"TEE 的安全边界到底划在哪"有一个清醒的判断。
阅读完本节,你应当能够:
很多团队上了 TEE 之后还是被攻破,根子往往不在技术,而在威胁模型没想清楚。一个常见的错误是:以为"用了 SGX,云服务商就绝对看不到我的数据",结果忽略了侧信道——内存内容虽然加密了,但程序执行时缓存命中模式、分支预测状态都会泄露信息,SGX 早期版本被 Foreshadow、Spectre 这类攻击搞得焦头烂额就是明证。
另一个极端是:觉得 TEE 既然不防物理攻击,那就没用。这也不对。TEE 把"需要多大规模攻击"这个门槛大幅抬高了——对一个想批量窃取百万用户支付密钥的黑产来说,针对单台设备的物理拆解(冷启动攻击、功耗分析)根本无法规模化,TEE 的软件隔离对他们就是有效威慑。
威胁模型的价值就在这里:它强迫你说清楚"我防谁、不防谁",这样才不会在错误的战场投入资源。不做威胁模型的团队,要么过度防御(成本爆炸),要么盲目乐观(漏洞百出)。
在 TEE 的语境下,攻击者通常按能力从弱到强分成三类。每一类对应不同的攻击路径,TEE 对它们的防御能力也完全不同。
| 攻击者类型 | 能力范围 | 典型手段 | TEE 能否防 |
|---|---|---|---|
| 非特权软件攻击者 | 只能跑普通应用,没内核权限 | 恶意 App、越权读文件 | 能,TEE 本就是为它设计的 |
| 特权软件攻击者 | 控制内核、Hypervisor、固件 | dump 内存、改页表、注入代码 | 部分能,靠内存加密和硬件隔离 |
| 物理攻击者 | 能接触硬件、上探针 | 冷启动攻击、功耗分析、故障注入 | 一般不能,超出 TEE 范畴 |
非特权攻击者是 TEE 最直接、也最容易对付的对象。一个普通恶意 App 想读你存在 TEE 里的支付密钥?根本没那个权限,硬件直接挡掉。
特权软件攻击者才是 TEE 真正的对手。这也是它最有价值的地方——传统的所有软件安全机制(防火墙、杀毒、访问控制)在内核被攻陷时全部失效,唯独 TEE 的硬件隔离还能撑住。Intel SGX 的设计假设甚至更激进:连 BIOS、Hypervisor 一起算不可信,只有 CPU 内核本身可信。
物理攻击者一般被排除在商用 TEE 的威胁模型之外。原因很现实:防物理攻击需要专用硬件(屏蔽层、电压传感器、真随机数发生器),大幅增加芯片面积和功耗,和移动、边缘场景的能效需求冲突。要防物理攻击,得上 HSM(硬件安全模块)或专用的抗篡改芯片,那是另一个量级的成本。
💡 关键直觉:安全不是二元的"安全/不安全",而是一个光谱。TEE 的价值不是宣称"绝对安全",而是精确地告诉你"在 X 条件下、面对 Y 类型的攻击者,你的数据是安全的"。这个精确性本身就是工程价值——它让你能做取舍决策。
明确了敌人是谁,接下来要回答"保护什么"。TEE 的安全目标可以归结为三个属性,业内叫 CIA:
这三者各自有对应的技术手段:
| 安全目标 | 实现机制 | 失效后果 |
|---|---|---|
| 机密性 | 内存加密引擎(写内存前加密、读时解密) | 密钥、模型权重泄露 |
| 完整性 | 硬件完整性树 / MAC 校验 | 代码被注入、变量被篡改 |
| 可用性 | 远程证明 + 资源隔离 | 服务被 DoS、身份被伪造 |
机密性靠的是内存加密:CPU 在把数据写进主存(DRAM)之前自动用硬件密钥加密,读取时自动解密,密钥由芯片内部的加密引擎管理,软件层永远碰不到。这样即使攻击者物理控制了内存总线、用探针去读 DRAM 芯片,也只能看到一堆乱码。
完整性靠的是基于硬件的完整性校验。以 SGX 为例,飞地内存的每一页都关联一个 MAC(消息认证码),由页内容、页号和只有 CPU 知道的密钥共同生成。任何对页内容的非法修改都会让 MAC 对不上,触发异常。这个机制挡住了"我读不到,但我能偷偷覆盖一段恶意代码"这类攻击。
CIA 三件套不是孤立的,它们互相牵制。最常见的坑是:只做机密性不做完整性,会被重放攻击绕过。
举个例子。假设攻击者把 TEE 内存里某个密文页的内容记下来,过一会儿趁 TEE 不注意,把这个旧版本覆盖回去。如果系统只检查"内容能不能解密"而不检查"是不是最新的",TEE 就会用旧的状态继续跑——可能把已经撤销的权限又激活了,或者把已经花掉的钱又退回来。这就是重放攻击。
所以现代 TEE(比如 SGX 后续版本、AMD SEV-SNP)都引入了完整性树:不光校验内容,还校验版本号和 freshness,确保每页内存都是"当前"的而不是"被回放"的。机密性挡住了读,完整性挡住了改,二者一起才算闭环。
理论模型在真实攻击面前总是脆弱的。这几个著名案例能帮你理解"威胁模型边界"到底是什么意思:
Foreshadow(L1 终端故障):2018 年披露,利用 Intel CPU 推测执行时的 L1 数据缓存漏洞,攻击者能从 SGX 飞地里读出加密密钥。这打破了 SGX"内存隔离坚不可摧"的假设——隔离没破,但 CPU 微架构的共享资源(缓存)成了信息泄露通道。后来 Intel 不得不通过微码更新和操作系统补丁来缓解。
Plundervolt:2021 年曝光,通过操控 CPU 供电电压,诱导 SGX 飞地执行错误指令,从而破坏完整性计算。这个攻击直指威胁模型里"硬件本身可信"这个假设——如果连电压都能被外部操控,CPU 内部的计算结果还可靠吗?
SGX-Step:一个研究框架,允许攻击者精确控制 SGX 飞地的单步执行,配合 AEX(异步飞地退出)机制,对飞地内部状态做高精度采样。这暴露了一个问题:即使硬件机制完美,飞地与外界的接口本身也是攻击面。
⚠️ 常见坑:很多文档把 TEE 描述成"硬件级绝对隔离",给读者一种"放进 TEE 就高枕无忧"的错觉。实际上,微架构共享资源(缓存、分支预测器、TLB)一直是泄露通道,侧信道攻防至今是 TEE 领域最活跃的研究前沿。把敏感逻辑放进 TEE 后,还得做恒定时间编码、限制共享资源暴露,才算到位。
落地 TEE 之前,先给你的业务画一张"能防 / 不能防"的清单。我一般用这个模板:
| 威胁场景 | 攻击者类型 | TEE 能否防 | 还需要什么补充措施 |
|---|---|---|---|
| 云上恶意租户偷我的模型 | 特权软件(云平台) | 能(用 SGX/SEV) | 远程证明确认真在飞地里 |
| 内部员工 dump 内存 | 特权软件 | 能 | 同上,加审计日志 |
| 设备被拆解、上探针 | 物理攻击 | 不能 | 上 HSM 或抗篡改芯片 |
| 缓存侧信道窃密 | 侧信道 | 部分 | 恒定时间编码、缓存分区 |
| 供应链植入后门 | 固件级 | 不能 | 可信构建、代码审计、形式化验证 |
这张表不是一次性填完就完了。威胁模型是活的——新的漏洞披露、新的攻击技术出现,都得回头更新。把威胁模型当静态文档的团队,迟早会被新攻击打脸。
TEE 把攻击成本抬高,但没法消灭所有风险。理性做法是接受残余风险,前提是你清楚残余的是什么。比如:
千万别抱"绝对安全"的幻想。一旦出事,"我们以为它绝对安全"在事故复盘里是最不能服众的理由。
单个机制总会被绕过。成熟的 TEE 部署都是纵深防御——硬件隔离之上叠软件加固,内存加密之外加微架构隔离,远程认证之外加运行时监控。层与层之间用不同的检测逻辑(正则、结构、行为),攻击者要同时绕过所有层,难度显著上升。
| 防御层 | 挡什么 | 局限 |
|---|---|---|
| 硬件隔离 | 直接读改 TEE 内存 | 不挡微架构侧信道 |
| 内存加密 | 物理探针读 DRAM | 不挡重放攻击(需完整性配合) |
| 远程证明 | 初始状态被篡改 | 不挡运行时漏洞利用 |
| 运行时监控 | 行为异常 | 误报和延迟代价 |
💡 关键直觉:纵深防御的价值不是"层数叠加等于安全度翻倍",而是"每一层用不同的检测维度,攻击者绕过一层不等于绕过另一层"。一个能绕过内存隔离的侧信道攻击,未必能绕过行为监控——两套机制相互补盲。
下一章我们把第 1 章建立的威胁模型拿去对照三大主流架构——ARM TrustZone、Intel SGX、AMD SEV,看它们各自把信任边界划在哪、把哪些攻击者纳入了防御范围。