利用ARM TrustZone在移动设备上实现双系统运行

ARM 194浏览

本文章最初发布在:System Research Blog

概述

前一篇文章TEE and ARM TrustZone中讲到ARM
TrustZone并不是虚拟化的有效替代方法,而是类似于一个更大更快资源更丰富的TPM。但是TrustZone能够实现部分虚拟化的功能,特别地,它能够实现双系统的隔离运行。为了验证想法的可行性,近日我们在T6的基础上,成功地在三星Exynos
4412上同时稳定运行Android和Ubuntu系统,这里简单介绍实现原理。

背景

通常解决计算机系统的安全问题的手段无外乎两个:加密与隔离。加密多是研究密码学和数学的人在弄,系统研究者通常就使用些基本的加密手段完成某一目的;而隔离作为系统研究者的一把屠龙宝刀,一直被用于解决系统安全的各类问题。在服务器领域,操作系统的隔离主要是通过虚拟化完成,不同的操作系统(虚拟机)通过虚拟机监控器同时共享所有的物理资源。然而在移动平台,虚拟化一直没能被广泛采用,一是硬件条件与资源限制(硬件虚拟化不成熟),二是需求不强烈(一部手机很少需要同时运行几个OS,并且电量消耗也是个大问题)。不过如果一部手机能够运行两个OS,同一时间只有一个OS在执行却能带来不少好处:在保证更好的安全隔离、给用户更多的选择的同时又不多消耗资源(电量)。

在研究界,这样的系统被称为“红绿系统”:一个(红)系统被认为是不安全的,但功能丰富;一个(绿)系统是安全的,它更多地是运行些安全相关的功能。跟红绿系统相关的研究论文有非常多,其实CMU的CyLab就在其中灌水无数。除了虚拟化,还有一种实现红绿系统的手段是物理划分(partition),说简单点就是物理内存大家都是划分好相互独立使用的,而设备资源大家轮流使用。我们的双系统也是基于物理划分实现的。

直接的实现方法

利用ARM TrustZone实现红绿系统,直观的方法是每个world都运行一个OS,比如在Normal World中运行Ubuntu,在Secure World中运行Android,然而这么做会有不少问题:1.Secure World的权限比较大,它能访问Normal World所有的状态,这样如果Secure World中出了问题,基本上两个OS也就不安全了,也就没有达到我们想要的隔离的要求了;2.现在ARM版本的Ubuntu和Android都默认系统运行在Normal World,并有部分内核接口会调用Secure
World,如果将某一个OS运行在Secure World,就意味着需要对该OS做不少的修改才能运行。

设计

TrustZone T6 Dual OS
如上图所示,我们采用的方法是Android与Ubuntu系统均运行在Normal World中,在Secure World中运行T6,T6相当于一个小的VMM负责管理这两个系统。在开始阶段运行的是系统A(假设为Android),一旦用户想要切换到系统B(Ubuntu)运行,那么T6会将发一个命令给Android,让其进入休眠状态,然后T6会保存Android的所有必要的运行状态,包含CP15协处理器状态、中断表状态以及所有必要的外设的状态,然后将Android所在的内存段设为安全内存(防止Ubuntu篡改Android状态)。接着载入保存的Ubuntu系统状态,然后恢复并切换到Ubuntu运行。

实现

实现上的Challenge都是工程性的,很多都在实现TrustUI时遇到过,不一一细说,不过debug很花时间。两个OS间切换需要时间大致在5S左右,在假设用户不会频繁切换系统的情况下还是可以接受的。

不足

有一个安全问题是存储隔离,目前两个系统共用一块物理存储,只是使用不同分区而已,存储的安全性并没有解决。一种可能的解决方法是对两个系统的存储分别进行加密,但这会带来很大的性能问题。另外一点是目前还不支持多核切换,也就是说每个系统都是单核运行。