TwinVisor: Hardware-isolated Confifidential VirtualMachines for ARM
Dingji Li, Zeyu Mi, Yubin Xia, Binyu Zang, Haibo Chen, Haibing Guan
SOSP ’21, October 26–29, 2021, Virtual Event, Germany
© 2021 Association for Computing Machinery.
ACM ISBN 978-1-4503-8709-5/21/10. . . $15.00
https://doi.org/10.1145/3477132.3483554
Keywords: Cloud Computing, Virtualization, Confifidential Computing, ARM TrustZone
论文报告作者:张辰琦
本篇报告在开头提炼和明确了论文中的几个核心概念,下面首先介绍了问题的研究背景(research background),借此提出了本文研究的主要问题(research problem)。随后,介绍了作者实现目标(research gap)与遇到的困难挑战(research challenges),针对这些挑战,讲解了作者一系列的解决方案(methods)。之后介绍了作者的实现(implement)和对实现原型的性能评估(evaluation),最后,我对这篇文章做出一些评价(comment)。
基本概念
Confidential computing:机密计算
它利用硬件来提供可验证的隔离执行环境
Confidential VM:机密虚拟机 = secure VM = S-VM
它为对云提供商的云租户提供了一个孤立的执行环境
TEE(Trusted Execution Environment)可信执行环境
它是一种环境,其中执行的代码和访问的数据在机密性(没有人可以访问数据)和完整性(没有人可以更改代码及其行为)方面被隔离和保护
TrustZone
ARM公司在2003年提出来的一种成熟的硬件扩展,用来在移动平台上提供TEE。
他能够将服务器划分为两个世界,normal world (常规世界) a secure world(安全世界)
N-visor
TwinVisor重用常规世界内的已经存在的系统管理程序
S-visor
TwinVisor在安全世界创建的新的小型的系统管理程序
Trusted computing base
计算机系统的可信计算基础(TCB)是对其安全性至关重要的所有硬件、固件和/或软件组件的集合,在这种意义上,发生在TCB内部的bug或漏洞可能会危及整个系统的安全属性。相比之下,TCB之外的计算机系统的某些部分必须不能有不正常的行为,泄露超出根据安全策略授予它们的任何特权。
精心设计和实现系统的可信计算基础对系统的整体安全性至关重要。现代操作系统努力减少TCB(未在主体中验证)的大小,以便对其代码库进行彻底的检查(通过手动或计算机辅助的软件审计或程序验证)变得可行。
问题的背景
随着云计算的兴起,用户对数据安全性的要求也越来越高,所以机密计算也随之受关注,因为它能利用硬件提供隔离执行环境从而保护敏感的数据。机密计算有三个级别:应用级、容器级、虚拟机级,其中虚拟机级的机密计算由于与Iaas云的兼容性等众多优点被关注更多。
目前,各大云供应商都提供了机密虚拟机服务,比如谷歌云、IBM云等,ARM的用户也很关注ARM服务器什么时候才会提供机密虚拟机服务。虽然ARM最近宣布了一个ARMv9的扩展CCA能支持机密虚拟机,但是根据他们的路线图,ARM硬件在一两年内还不能用机密虚拟机,此外,目前还不清楚如何设计和实现建立在CCA上的系统。
但是,ARM有一个成熟的的硬件扩展TrustZone,它能够把服务器划分为两个独立的世界:常规世界和安全世界(a normal world and a secure world),因此TrustZone在移动平台上被广泛用来提供可信执行环境TEE。此外,TrustZone最近引入了具有安全EL2扩展的硬件虚拟化,能够支持在安全世界内高效运行虚拟机。
问题的提出
我们的一个关键问题是:是否有可能通过新的软件设计,来改造成熟的硬件特性,从而让ARM服务器能够支持机密虚拟机服务?
本文中,作者提出的TwinVisor,这是第一个能为ARM服务器提供硬件隔离的机密虚拟机的系统,它包括N-visor和S-Visor。
N-visor是TwinVisor重用的常规世界内的已有的管理程序,作用是管理硬件资源并为安全虚拟机和常规虚拟机(S-VM和N-VM)提供服务;S-visor是TwinVisor在安全世界中创建的很多小的管理程序,它被专门用来保护安全虚拟机(S-VMs)。
设计目标
TwinVisor在不扩大TCB的情况下,能让安全世界对常规世界的软件开放。
具体的目标有三个:
G1 安全性:安全虚拟机不能被不可信软件非法访问,TCB要小
G2 高效性:有没有TwinVisor对安全虚拟机的执行效率来说应该差不多
G3 最小改变:TwinVisor应该引入最小的改变
核心架构:
- N-visor可以管理S-VM和N-VM的硬件资源,S-visor只管理S-VM。
- N-Visor掌管硬件资源,为S-visor提供服务,S-visor负责保护他们。
- 当创建S-VM的时候,N-visor给它分配硬件资源,当N-visor想要运行虚拟机的时候,它把控制流交给S-visor。
挑战
现存的TurstZone设计方式给TwinVisor的实现带来了3个挑战。
Challenge1 独立的权限模型:TrustZone的安全世界不比常规世界有更多的权限,这样安全世界就不能透明的拦截常规世界的一些指令,比如trap-and-emulate
Challenge2 静态资源分配:TrustZone采用了一种静态资源分区的策略。这导致安全虚拟机的资源利用率很低
Challenge3 不频繁的两个世界的转换:TrustZone的世界转换太慢了,而TwinVisor要频繁转换
解决方案
针对这3个问题,我们分别提出了3种解决方案:
S olution1:逻辑上剥夺N-Visor的权力的模型
可能的方案:用PV模型。
缺点:会导致大量的世界转换,会引入大量的修改
提出了H-trap,一种类似trap的机制,使S-visor能够检查N-visor的操作
提出原因:在S-visor运行虚拟机之前,任何管理程序或者虚拟机配置都不能影响S-VM的执行
内容:
- 所有的对配置的检查都在S-visor进入S-VM的时候再开始批量进行
- H-Trap不为两个visor的交流提供任何共享的PV数据结构,而是重用已经存在的硬件接口
- S-visor检查CPU寄存器和内存之间的映射,并在进入S-VM之前阻止非法状态
- S-visor尽量不会让N-visor读写寄存器,当N-visor必须读到寄存器的值的时候,S-visor会选择性的开放几个寄存器。
Solution2:内存资源的协同管理
设计了一种分割连续内存分配器(split CMA),常规世界和安全世界都能用它协作来给常规世界动态分配内存
重用操作系统中已有的CMA(Contiguous Memory Allocator)
split CMA尽量保持安全内存是连续的,解决TZASC无法支持页面粒度动态地更改物理内存的安全状态的问题
split CMA可以再常规世界和常规世界分成两个模块:常规端和安全端,他们能够相互协作来转换内存的安全属性。如果S-visor不占用内存,常规端就把他们给了内存分配器,给常规内存分配,当S-visor需要更多内存,常规端就会收集内存,把内存给了安全端。反之同理。解决N-visor不能感知内存安全性的动态变化的问题
内存管理:split CMA设计了层次结构来管理内存:
- 上层:把所有的空余内存都组织到一个内存池中,并且增大了内存的分配粒度(防止锁竞争导致性能下降)
- 中层:内存池被分割成可变大小的内存块,每个块包含很多页并且只属于一个S-VM,块内存的地址跟块的大小对齐。
- 底层:内存块被当做内存页的缓存,维持了一个bitmap来记录那个页是闲置的。
内存压缩:解决常规端向安全端借内存,而安全端的内存不连续的问题。做法就是把不连续的内存放到连续的最前面。
Solution3:高效的世界转换
我们发现原来的世界转换包含着很多冗余操作
从前的做法:结合使用侧核轮询和共享内存。
缺点:浪费CPU资源,很难决定用多少核
- 使用共享页面在两个hypervisor之间传输vCPU的通用寄存器的值
- TwinVisor利用寄存器继承来进一步避免冗余操作。
实现
1.I/O虚拟化
TwinVisor用 shadow I/O rings 和 shadow DMA buffers 实现对S-VM透明、重用已有的代码
问题:
在Linux中,二者都是从S-VM的安全区内分配的,这对N-visor不可见
Shadow I/O ring给应用程序带来很大的开销
解决:
S-visor在N-visor的常规内存中复制shadow I/O rings和shadow DMA buffers,在两个世界中同步I/O请求和DMA数据
利用由WFx指令和物理IRQs引起的常规虚拟机退出来支持TX shadow I/O ring的更新。
2.评估的原型
功能评估:在ARM FVP平台上实现一个全功能的S-EL2.
性能评估:用了麒麟990开发板,支持VHE,其工作原理与启用了S-EL2的硬件类似。
安全属性:
固件和s面板在系统的生命周期内是受信任的
S-VM的内核镜像的完整性是由S-visor强制保证的
每个S-VM的CUP寄存器状态是被S-visor保护的
S-VM之间的内存、S-VM与常规世界的内存是彼此隔离的
每个S-VM的I/O数据都受到S-visor保护。
所有的数据和每个SVM的控制流都受到S-visor保护。
性能评估
- 微型测试
与原始版本相比,TwinVisor引入73%的开销
快速转换机制加快了世界间的转换速度
没有shadow S2PT的TwinVisor会节省很多开销
- 实际世界中的应用程序的性能
- 在所有的基准测试中,TwinVisor和原始版本的性能差异在5%以内,因为快速世界转换机制只占据应用程序有效执行时间的很小一部分
- TwinVisor中的N-VM和原始版本相比只占据少于1.5%的花销
- 稳定性测试
- 不管给了多少虚拟CPU,TwinVisor的花销少于5%
- 在混合工作负载中,所有基准测试的最大开销都小于6%。
- 随着S-VM的增长,TwinVisor是可扩展的。
- split-CMA的开销
- 在最坏的情况下,测试的Memcashed的吞吐量分别下降了6.84%和1.30%,开销减小的原因是多个S-VM平摊。
评价
本文主要目的是通过软件的设计,扩展了TrustZone的特性,来达到在ARM平台上实现硬件隔离级别的机密虚拟机的效果,为此作者提出了TwinVisor。TwinVisor的一个核心设计理念是:将管理与保护解耦,他让N-visor负责管理硬件资源、提供服务,S-visor负责保护。
在设计时,我们可以看到作者始终有着明确的设计原则和目标:首先,为了保持安全性,作者禁止N-visor访问任何CPU寄存器的值;其次,为了保持高效性,作者对冗余操作进行了精简;最后,为了只引入最少的更改、保持简洁性,作者在设计的时候选择尽量利用已有的结构,在其上做小量修改,如hypervisor、CMA、I/O机制等,而不是重新设计新的结构。
在设计之前,作者对比了现有的TrustZone与TwinVisor的设计思想的差异,明确的指出了要实现TwinVisor所面临的3个问题,即独立的权限模型、静态资源分配、不频繁的世界转换,并对这些问题逐一提出了针对性措施,条理清晰。之后,作者通过实验,测试TwinVisor与原始版本的性能差异,结果显示TwinVisor在安全虚拟机上仅造成了不到5%的性能开销,这样的结果是令人满意的。
文章最后,作者提出了对未来ARM的硬件设计建议,包括有选择性的透明指令捕获、细粒度的安全内存配置、直接世界交换。
参考博客
[1]ARM系列之ARM Trustzone 技术浅析(一)—— TEE概述&ARM Trustzone硬件架构基础介绍
[4]从Intel新酷睿处理器放弃SGX看机密计算技术的发展
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1149440709@qq.com