RISC-V轻量级安全引导方案
现在的安全boot方案要么太过复杂,要么被攻击者攻破。在这种情况下,开源的安全boot架构对于设计者和白帽攻击者就很重要了。这篇文章中提出了一种轻量级的安全boot架构,这种架构高效地使用了ECDSA
算法、SHA3
算法和DMA。另外,架构中包含一个密钥管理单元,其中包含了一个优化的PUF为密钥在SoC上提供安全的模块。这个架构在RISC-V的SoC上得到了验证。
Boot是一个安全系统的生命周期中关键的一环,很多攻击发生在这个阶段,比如可以将内核替换为一个已经被污染的内核,使得这个系统变得脆弱。所以安全系统中的一个重要准则就是,为从第一阶段引导到安全应用程序建立信任链。本篇文章提出的安全boot架构,这是第一个为RISC-V SoC构建的以硬件为基础的安全boot架构。本篇文章的架构定义了一个中心化的代码认证单元(CAU
),用于验证信任链的完整性,CAU
使用了ECDSA
和SHA3
。高效利用ECDSA使得PUF可以轻松地对生成的非对称密钥并对其进行更管理,同时CAU
使用DMA来进行代码的快速读取和认证。它整体框架如下:
这篇文章主要做出了如下贡献:
- 提出了一种轻量级的安全boot架构来保证系统完整性和对软件提供商进行验证。
- 框架中包含了一个密钥管理单元,管理单元中实现了物理不可克隆功能(PUF)。
- 将代码认证单元整合进了RISC-V SoC。
接下来文章介绍了前人做的工作,RISC-V SoC的整体框架,安全boot的整体框架,安全性分析,性能分析。
背景和基本概念
这里列举提升RISC-V
硬件安全的工作,如Shakti-T
利用了基地址和界限的概念保证指针只访问合法的区域,SMARTS
实现了一个内存保护单元PMU
,这些工作保证了DRAM
的安全;Keystone
是第一个开源的利用RISC-V
架构构架的TEE
项目;Sanctum
介绍了一种基于软件的安全boot和远程认证方式。然而,这些工作都是使用了基于软件的安全boot方式,相较于硬件实现的方式有很多缺点。
什么是Secure boot
在W. A. Arbaugh, D. J. Farber, and J. M. Smith, “A secure and reliable bootstrap architecture,” in Security and Privacy, 1997. Proceedings., 1997 IEEE Symposium on. IEEE, 1997, pp. 65–71.
这一篇的paper中提出了构建信任链的概念,即启动过程中每一个阶段都要验证下一个阶段的完整性。在UEFI 2.2
版本以后都有安全boot的介绍,UEFI
通过在boot的每一个阶段都会计算一个哈希值,然后就可以验证签名。如果这个检查失败了,那么boot就会失败;反之,boot的安全性就得到了保证。
当然安全boot有很多变种,如Intel处理器支持安全boot的两种模式,measured mode
和verified mode
,两种模式的信根都是微代码。在measured mode
下TPM
负责签注密钥,verified mode
下前一阶段对于后一阶段的验证。另外一种模式,就是通过专门安全处理器,例如AMD将信根置于ROM中。ROM验证安全引导密钥,之后这个密钥将用于验证更大处理器固件代码(在flash中)。
数字签名
数字签名技术是广泛应用的技术,它应用于浏览器和邮件等服务。几乎所有的公钥加密系统都有涉及很难解决的数学问题。如,RSA基于大素数分解难题,而ECC基于椭圆曲线离散对数问题。最流行的签名方案是基于椭圆曲线的ECDSA,最受欢迎的加密方案叫ECIES,最受欢迎的密钥协议叫ECDH。
PUF
PUF
可以利用开机时的状态生产密钥,在商用的产品中,PUF
可以用于生成和用户共享的对称密钥,也可以用于生成非对称密钥的随机种子。
RISC-V SoC
这个SoC是利用lowRISC
来构建的,这个SoC集成了安全boot、加密、片外内存验证、密钥管理、密码学运算加速等功能。当然,一个安全的SoC应该从硬件和软件上都是可靠的,构建一个安全的RISC-V安全系统需要利用各种特性去防御针对硬件的攻击和来自运行在其之上的软件的威胁。
- 密钥管理单元,管理密钥同时将其放置到各个安全模块上。
- 代码认证单元,用于防御镜像修改、僵尸攻击等,和
Boot-Sequencer
模块一起用于实现安全boot。 - 安全Debug,用于抵御一些密钥窃取,非法的debug,probe等测信道攻击。
- 可信执行环境,就是图中标为4的单元,为应用创造隔离的执行环境。
- 可信片外存储,抵御测信道攻击的必要模块,同时为可信执行环境提供使用的存储空间。
安全Boot的框架
一个安全的SoC要保证从boot一开始就建立信根,并在OS运行之后一直保持。第一阶段的不变的bootloader
位于只读的ROM上,这个阶段的引导将从密码学上验证第二阶段bootloader
的签名,之后这个第二阶段的bootloader
也会验证下一个阶段软件的签名,以此类推。到了直接链的末尾,一个可信的应用就被建立到SoC的可信执行环境上。
Berkeley Boot Loader
RISC-V主要的引导过程指令都被定义在Berkeley Boot Loader
中,BBL
将执行初始化硬件,建立页表,加载内核,启动内核等任务。整个过程是分多阶段执行的。
- 第一步,在RISC-V SoC中的ROM中包含了一个裸机程序,这个程序用于加载
BBL
,首先运行这个程序。 - 第二步,将
BBL
加载到DDR
内存,实际上BBL的大小是大于ROM的,所以在RISC-V中实际上,有两个选项SD-Boot
:BBL
实际上位于外部的SD卡中。- 网络启动:这个裸机程序向外发送请求。
加载进来的程序,将会是一个ELF文件包含BBL
也可能包含内核。
- 第三步,
BBL
运行在最高权限,执行一系列的初始化后,加载并执行内核。
信根
boot的过程起始在ROM中的固定指令,然后跳转到BRAM中。这个过程需要使用CAU
单元进行认证。
CAU
代码认证单元用于验证程序的签名,通过验证每一个即将被执行的程序,就可以阻止没有被认证或者被修改过的代码的运行。将ROM中的代码可以直接放置在0x100000
的位置,这个位置将直接触发CAU
的检查,如果失败,则会直接挂起。
RISC-V上的linux
这里使用linux版本为4.2
,一个裸机程序已经直接被预先初始化到BRAM中,ROM的程序会直接跳转到BRAM的位置,开始执行将BBL
的代码从SD卡拷贝到DDR。就像前面介绍的一样,Linux不是直接启动的,它是通过BBL
启动的,ROM在设置完外设的其实地址后,将跳转到BRAM,这样就不需要BIOS
来决定或者计算这些地址。
接下来,在S模式启动linux,当然BBL
仍然运行在更高的特权级来服务外设的终端请求。
Boot Sequencer和密钥管理单元
Boot Sequencer
实际上是一个有限状态机,在每个boot stage
的时候进行状态切换,Boot Sequencer
会调度密钥管理单元将相关的密钥发送给CAU
,这样CAU
就可以通过ECDSA
进行验证签名。现在这里的实现只是一个有限状态机,但是可以优化为一个微控制器。
密钥管理单元实际上负责密钥的生产和传发。TRNG
是随机数生成器,PUF
前面已经做了介绍,OTP
是一次性存储模块。它们的协作过程如下,首先随机数生产单元生产对称密钥。并放置在存储单元。PUF
取出这个密钥,并将其发送到需要的安全模块。CAU
的一次性存储单元中存储了一个非对称加密算法中的私钥。
安全性分析
对比传统的安全boot方式,这篇文章的工作的优势如下:
- 硬件实现的验证方式,性能更高更加节能。
- 在RISC-V核心上进行
SHA3
和ECDSA
运算假设了RISC-V处理器本身是可信的,如果将处理器本身考虑为TCB
的一部分,那么随之而来的就是TCB
过大的问题,那么就给Meltdown
和Spectre
等漏洞创造了攻击面。另一方面来说,这篇工作中假设CAU
和Boot Sequencer
是可信的,但是RISC-V处理器本身是不可信的。 - 这篇文章中安全boot的过程是有中心化的
CAU
进行控制的,所以可以地控制整个引导过程。
性能分析
CAU
CAU
主要包含三个模块,1)DMA; 2)SHA1
处理单元;3)ECDSA
验证单元。DMA由Boot Sequencer
进行配置,从内存中读取代码,同使用SHA3
单元进行计算,密钥管理单元将公钥发送到CAU
,之后有了代码的哈希,签名还有公钥,就可以进行签名的验证。
ECDSA
的性能分析,性能优势非常明显:- 通过只存储非0的RC和流水化,提升SHA3执行单元的频率和并减小面积。
- 特殊的线性反馈寄存器为随机数的生产提高稳定性。
结论
这个框架利用对于ECDSA
, SHA3
, PUF
等单元的优化,实现了一个轻量级的RISC-V安全boot架构,未来可以做的工作还有,1.支持远程验证,2.将可信执行环境整合进SoC。这篇论文是在看Sanctum
时看到的,可以看到对于前人的工作做了很多整合,具体的最大的贡献是提出了CAU
和Boot Sequencer
来进行验证的操作,有两个最大的优势,第一可以避免处理器漏洞对于验证过程本身可信度的威胁;第二是专门的密码学计算单元肯定是可以加速的,但是只是boot加速;可能还有没有体现出来的一点是中心化,可以配置,论文中提出这是未来可以做的点,最后的最后DMA在在这里的意义是否被体现出来,也是值得思考的问题。