启动链保证了"运行的是正版代码",但正版代码里也分三六九等:密钥操作、指纹比对、支付确认这类敏感活,不该与普通应用同锅吃饭。隔离技术的任务是画一条硬件强制执行的边界,把敏感世界圈起来。本节讲清隔离的三个层次(特权、执行环境、内存)、边界上的受控通道设计,并以 CK770 密钥服务的隔离改造做实战演示。读完你应当能给一颗 SoC 画出访问权限图,并掌握"笼子要配门、门要有人守"的设计纪律。
隔离的思路可以浓缩成一句话:特权分级加硬件执行。操作系统的特权分级(内核态与用户态)大家熟悉,但它是软件约定的——有漏洞的内核拦不住内核里的漏洞。SoC 的隔离把分级下沉到硬件:总线上的每一次访问自带安全属性标签,保护单元按标签与物理地址裁决放行与否,裁决在总线层面完成,软件无法绕过。这就是 1.1 节"硬件强制的契约"在安全维度的具体形态。
层次上,现代 SoC 的隔离从下往上三道笼子。内存隔离是地板:敏感域的物理地址区间对普通域完全不可见,哪怕普通域的代码试图"瞎闯"地址,总线保护单元直接拒绝。执行环境隔离是主体:处理器支持两个世界的切换(业内通行的做法是一个"安全世界"加一个"普通世界"),敏感代码只在安全世界运行,普通世界调用敏感服务要穿过一根受控的门。外设隔离是围墙:加密引擎、真随机数发生器这类敏感外设只接受安全世界的访问,密钥从生到死不出安全域——这也是"硬件信任根"在运行期的延续。
三道笼子共同遵守一条纪律:笼子要配门,门要有人守。完全的隔绝等于不可用——普通世界总需要"请安全世界帮我加密一段数据"这类服务。门的设计因此是隔离技术的精华:入口是一个严格参数检查的服务调用,参数在安全域内复制校验后才使用(防"传入指针指向自己的地盘"的经典漏洞),返回值走共享缓冲区交接。门少而严,是安全架构的审美。
图里最值得咀嚼的是那根虚线:总线保护单元对普通世界的越界尝试一律拒绝,这条裁决线没有任何软件手段可以移动——隔离的"硬件强制"四个字就落在这里。
门与笼子说清楚后,真正的工程难点在交接。敏感服务的结果要回到普通世界,数据怎么过边界而不带病?CK770 的设计走过一轮弯路,正好当教材。
第一版的交接是"安全域直接往普通世界的任意缓冲区写结果"。漏洞立现:攻击者操控普通世界的缓冲区指针,让安全域把密钥运算的中间数据写到攻击者指定的位置——安全域沦为普通世界的搬运工,这叫"混淆代理人"问题。修正版立了三条规矩:共享缓冲区是独立划出的第三块地盘(既不属于普通世界的堆,也不属于安全域的私有区);写入方向固定(安全域只写、普通世界只读,方向由总线保护单元硬编码);长度与越界检查在安全域内完成(普通世界宣称的长度一律不信)。三规矩合起来,边界数据流从"随意指认"变成"固定窗口交接"。
再补一条容易被忽略的纪律:越界的失败要安静。普通世界对安全地址的访问被拒绝时,总线返回的应答与"访问了不存在的地址"应当一致——如果"拒绝"与"不存在"的应答不同,攻击者可以拿差异当探针,把安全域的地址布局一条条摸出来。这类"信息从拒绝行为里泄露"的侧信道,8.3 节还会以更大的篇幅再见。
背景:CK770 的初版架构里,密钥运算由计算域的加密加速器承担,密钥存放在普通内存的受保护页——这是"软件隔离",靠操作系统守住。安全评审判定不达标:内核漏洞一旦被利用,密钥全部沦陷,7.1 节预算里那个"两年电池"的产品承诺(安全传感数据的商业前提)随之破产。立项隔离改造。
操作。 改造按三步走。第一步划地盘:安全域的私有内存(密钥、中间态)与安全外设(加密引擎、真随机数)在物理地址图上独立成区,总线保护单元配置为"普通域访问即拒绝"。第二步搬逻辑:密钥服务从普通世界的库函数改写为安全域内的服务进程,对外只暴露三个门——生成密钥、签名、解封装;每个门做参数复制校验。第三步建窗口:按三条规矩设置共享缓冲区,方向硬编码、长度安全域核。改造的验证用了两条腿:常规仿真跑功能回归,形式验证跑"普通世界任意状态序列都无法读到密钥"的全称命题——上一节的方法论在这里复用。
结果。 改造后渗透测试尝试了三类攻击:直接访问密钥地址(总线拒绝,应答与访问空区一致)、操控共享缓冲区指针(方向硬编码,写不进)、伪造长度越界(安全域校验拦截)。三攻皆溃。代价也如实入账:安全域占掉约百分之四的存储面积,密钥服务调用比库函数慢数倍(过门与校验的开销),高频调用场景要靠批量接口摊薄——性能与安全的账,又一次要在评审会上当面算清。
解读。 这场改造的第一课是**"软件守不住秘密"这条公理**:受保护页再精巧,防线与攻击者在同一特权层;下沉到总线层,防线比攻击者低一层——安全隔离的层次感,本质是攻防的地理学。第二课是边界工程的重心在数据流不在访问控制:三道笼子画完只是及格线,混淆代理人、共享窗口、安静失败这些数据流细节才是实战的分水岭。第三课是验证命题要全称:功能回归绿一万次也证明不了"永远读不到",只有穷举式命题能——安全验证的方法论一以贯之。
变式。若产品要跑第三方应用(开放平台),隔离层级要再升一档:多套隔离域并存、按应用分配,域间通信全走受控通道——笼子从两间变多间,门卫的权限表变成一张二维矩阵;若产品对性能极度敏感(高频签名服务),可以把"门"做成硬件直通通道(专用寄存器组交接),省掉软件过门的开销,代价是通道协议要进硬件、改协议要改硅。隔离没有免费午餐,每份强韧都有账单。
隔离改变的是攻击的可达性,不是代码的质量——安全域内的漏洞同样要按漏洞治理,只是治理的半径小得多:攻击面从"整个软件栈"缩到"几个门入口的参数检查逻辑",这也是门少而严的另一个理由。配套纪律有两条:安全域代码要有独立于普通域的审计与回归基线;门的参数校验代码要用与 5.1 节断言同等强度的方式形式化验证——入口是唯一暴露面,入口的正确性必须用最高标准守。
运行时的软件攻防布防完毕,但攻击者还有一个终极手段——不攻击代码,直接攻击芯片这个物理对象。下一节进入防物理攻击的战场。