TrustZone
是
ARM
针对消费电子设备安全所提出的一种架构。对于这种设备的安全威胁,可以有几种形态的安全解决方案。
外部的硬件安全模块,比如设备上的
SIM
卡。这种方式的优点是
SIM
卡具有特定的软硬件安全特性,能够保护卡内的密钥等资源,而且要攻破其防护所付出的代价很高。缺点就是与设备的接口通讯速度低,而且不能保护用户界面的安全,即与用户交互的数据的安全,所以在交易支付方面该方案还不能提供好的保护;
内部的硬件安全模块,即把类似于智能卡的功能直接放到
SoC
里面。这种方式也只能保护诸如密钥之类的资源,不能保护用户交互数据。在
SoC
里面有两个核:一个普通的
app
核和一个安全核。两个核之间的通信速度也会比较低。而且在占用
SoC
面积,调试端口的访问控制等方面也需要很小心谨慎;
软件虚拟化。虚拟化技术如果要保护用户界面的安全,就需要在
GPU
的控制上加入很多的验证,这对于图形处理的性能也会产生较大影响。同时,调试端口也仍然是一个问题。
TrustZone
的硬件架构是整个系统设计过程中的安全体系的扩展,目标是防范设备可能遭受到的多种特定威胁(注意这种威胁除了来自恶意软件,黑作坊,还有可能来自设备的持有人)。系统的安全,是通过将
SoC
的硬件和软件资源划分到两个世界来获得的。这两个世界是安全子系统对应的安全世界,和其他子系统对应的普通世界。
AMBA3 AXI
总线系统能确保安全世界的资源不会被普通世界所访问。而在
ARM
处理器核也有相应的扩展,来让两个世界的代码能分时运行在同一个核上,这就实际上节省了一个核。另一方面就是扩展了调试体系,使得安全世界的调试有相应的访问控制。
在处理器架构上,每个物理的处理器核提供两个虚拟核,一个是非安全核(
Non-secure, NS
),另一个是安全核(
Secure
),在这二者之间切换的机制叫做
monitor
模式。
NS
核只能访问
NS
的系统资源,而安全核能访问所有资源。普通世界的软件可以使用
SMC
指令或者通过硬件异常机制的一个子集来进入到
monitor
模式。可以配置
IRQ
,
FIQ
,外部
data abort,
外部
prefetch abort
这几个异常进入到
monitor
模式。下图展现了这种切换方式。
最简单的情况是,当普通世界的用户模式需要获取安全世界的服务时,首先需要进入到普通世界的特权模式,在该模式下调用
SMC
,处理器将进入到
monitor
模式,
monitor
模式备份普通世界的上下文,然后进入到安全世界的特权模式,此时的运行环境是安全世界的执行环境,此后进入到安全世界的用户模式,执行相应的安全服务。这里把安全世界的用户模式和特权模式分离,是因为通常特权模式中的执行环境是系统级别的,而用户模式的安全服务是应用级别的,两者的提供者通常是不同的。下图是软件架构的展示。也就是说,安全世界的执行环境要管理用户模式的服务和应用,并给它们提供编程接口。
通常而言,
monitor
模式中的代码是做两个虚拟核之间切换时的上下文备份和恢复。
CP15
的
SCR
寄存器的
NS
位表明了当前处理器所处的安全状态,该寄存器在普通世界是不能被访问的。
对于
L1
内存,也需要做与两个世界对应的划分,这样,对于有
TrustZone
的处理器也有两个虚拟的
MMU
,使得每个世界都有自己本地的转换表,来控制地址映射。实际上,转换表的描述里面有一个
NS
域,对于
NS
的虚拟核,它会忽略这一位。而对于安全虚拟核,无论
NS
为
0
或者
1
,都可以访问转换表,这也使得安全虚拟核可以访问任何内存。对于
TLB
而言,
TLB
的
tag
可以记录当前的表是哪个世界的(这个不是
ARM
强制的,即各芯片厂商可以自己另外定义),从而让两个世界的
TLB
能够共存,这也使得世界之间的切换更加快速,而不用去刷
TLB
记录。同样的,对于
cache
,也扩展了一位
tag
来记录安全状态,从而也使得世界切换时不用刷
cache
。
安全中断。在
TrustZone
技术中,
IRQ
和
FIQ
都可以配置为直接进入
monitor
模式。推荐的方式是普通世界的中断源使用
IRQ
,而安全世界的中断源使用
FIQ
。因为在
Linux
中,
FIQ
是不使用的,中断源都是
IRQ
。下图展现了
IRQ
配置为
NS
中断的情况。
当处理器运行在普通世界时,
IRQ
直接进入到普通世界的
IRQ
处理函数;如果处理器运行在安全世界,当
IRQ
发生时,会先进入到
Monitor
模式,然后跳到普通的
IRQ
处理函数执行。通常而言,进入到
monitor
模式再切换所导致的中断延迟的影响很小,尤其是对于非实时系统而言。
对于多核系统,是一个更加重量级的话题,设想
4
个物理核,每个又分为两个虚拟核,是什么样的情况,下图是一个展示。
在这样的系统中,外部内存的一致性,中断处理,多核之间的普通世界和安全世界之间的状态管理和同步都需要深思熟虑。
安全启动。下图是安全启动的顺序。
上电后,
ROM
中的
bootloader
初始化关键的外设,比如内存控制权,然后切换到外部的
bootloader
,然后安全世界的
OS
启动后会做相应的操作环境的初始化,之后才会让普通世界的
bootloader
去装载普通世界的
OS
。这里的签名协议是基于
RSA
算法的,所以设备里面当然会存有相应的公钥了。这其中有一个信任链的概念,就是说后装入的组件必须要能通过前面装入的组件的认证。一次性编程(
OTP
)硬件就是拿来做这个信任链的根的存储的。但是
RSA
公钥又长了点,比较浪费存储空间,于是只把公钥的
hash
放在
OTP
区域中就行了。当然,有了这样的安全启动,实现
OMTP TR1
中的
FSB
就顺理成章了,只要有相应的私钥签名即可。那么,对于不需要更新启动链中组件的安全启动,是否还需要非对称算法呢?