SATIN: A Secure and Trustworthy Asynchronous Introspection on Multi-Core ARM Processors阅读翻译与笔记

SATIN : 多核ARM处理器上的一种安全可信的异步自省理论

这篇论文是在以此 可靠系统和网络(Dependable Systems and Networks DSN) 会议上发表的

背景
现有技术存在的问题
提出的方案 描述
测试 评估 开销

SATIN 在英文中是 绸缎的意思

摘要 Abstract

在具有TrustZone安全扩展的ARM处理器上,已经在安全领域开发了异步自省机制,以检测在正常情况(normal world)下安全策略违规情况。这些机制通过被动检查正常世界的快照来提供安全保护。但是,由于以前的安全世界检查解决方案需要挂起整个富操作系统,因此异步自省机制在现实世界中尚未得到广泛采用。

给定一个可以在不同内核上同时执行两个世界的多核ARM系统,安全世界自省机制可以检查富操作系统而无需挂起。然而,我们确定了一种新的正常世界逃避攻击,当安全检查在另一个内核上执行时,它可以通过从一个内核并行删除攻击痕迹来打破异步自省机制。我们对此攻击进行了系统的研究,并且展示了它对于现在这种异步自省机制的效率。作为对策,我们提出了一种安全可信的异步自省机制SATIN,该机制可以通过增加攻击者的逃避时间成本并且在安全限制内减少防御者的执行时间来有效检测回避攻击。我们在ARM开发板上实现了一个原型,实验结果表明,SATIN可以有效防止多核系统上的逃避攻击,而系统开销很小。

关键词 Index Terms

Asynchronous Introspection 异步自省
Evasion Attack 回避攻击
Trusted Execution Environment TEE 可信执行环境

Introduction 介绍

自省机制已经开发并且部署到了高权限执行环境中,以防止或检测主机上低权限执行环境中的安全策略违规行为。一般来说,自省机制可以分为两类,用于预防攻击的同步自省和用于攻击检测的异步自省。ARM TrustZone技术是一种系统范围内的安全性机制,可以在按时间分片方式共享CPU的两个执行环境之间提供硬件级别的隔离,其中安全环境拥有更高的权限来访问常规环境的系统资源,例如内存、CPU寄存器和外设,但反之则不然。为了增强移动设备的安全性,许多TrustZone辅助的自省机制已经被开发并部署到了数百万个移动设备上。

同步自省机制的重点是由高权限执行环境内联地拦截和中介对安全敏感的操作,以防止在低权限执行环境中违反安全策略。例如,已经在虚拟机管理器中开发了同步机制以确保虚拟机中的页面内存保护。同样,三星的KNOX实时内核保护(RKP)机制依靠ARM TrustZone技术来拦截正常世界中的某些特殊权限系统功能,并在执行之前通过安全世界对其进行筛选和以供检查和批准。

然而,同步自省机制面临两个主要挑战。首先他必须要链接到所有可能被攻击者利用的安全敏感位置。尽管可以通过最近发现的策略违规记录建立一个接近完整的列表,但是很难确保此类列表的完整性。其次,某些实现上的错误,例如“在哪里写什么”,使攻击者可以通过绕过针对同步自省的功能检查点设置来发起数据攻击。攻击者一旦发现同步自省的任何漏洞,就可以部署持久性的rootkit来维持对普通世界(富操作系统)的根访问权限,窃取数据或误导用户行为,而不会被同步自省机制检测到。

异步自省机制可以通过分析内存快照中的安全策略违规攻击痕迹以及从低权限执行环境(比如正常环境、世界)中定期或随机获取的CPU状态信息来有效检测那些持久性的rootkit.除了简单地检查不变内核代码的完整性之外,还开发了许多概念证明方法,以在填补语义空白后,对动态内核数据结构提供更细粒度的安全性检查。与同步机制需要拦截目标行的所有读、写事务不同,异步自省机制是基于目标的快照进行自省,这使得它可以更有效更完整地自检目标而且更有效的检测持久攻击。

在实践中应用异步自省机制的一个主要限制是自省过程可能会引入巨大的系统开销。特别的,在ARM单核处理器中,每当安全领域执行安全检查时,整个富操作系统将会在内存获取和在线内存分析过程中挂起。由于在移动设备上的这种不良使用体验,基于TrustZone的异步自省机制尚未得到广泛的部署或启用。

现代多核ARM处理器为基于TrustZone部署使用的异步自省机制而又不中断富操作系统提供了新的机会。具体来说,ARM多核系统结构允许每个核独立进入其安全世界,因此富操作系统和安全操作系统可以并行运行。现在可以让一个或者多个内核轮流执行异步自省任务,而让其他内核继续正常运行。例如,三星KNOX在安全环境中包括定期内核测量(PKM)机制,以在特定内核上执行定期异步自省。

在本文中,我们揭示了一种新型的逃避攻击,它可以通过在安全检查在另一个内核上执行的同时从一个内核上同时删除攻击痕迹来攻克多核系统上的异步自省。躲避攻击的目标是通过准确预测下一次安全检查的时间删除所有攻击证据以避免被发现从而消除异步反省。

但是,在可以同时运行正常世界和安全世界的多核移动设备上,除了在安全检查之前删除攻击踪迹之外,攻击者还可以在自省开始后但有机会检查任何恶意字节之前隐藏其攻击踪迹。我们将这种类型的回避攻击称为TZ-Evader。

设计TZ-Evader攻击时,有两个主要挑战需要解决。首先,在正常世界中运行的恶意代码需要知道异步自省是否正在任何内核的安全世界中运行;然而,ARM TrustZone体系结构可保护安全世界运行的信息不被普通世界访问。为了解决这个挑战,我们利用CPU内核的可用性作为辅助通道信息,以决定自检是否在任何内核上运行。我们开发了一个用户级探针程序,以秘密的检测每个内核的当前状态。其次,当一个内核进入安全世界并且开始运行检查时,恶意正常世界需要尽早检测到内核的状态改变来使他的逃避能力最大化。为了解决这一挑战,我们提出了一个内核级探针程序,可以准确地监视所有内核的运行状态变化。部署内核级探针有两种实现方式,一种是通过拦截计时器中断把探针插入到副操作系统中,另一种是通过操作Linux内核的实时调度程序把探针添加成高优先级进程。

通过在ARM Juno r1开发板上将内核级别的探针和传统的持久性rootkit集成在一起,我们实现了概念验证的TZ-Evader攻击。我们根据最新的异步自省机制评估其有效性,实验结果表明新的TZ-Evader攻击可以准确地检测到异步内省的运行,从而成功的进行逃避攻击。基于对TZ-Evader的深刻理解,我们提出了一种在安全世界中称为SATIN的安全可信的异步自省解决方案来击败TZ_Evader攻击。基本思想就是最小化每次自检的运行时间并且与此同时最大化TZ-Evader的探测延迟。我们提出了许多技术,包括随机唤醒时间,随机自省区域和随机CPU亲和力,以确保可以一直在TZ-Evader可以隐藏任何攻击痕迹之前完成异步自省。我们在ARM Juno r1开发板上实现了SATIN的原型,实验结果表明,它可以以较小的系统开销有效地检测TZ-Evader攻击。

总而言之,我们达成了以下的成就:

  • 我们发现了一种针对多核ARM处理器上的异步检查的称为EZ-Evader的新的规避攻击。这种攻击利用边信道信息来推断是否有任何内核在安全环境中运行,然后开始在正常环境中运行的其他内核上同时清除攻击痕迹。

  • 我们为普通世界开发了一种称为KProber的高精度探测技术,可以快速探测所有内核的运行状态。基于KProber,我们实现了概念验证的TZ-Evader,它可以克服现有的基于TrustZone的异步自省机制。

  • 我们提出了一种安全可靠的异步自省机制,称为SATIN,以保护移动设备免受TZ-Evader的侵害。它通过最小化每个自省回合的运行时间并最大化TZ-Evader的探测延迟在这场比赛中战胜了攻击者。

背景知识

A : ARMv8-A 安全模型

ARMv8-A体系结构是最新的64/32位ARM体系结构,它支持带有64位寄存器的执行指令,并与32位ARMv7体系结构保持向后兼容。在AArch64安全模型中,每条指令都在四个异常级别EL0,EL1,EL2和EL3之一上执行,如图1所示。EL3是最高的权限级别,它仅包含一个用于控制安全环境和普通环境之间的上下文切换安全监视器。在现实世界中,用户应用程序通常在EL0上运行,虚拟操作系统在EL1上运行,虚拟机监视器在EL2上运行。在安全世界中,安全应用程序在S-EL0级别上运行,安全操作系统在S-EL1级别上运行。由于没有S-EL2级别,因此安全世界不支持虚拟机监控程序层。异步自省模块可以在S-EL1或S-EL0级别上实现。
图一

B : 抢占/非抢占安全模式

ARM中断管理框架负责配置中断路由行为。这里有两个通用的要求。首先,即使当前执行在正常环境中,也应确保路由安全中断以由安全世界处理。因此,它可以保护安全中断,以防止来自非安全软件的潜在干扰。其次,当当前执行在安全环境中时,它应该能够将非安全中断路由到正常环境。当将非安全中断配置为路由到EL3时,EL3中的安全监视器可以在将中断传递给非安全软件之前将软件状态保存在安全环境中。在这种情况下,安全世界是抢占式的(先发制人的)。当将非安全中断配置为路由到S-EL1或S-EL0时,安全软件可以以抢占模式将中断传递给非安全软件,或者忽略该中断,保持非抢占式安全模式直到其运行任务完成。OP-TEE OS是一个开源的支持抢占式安全世界的安全操作系统。

多核处理器上的躲避攻击

A : 假设与威胁模型

我们假设安全世界是可以信任的,并且安全世界中的所有自省组件都可以免受正常世界中的攻击。异步自省可以在任何时间在任何内核上随机运行,并且不能被正常世界拦截。我们假设异步自省不会在所有内核上挂起富操作系统。否则,它将面临与单核处理器相同的糟糕的用户体验问题。我们假设富操作系统可能受到损害,并且攻击者可以绕过现有的同步自省机制来获得root权限(请参阅第VII-A节中的讨论)。我们假设攻击是高级持续威胁(APT),其目的是保持其在目标上的持续存在并做出各种努力以保持未被发现的状态。例如,按键记录器可以通过拦截系统中断来收集键盘上的所有用户输入,而内省可以检测到劫持。在这种情况下,每当自省运行时,按键记录程序都应停止攻击并清除其攻击痕迹以伪装其存在(假装成不存在);同时,对于所有其他时间,它仍处于攻击阶段。

B : 新的攻击面

在多核ARM处理器上,攻击者可能会通过满足两个要求来击败现有的异步自省。首先,正常世界中的恶意代码可以检测一个内核是否正在进入安全世界。其次,在安全世界中的内核可以访问攻击痕迹之前,在其他内核上运行的恶意代码可以删除攻击痕迹。

  • 探查CPU核心的运行状态:由于正常世界无法直接访问任何安全世界信息,因此我们建议利用共享CPU内核的可用性作为辅助信息来推断每个内核的运行状态。主要思想是,在安全世界拥有一个内核来执行自省之后,普通世界无法使用该内核来运行任何进程。用户级别的探针进程可以用来执行此探测任务。为了追踪正常世界何时失去对CPU内核的控制权,探针进程会为每个内核分配一个子线程,该子线程会不断报告相应内核的可用性。由于富操作系统内核可能会将一个线程任务j迁移到其他内核,尤其是在一个内核暂停时,因此我们修复了每个线程的CPU亲和力。因此,当一个内核进入安全环境时,连接的线程将暂停,并且无法由OS调度程序迁移到其他内核。
    图2显示了用户级探针的多线程设计。对于具有n个内核的设备,我们从n个线程开始一个进程,并且每个线程的CPU亲和力都固定为其相应的内核。每个线程都有两个组件:时间报告器和时间比较器。在内核i上,时间报告器从所有CPU内核之间的共享计时器中获取最新的time_i,然后将时间报告到所有线程均可读取的缓冲区中。之后,时间比较器会将核心i的time_i与所有其他核心的最新报告时间进行比较。由于每个线程独立地报告其最新时间,因此即使我们可以同时在所有内核上启动时间报告器,读取这些报告的时间缓冲区并比较它们的值时也会存在时间差。同时,由于内核调度程序设法为所有线程提供“公平性”,因此即使我们无法以完全同步的方式控制所有线程,每个线程也可以在阈值内执行,并且任何两个线程之间的时间差都有上限。我们将此上限定义为Tns_threshold。
    图二
    如果线程i发现任何核心x的最新time_x早于其报告时间,并且延迟大于阈值,即time_i>(time_x + Tns_threshold),则该线程报告core_x切换到安全世界。为了保持隐身状态,我们可以让线程休眠一段时间。我们假设可以使用平均频率fns_sched来调度线程,因此在时间比较器的任何两个连续回合之间,存在延迟Tns_sched = 1 / fns_sched。最后,探针需要时间Tns_delay = Tns_sched+ Tns_threshold来检测一个内核进入安全世界。
    我们在ARM Juno开发板(请参见第IV-A节)上实现并评估了该用户级别的探测器。每8秒运行一轮探测时,我们发现Tns延迟小于5.97×10^−3 s,而一个内核执行内核完整性检查的平均时间为8.04×10^−2 s。我们可以看到探测器能够检测到典型的基于TrustZone的内核完整性检查的运行。由于探测程序的每个步骤都不需要修改OS内核权限,因此检查是否曾经进入安全世界是隐秘且有用的。

  • 多核处理器上的竞争条件:一种针对逃避攻击的最新防御机制是随机触发安全检查。然而,在多核系统上,我们注意到只要正常世界没有在所有内核上都处于冻结状态,正常世界可以消除攻击痕迹和安全世界可以检测出攻击痕迹两者之间就存在竞争状态。我们假设自省机制会检查N个字节的关键内存,并且在正常世界需要清除M个字节的攻击痕迹。
    我们将规避攻击与异步自省之间的竞争条件形式化。我们假设安全世界在t_start时刻请求启动异步自省机制。要将一个内核切换到用于进行自省的安全世界,ARM处理器需要保存该内核的正常世界上下文,然后再切换到安全世界。我们将此上下文切换周期定义为Ts_switch.因此,安全世界开始完整性检查的时刻可以从t_start + Ts_switch开始。我们定义安全世界检查一个字节的时间为Ts_1byte。由于安全世界假设所有N个字节可能都是易受攻击的,而它并不确切知道攻击者会修改哪些字节,因此它可以在接触0≤S≤NM的任何恶意字节之前先检查S个字节。因此,内省机制无法在t_start + Ts_switch + S ∗ Ts_1byte时刻之前找到任何恶意字节。
    从攻击者的角度来看,由于她想以最长的持续时间来攻击系统(例如,收集输入的密码),因此,如果她认为存在内省,则只会停止攻击并隐藏攻击痕迹。如果它可以预测t_start,则可以很容易地在自省开始之前隐藏起来。当t_start未知或不可预测时,攻击者需要通过探测安全世界的状态来检测它。我们定义了探测延迟Tns_delay,攻击者可以注意到一个核心进入安全世界。假设攻击者恢复一个恶意字节的时间为Tns_1byte。攻击者的总恢复时间为Tns_recover= M * Tns_1byte。然后,在t_start + Tns_delay+ Tns_recover 的时刻之后,安全世界无法检测到恶意修改。两个世界之间的时序关系如图3所示。最后,对于能够逃脱自省的攻击者,应该满足条件1:
    (Ts_switch + S ∗ Ts_1byte) > (Tns_delay + Tns_recover)
    我们可以看到逃避攻击赢得比赛条件的关键因素是最小化探测延迟Tns_delay。尽管用户级别的探查器显示了偷偷地了解安全世界状态的能力,但不能保证其探查稳定性和准确性。特别的,当一个内核被几个线程调度而调度线程的优先级与探测线程相同或更高时,探测器的Tns_sched就会增加。为了提高探测精度,我们应该使检测延迟最小。在下一部分中,我们将介绍一种基于更精确的内核级探测器的新型回避攻击,称为TZ-Evader。

C : TZ-Evader

TZ-Evader包括两个组件:内核级攻击模块,用于在OS上进行持久攻击并相应地删除攻击痕迹;细粒度的内核级探针程序模块,可以准确可靠地监视每个内核的运行状态。内核级探针程序还包含两个组件Time Reporter(时间报告器)和Time Comparer(时间比较器),与用户级探针程序相同。在富操作系统中获得root特权后,探针模块将会加载。如果探测器可以接收所有CPU内核报告的时间,则TZ-Evader认为安全世界没有进行自省机制,因此可以使攻击在富OS上保持活动状态。一旦探测器模块报告一个内核可能切换到了安全世界,TZ-Evader就开始删除其攻击痕迹。我们为内核级探针提供了两个实现选项。第一个选项KProber-I基于拦截计时器中断以将探针插入到富操作系统中,第二个选项KProber-II通过操纵Linux内核的实时调度程序以将探针添加为高优先级进程来调度。

  • KProber-I : 在ARM处理器上,每个内核都有自己的计时器以生成时间中断。时间报告器和时间比较器被注入到普通的世界定时器中断处理程序中,以确保探测器以与定时器中断相同的频率执行。劫持之后,对于进入内核i的任何定时器中断,中断处理程序都会将time_i更新到其相应的缓冲区i中,并将其与其他n-1个内核的时间报告进行比较,然后再恢复正常的定时器中断处理程序。Linux内核通常配置为CONFIG_NO_HZ_IDLE模式,这意味着当内核不处于IDLE状态时,每个内核计时器会以HZ的频率周期性地调度定时计时器中断。对于大多数版本的Linux内核,100≤HZ≤1000。为了避免任何内核进入空闲模式,KProber-I会在每个内核上持续运行用户级别的多线程程序。无论该CPU内核上正在运行多少任务,KProber-I都可以保证在任何内核上以不低于HZ的频率工作。尽管从富操作系统角度来看,此实现选项可以实现最高的时间精度,但它需要修改计时器中断处理程序,这可能会引入额外的攻击痕迹,以使防御者能够检测到。在第III-C2节中,我们介绍了另一种实现,而没有修改任何内核静态区域。此外,由于存在许多可能未知的机制来操纵处理程序,因此防御者必须扫描整个内核以检测所有潜在的准备痕迹,这正如我们在IV-C节中评估的那样,为KProber-I提供了更大的恢复机会。

  • KProber-II : 该探测器利用Linux的实时(RT)调度程序来确保可靠地执行Time Reporter(时间报告器)和Time Comparer(时间比较器)。根据Linux内核设计,RT(实时)调度程序比默认Linux CFS调度程序具有更高的调度优先级,默认Linux CFS调度程序负责调度大多数Linux应用程序线程。同时,实时调度程序可用于调度优先级更高的任务。因此,通过将探针设置为RT(实时)调度程序的最高优先级,KProber-II可以保护Time Reporter(时间报告器)和Time Comparer(时间比较器)的可靠执行不受CFS调度线程或低优先级RT调度线程的影响。从理论上讲,基于计时器中断的探测器比基于RT(实时)调度程序的探测器更稳定,因为RT调度程序的频率取决于计时器中断。但是,将探针插入中断处理程序比使用实时调度程序简单地增加攻击线程的优先级需要更多的工程工作。我们将在第IV-A1节中介绍更多实施细节。

TZ-EVADER的实施和评估

A : TZ-Evader实施

我们在ARM Juno r1开发板上开发了TZ-Evader的原型,该板具有ARM big.LITTLE技术,该技术由4核CortexA53“ LITTLE”处理器(可实现最大功率效率)和2核Cortex组成-A57“big”处理器可实现最高的计算性能。EL3中运行的安全监视器由ARM可信固件(ARM-TF)提供,而S-EL1中运行的安全世界操作系统是根据ARM-TF的测试安全有效载荷(TSP)进行修改的。我们在TSP中修改安全计时器中断处理程序,以在正常情况下执行完整性检查。在正常世界中,EL1中运行内核版本为lsk-4.4-armlt的OpenEmbedded LAMP OS,它是使用ARM社区的Juno Wiki中的脚本下载的。

  • 内核级Prober实施方法 :我们部署两种类型的KProber(Kernel Prober)来探测特定内核或随机选择的内核。为了探测特定内核的运行状态,我们在目标内核上修复了Time Reporter(时间报告器)的一个线程,在另一个内核上修复了包含Time Reporter(时间报告器)和Time Comparer(时间比较器)的另一个线程。为了探测随机的CPU内核,我们为每个内核分配了一个包含Time Reporter(时间报告器)和Time Comparer(时间比较器)的线程。
    为了实现基于定时器中断的KProber-I,一个关键的技术问题是劫持时间中断处理程序。在ARMv8-A架构中,原始计时器中断地址的地址保存在IRQ异常向量中,该向量可能位于AArch64异常向量表中。表格的起始地址保存在基于向量的地址寄存器V BAR_ELi(1≤i≤3)中。找到计时器中断后,我们修改其对应的表条目以将其重定向到我们的劫持代码。
    对于基于KProber-II的实时调度程序,我们使用函数pthread setschedparam()通过实时调度程序调度目标线程。对于所有KProber-II的线程,我们将rt-scheduler SCHED FIFO与优先级参数sched get priority max(SCHED FIFO)一起使用。在研究了线程休眠与CPU利用率之间的关系之后,我们将休眠时间Tsleep设置为2×10^−4 s,并假设Tns_sched = Tsleep。在下面的实验中,我们使用KProber-I实现Time Reporter,并使用KProber-II实现Time Comparer,以证明这两种技术都可以实现可靠的探测结果。

  • 示例内核级攻击:为了便于(加快)评估TZ-Evader,我们实施了可以劫持GETTID系统调用的内核级攻击。成功的系统劫持需要修改系统调用表的条目,并且此攻击会修改系统调用表的一个8字节地址。由于系统调用表被定义为文本内核数据,因此,如果自省扫描并检测到这8个字节中的任何一个被修改,则基于TrustZone的自省可以检测到GETTID系统调用被劫持。注意,还有许多其他内核级别的攻击媒介,我们仅以GETTID劫持攻击为例来研究逃避攻击。

B : 攻击评估

  • 自省时间延迟:我们首先评估自省的时间延迟。正如我们在公式1中提到的,基于TrustZone的异步自省遭受两个主要的延迟:Ts_switch和s * Ts_1byte。为了评估Ts_switch,我们在一个A53内核和一个A57内核上执行了50次Test Secure Payload Dispatcher的上下文切换功能。结果表明,在t_start时刻启动安全计时器中断时,调度程序(dispatcher)暂停正常世界并跳转到A53内核或A57内核上的相关计时器中断的时间相似,范围为2.38×10-6 s至3.60 s×10−6秒.
    然后,我们针对两种不同的自省技术评估Ts_1byte。传统的硬件辅助异步内核自检对内核进行快照,然后分析内存副本。由于攻击者无法访问此副本,因此拍摄快照后的分析步骤不容易受到TOCTTOU攻击。同时,由于安全世界和常规世界共享系统硬件,因此基于TrustZone的自省可以直接从安全世界中读取常规世界OS的内核。读取内核数据后,它可以对数据进行哈希处理并将哈希值与预先计算的授权值进行比较。在我们的实验中,我们测量了安全世界拍摄快照和散列内核数据(对内核数据进行哈希处理)的时间。我们使用djb2算法作为哈希函数。每次测量重复50次。表一显示,直接对内核内存进行哈希处理比捕获和哈希快照更为有效。此外,它比快照方法消耗更少的内存。因此,当异步自检的目标是静态内核区域时,直接对内存进行哈希处理比获取快照要好。我们还发现,由于A57内核比A53内核更强大,因此在A57内核上进行自省的时间比在A53内核上花费的时间少。

  • 攻击时间延迟:我们从两个方面评估正常世界攻击时间延迟,其中内核级攻击模块引入Tns_recover,探测器模块引入Tns_threshold(阈值)。我们在一个A53内核和一个A57内核上重复测量恢复时间Tns_recover50次。对于A53内核,平均恢复时间为5.80×10−3 s。对于A57内核,平均恢复时间为4.96×10−3s。然后,我们介绍KProber同时探测所有内核时探测器的时间延迟Tns_threshold。由于探针程序的执行涉及所有可用的内核,因此无论内核类型如何,我们都会提供探针程序的时间延迟Tns_threshold。为了观察阈值的变化,我们以不同的探测周期执行KProber。对于每个探测周期,我们选择时间比较器计算出的最大差异作为阈值,然后重复测量50次。我们在表II中列出了每个时间段内50轮的平均阈值,最大阈值和最小阈值。根据实验结果,我们发现平均阈值随着探测时间的延长而变大,最大阈值约为1.8×10-3s。为了进一步了解阈值的变化,我们调查了每个线程的报告时间,并确定在极少数情况下,内核i上的时间比较器可能会以异常大的延迟获得内核x的时间x,最大可以达到1.3×10^−3秒。这种跨核读取延迟会导致较大的阈值。同时,更长的探测时间会增加这些罕见情况的发生,因此平均阈值也会增加。
    为了展示KProber的稳定性,我们在图4中显示了阈值随不同探测周期的变化。我们可以看到,即使KProber的平均探测阈值随探测周期的增加而增加,但阈值的上端仅略微上升,并且在300 s的探测周期内仅引入了极小的较大异常值,这些异常值超过1×10^−3s。最后,我们还观察到,与随机使用所有内核相比,具有固定CPU亲和力的自省设置更容易被探测。正如我们在第IV-A1节中提到的,我们还评估了使用KProber来确定单个内核可用性的情况。我们以与上述相同的设置进行实验。根据我们的实验结果,在我们评估的所有五个探测周期内,探测单个内核的平均阈值仅等于探测所有内核的阈值的1/4。这意味着KProber需要探测的核心越多,它承受的探测阈值就越大。

C : 比赛条件分析

根据实验结果,我们对正常世界和安全世界之间的比赛状况有以下观察:

  • A53核心和A57核心的切换延迟Ts_switch相似。
  • 安全世界可以使用功能更强大的CPU内核(即A57内核)进行自省,以实现更短的Ts_1byte。
  • 如果正常世界下的CPU亲和力是可以预测的,则更容易探究安全世界。
  • TZ-Evader的时间瓶颈是恢复其攻击痕迹Tns_recover的时间段。

根据等式1,我们知道攻击可以在安全世界检查S个内存字节后完成其清理任务,其中:

S > (Tns_sched + Tns_threshold + Tns_recover − Ts_switch) / Ts_1byte
(2)

现在,我们考虑TZ-Evader的最坏情况:自省在一个A57内核启动,而TZ-Evader使用一个A53内核删除其攻击痕迹。在第IV-B1节中,我们的Ts_switchs≤3.60×10^-6s。同样,安全世界可以最大速度Ts_1byte = 6.67×10^-9s检查内核数据。随着最低效率Tns_recover= 6.13×10^−3 s,Tns_sched= 2×10^−4 s,攻击者恢复了其攻击轨迹。在IV-B2节中,对于TZ-Evader的最坏情况,Tns_threshold≤1.80×10^−3s。通过将实验数据应用到上面的公式2中,我们得到S≤1218351字节。假设攻击字节随机出现在内核中,并且自省会检查整个OS内核,其大小为11916240字节,几乎有1 − 11916240/1218351≈90%的内核空间不受现有基于TrustZone的异步自省的保护。因此,只要内核攻击模块和探测器模块都没有位于10%的扫描区域中,系统就会遭受TZ-Evader攻击。

SATIN:安全异步内省

我们提出了一种安全可靠的基于TrustZone的异步自省机制,称为SATIN,该机制实际上可以检查富操作系统,并有效地抵抗TZ-Evader攻击。我们首先讨论开发安全异步自省的两个主要挑战,然后介绍提出的机制的详细设计。图5展示了SATIN的体系结构,该体系结构在安全的世界中实现。它由两个主要组件组成,其中完整性检查模块使用分治法在富操作系统上执行完整性检查,以控制每个回合的检查时间,而自我激活模块则负责通过安全计时器的帮助,并确保正常世界无法预测或快速探测到入口的方式唤醒安全世界。

A : 异步自省挑战

我们确定了针对TZ-Evader开发安全的异步自省机制的两个主要挑战。

  • 挑战一:性能与检测精度:在单核处理器上,基于TrustZone的自省会带来不可接受的开销,因为自省必须在安全检查过程中挂起富操作系统。暂停问题导致糟糕的用户体验。例如,当CPU进入安全世界时,在正常世界中播放的音乐歌曲变得不连贯。同样,在多核处理器上,即使是一小段时间,我们也不能频繁冻结所有内核。例如,Azab等提出了一种自省机制,该机制要求每8秒或16秒冻结服务器上的所有CPU内核。尽管通过冻结所有内核可以获得更好的检测精度,但这成为异步自省机制被广泛采用和部署的最大障碍之一。同时,即使是多核平台也可以同时执行自省和其他任务,安全世界的执行仍然拥有一些共享资源,例如CPU内核。尚未很好地研究通过与富操作系统并行运行自省会带来多少开销。

  • 挑战二:躲避攻击:设计异步自省机制时,防御回避攻击是一项挑战。如果攻击者可以通过预测或探测异步自省的执行而逃脱自省机制,则自省的结果将不可信任。在单核处理器上,随机检查是克服规避攻击的有效方案。但是,在多核ARM处理器上,TZ-Evader甚至可以摆脱任何随机内核上的随机检查。开发安全的异步自省机制以克服新的规避攻击至关重要。

B : 完整性检查模块

为了提高检测率,我们建议通过将整个OS内核划分为较小的区域,并轮流检查每一轮中的一个区域,以减少每一轮的内省时间。因此,它可以保证在恶意正常世界对其进行探测之前,已经完成了一次安全检查,但没有机会删除任何攻击痕迹。完整性检查模块在启动阶段准备每个小区域的良性状态的哈希值。然后,对于每次唤醒,它将扫描一个小区域,并将哈希值与预先计算的良性区域进行比较。如果完整性检查模块发现任何异常的小区域,则会向服务器端或设备用户发出警报。为确保恶意软件在完成对一个小区域的检查之前无法删除其痕迹,每个小区域的大小应小于(Tns_delay+ Tnsr_ecover-Ts_switch)/ Ts_1byte 字节。我们开发了一种伪随机方法来选择下一个用于自省的小区域。假设这个集合setarea = i从0到m-1的area_i包含OS内核的所有区域,并且每个区域i都满足上述大小条件。当安全世界开始一轮内省时,模块会从setarea中随机选择一个 area_x,然后应用setarea = setarea − area_x。如果setarea == NULL,则SATIN重置setarea = {area 0,…,area(m − 1)}。

同样,完整性检查模块需要确保其执行不会被其他非安全方中断。根据最新的ARM中断路由模型,正常世界中断信号可能会中断安全世界的执行。为了防止正常世界使用中断来干涉内省过程,SATIN需要在每一轮内省期间阻塞所有中断。我们建议将完整性检查模块部署到安全计时器中断处理程序中,然后通过配置SCR EL3.IRQ = 0将EL3设置为不捕获正常世界中断。使用此设置,即使正常世界中断信号可以到达安全世界,其优先级也比完整性检查模块低。

C : 自我激活模块

自我激活模块旨在确保安全世界可以在没有正常世界帮助的情况下随时调用完整性检查模块。它依赖于普通世界无法访问的安全计时器。每个启用TrustZone的内核都有一个单独的安全计时器,该计时器只能以安全世界权限进行读写。在启动期间,自激活模块在每个内核上被调用一次,以将下一个唤醒时间写入安全定时器寄存器。

在可信启动进程之后,当计时器条件满足时,计时器将为安全世界引发一个中断,安全监视器将内核从正常世界切换到安全世界以处理此中断。通过配置安全计时器,我们可以在不涉及正常世界的情况下激活安全世界。因此,我们可以防止正常世界干扰内省的调用。当一个内核通过安全计时器中断进入安全世界时,SATIN首先在一个小区域上进行自省,然后为下一轮自省设置唤醒时间。自激活模块通过time_x确定下一个唤醒时间,该时间设置为基本周期时间tp(例如8s,16s等)加上随机偏差td(例如,一个从-tp到tp的随机时间)。通过在下一个唤醒时间应用随机偏差,两次连续内省之间的间隔为[0,2 * tp],这意味着内省可以随时开始扫描,并且攻击者必须继续探测所有内核。另外随机偏差可以有效地最大程度地减少了在异步内省对普通OS的调用上所识别的任何模式的暴露。我们设置tp = Tgoal / m,其中Tgoal是保证可以至少扫描一次所有目标区域的时间段。

D : 多核协作

为了提高检查的准确性,我们建议选择一个随机的内核来执行自省任务。此设计选择基于以下观察结果:如果仅一个内核用于异步自省,与随机选择所有内核进行内省相比,z恶意正常世界可以实现更好的探测精度,如第IV-B2节所述。

图6说明了SATIN在多核体系结构上的协作自省。当任何内核i被唤醒进行自省时,它会从共享的“内核区域集”setarea中随机占用一个内核区域,并检查该区域。后面,其他内核将不再重复检查此区域,因为(自从)内核i从集合中删除了它选择的区域。如果没有更多可用区域,则将用所有区域重新填充该集合。接下来,内核i从唤醒时间队列中获取下一个唤醒时间,并相应地配置其安全计时器,其中唤醒时间队列负责协调以随机顺序唤醒的所有内核。

协调所有内核以随机顺序唤醒也是一项艰巨的任务。ARMv8-A架构没有为一个内核提供直接读取或写入另一个内核的计时器的解决方案。在这种情况下,一个直观的设计是使用跨核中断来通知所有核依次服务于自省。ARMv8-A允许一个内核生成安全中断,以将另一个内核强制切换到安全世界,因此,在内核i完成一轮自省之后,它可以将另一个内核j切换到安全世界,然后内核j为该内核设置安全定时器用于下一轮内省。但是,内核j的切换也可以由正常世界探测,因此此方法可能会将唤醒序列泄漏给正常世界,这可能会抵消随机唤醒内核的好处。为了保护正常世界中的唤醒模式,SATIN不采用跨核中断机制,而是通过安全存储器(安全内存)协调所有核。SATIN将每个内核的唤醒时间存储在唤醒时间队列中,并要求每个唤醒内核检查队列以获取下一个唤醒时间。对于具有n个内核的设备,唤醒时间队列包含n个唤醒时隙。每个时间值由V-C中讨论的规则确定。所有CPU内核的初始唤醒顺序在可信启动初始化过程中设置完成。然后,当任何内核进入自激活模块时,它将根据随机分配选择下一次时间。一旦所有内核从队列中提取了其分配的时隙,自激活模块就会使用n个新生成的时间值和通过刷新唤醒时间队列并为每个内核重新分配时隙,我们可以将所有内核用于内核自省,同时防止正常世界知道下一轮内省的唤醒内核或唤醒时间。新生成的随机分配刷新队列。最后,所有内核都可以协调以确保每个内核在随机唤醒时间检查随机存储器(内存)区域。

SATIN 实现与评估

A : SATIN 实现

为了验证SATIN击败TZEvader的有效性,我们在ARM Juno r1开发板上开发了SATIN原型,其配置与第IV-A节所述相同。我们修改S-EL1中的测试安全有效载荷(Test Secure Payload)以实现SATIN的主要模块。

  • 自我激活模块:当在一个内核上调用自激活模块时,该模块通过更新寄存器CNTPS_CTL_EL1来停止安全计时器。然后,它从唤醒时间队列中获取分配的唤醒时间,并将该值写入比较器寄存器CNTPS_CVAL_EL1。之后,模块将重新启动该内核的安全计时器。对于处理器中的任何内核,当共享物理计时器计数器寄存器CNTPCT_EL0等于或大于每个内核寄存器CNTPS_CVAL_EL1时,内核会引发安全计时器中断。
  • 完整性检查模块:正如我们在IV-C节中计算的那样,对于检查模块的每个区域,其大小必须小于1218351字节。此外,我们实施了完整性检查模块,以确保正常世界操作系统的System.map的每个部分仅属于一个区域进行自省。因此,我们根据System.map将正常世界的内核分为19个区域。在这些区域中,最大的一个包含876616字节,最小的一个包含431360字节。在启动期间,SATIN将对这19个区域进行哈希处理,然后将这些哈希值保存到存储在安全世界中的授权哈希表中。

B : SATIN 评估

我们从两个方面评估SATIN的性能,即击败TZ-Evader的有效性和触发的额外系统开销。

  • 击败TZ-Evader:SATIN可以有效,安全地击败TZ-Evader攻击。首先,自检模块已部署在安全的环境中,因此我们可以保护自检模块不受正常环境中的恶意软件的侵害。我们假定可以信任硬件辅助的TrustZone技术来保护安全的世界。其次,由于正常世界无法准确预测或拦截自省操作的调用,因此它可以防止恶意软件在每次自省之前调用删除其痕迹。第三,它可以检测在自我检查期间使用竞争条件删除其痕迹的恶意软件。因为我们将整个较大的自省区域划分为较小的区域,所以即使在恶意软件检测到一个核心进入安全世界然后开始删除攻击痕迹之前,我们也可以完成一个小区域的自省。另外,它是用户友好的。内省不需要在正常情况下完全冻结富操作系统。在多核处理器上,由于并非所有内核都被迫同时进入安全环境,因此当一个内核在一个内核上进行自省时,富操作系统可以继续在其余内核上运行。
    在我们的自省机制中,每m轮自省可以保证一次扫描整个OS内核,两次之间的平均时间为tp。在时间段m ∗(tp)+ (i从0到m-1) sizearea_i ∗ Ts_1byte中,它可以成功地在检查区域内捕获恶意内存字节。在我们的实验中,整个时间约为152s。
    为了验证检测结果,我们在正常环境中执行TZ-Evader,同时在安全环境中同时运行SATIN。我们将KProber的探测阈值设置为1.8×10^−3s。TZ-Evader恶意修改了一个驻留在完整性检查模块area_14中的系统调用处理程序。SATIN进行了190轮自省,以检查整个内核10次。KProber可以忠实地报告所有190轮内省,没有任何假阴性或假阳性(消极、积极)。在这些回合中,SATIN十次检查area_14并一直正确地检测到被劫持的处理程序。两次连续检查area_14之间的平均时间为141秒。同时,TZ-Evader尝试在这10次检查期间发动攻击,但由于内存清理发生在自省之后,所有恢复工作都失败了。

  • SATIN 开销:
    当启用基于TrustZone的异步自检时,我们使用UnixBench来评估正常世界操作的性能开销。图7显示了当我们使用自我激活模块在设备的所有核心上唤醒安全世界时相比较于未启用自我激活模块的情况,标准化性能下降。由于我们的实验平台包含6个核心(即4个A53核心和2个A57核心),因此我们使用两组实验来衡量开销:每个基准测试程序执行一次(1个任务),并同时调用6个相同基准的副本(6个任务)。通常,在1任务和6任务情况下,激活自省会分别导致0.711%和0.848%的性能下降。这是合理的,因为当同时使用更多内核时,SATIN中断正常世界的机会(几率)越来越多。我们还注意到,两个任务 file copy 256B 和 context switching 的开销最大:3.556%和3.912%。原因是测试程序恰好在安全环境中停留在随机选择的内核上的次数比其他情况要多。我们认为,这种性能开销水平是可以接受的,特别是当正常环境在多核系统上甚至没有暂停超过一纳秒时。

C : SATIN 安全性分析

  • SATIN的安全性:SATIN的安全性基于其控制流不受攻击者影响的特征,这可以通过使用TrustZone来实现。同样,即使考虑到最近与TrustZone相关的边信道攻击,由于它们专注于攻击TrustZone的机密性而不是控制流,因此SATIN是安全的。

  • STAIN的能力: 即使SATIN使用TZ-Evader隐藏其踪迹,SATIN仍能够检测到长时间持续留下攻击痕迹的高级持续攻击。同样,SATIN可以利用其他边信道检测逃避攻击。最后,SATIN可以降低攻击效率,并最大化检测APT攻击的机会。

讨论

A : 同步自省保护下的TZ-Evader

为了准确地探查安全世界状态,TZ-Evader提供了两个实现选项,即(i)使用RT调度程序和(ii)修改IRQ异常向量的地址。这两个选项都需要获得正常环境中的root权限,而该权限可能已经受到某些同步自省解决方案的保护。但是,由于不完整的挂钩位置和实现错误,同步内省很难(即使不是不可能)确保恶意软件无法在富操作系统中获得root权限。

例如,即使正常的OS内核受到实际部署的同步自省机制KNOX-RKP的保护,也已经发现了真正的攻击来获得root特权。在获得root特权之后,攻击者可以自由地操纵RT调度程序,该调度程序尚未受到任何现有的同步自省机制的挂钩或保护。或者,利用root特权,攻击者可以通过发起以下无法通过同步自省进行阻止的数据攻击来修改IRQ异常向量的地址。文献[7]和[17]中的同步自省方法都将向量表设置为不可写,因此任何对异常向量的写入尝试都会触发页面错误,从而陷入同步自省。但是,在获得root特权之后,攻击者可以利用“在哪里写”漏洞将相关页表条目的访问权限(AP)位从不可写更改为可写。之后,攻击者可以自由修改向量表,而无需触发相应的同步自省。

B : TZ-Evader限制

在TZ-Evader中,探测阈值Tns_threshold可能在不同的ARM处理器上有所不同,并且攻击者必须在攻击目标ARM处理器之前评估该值。如果攻击者的设备具有与攻击目标相同的处理器配置,则攻击者可以禁用安全世界环境以快速、准确地获取Tns阈值。但是,如果攻击者无法在完全受控的设备上评估阈值,则需要直接从受害者那里了解Tns_threshold。攻击者需要在相对较长的时间(例如一小时)内运行多线程时间报告程序和时间比较器,以研究阈值如何变化。对于安全应用程序每次运行,攻击者都可以观察到所有内核之间的时间差。通过长期研究,攻击者可以确定目标设备的Tns_threshold,然后启动TZ-Evader。

C : 异步自省的必要性

同步自省保护是一种有效的防御机制。但是,由于高性能开销,不完整的挂钩位置和实现错误,它仍然可以绕开。异步内省具有很少的执行开销,除了同步内省外,还提供了一层以上的安全保护。例如,三星TIMA在虚拟机管理程序中部署了一种称为“实时内核保护(RKP)”的同步自省机制,以在正常情况下保护虚拟机,并在TrustZone中部署了一种名为“定期内核测量”(PKM)的异步自检机制,以保护该虚拟机管理程序。此外,通过在安全性检查上分配一个内核并在其他内核上继续正常世界操作系统的正常运行,可以在多核处理器上解决单核处理器上异步自省(即富操作系统挂起)的一个主要可用性限制。

D : SATIN 的可移植性

SATIN体系结构具有三个要求,即多核处理器,高权限操作模式和安全计时器。由于大多数现代处理器都支持多核体系结构,因此在大多数处理器上分配一个内核来执行异步自检时合理的。因此,除了ARM TrustZone外,还可以将SATIN移植到其他TEE体系结构上,这些体系结构可以提供安全的计时器和高权限来进行内省。

相关工作

A : 异步自省

异步自省机制已广泛用于保护OS内核完整性。OSck与目标内核一起执行验证程序,并定期扫描内存以识别任何策略违规SigGraph 提议使用基于图的签名来扫描内核数据结构实例并检测能够操纵数据结构的rootkit。专门的安全工具已经构建好来在可信虚拟机(VM)上运行,以检测目标VM上的任何安全违规。

张等首先提出了使用隔离设备作为完整性监视器的概念。然后,Copilot利用PCI附加卡来定期验证内核静态数据的哈希校验和。后来,有人提出了几种基于自省机制的系统管理模式(SMM),其中HyperCheck和SPECTER使用SMM来外包内核的快照到远程服务器,并在服务器端进行自省。HyperSentry通过带外通道定期触发主机的SMM,从而在本地执行内核测量。在基于SMM的安全机制中,多核平台仅在[8]中简要提及,主要是在基于SMM的测量任务中冻结所有内核。HyperCheck的作者提到它可以在多核处理器上进行扩展;但是,没有详细的设计。基于其他可以透明地检查内核的硬件组件,提出了几种自省机制。Ether提出了一个基于Intel-VT的内核分析器来分析虚拟机中的软件。LO-PHI通过使用额外的硬件传感器和执行器,透明地检查内核内存快照,而不会暴露任何基于软件的工件。

B : 同步自省

许多同步自省机制同样被提出出来,他们也可以在不同的体系结构上工作。在ARM处理器上,SPROBES和TZ-RKP是最近提出的两种基于TrustZone的同步自省机制。SPROBES 向安全敏感的内核处理程序中注入特殊代码,以便它可以在安全世界中动态检查这些处理程序,并为普通世界提供实时保护。TZ-RKP实现了类似的安全性目标,但重点在于监视数据完整性和优化富操作系统的性能。除了利用ARM处理器的现有硬件功能之外,还开发了定制硬件来监听内存总线并监视对内核区域的安全性写入。

C : 硬件辅助TEE

如今,已经提出了越来越多的机制来在各种硬件体系结构上提供硬件辅助的可信执行环境(TEE)。基于ARM TrustZone技术,提出了几项研究,以研究和增强TrustZone安全世界的安全性。同时,TrustZone已被用于增强针对恶意富操作体统的在正常世界中运行的应用程序的安全性。Santos等建议在安全世界中运行普通世界.NET应用程序的安全敏感部分。TrustICE提供了为任何正常世界的应用程序分配隔离环境的解决方案,并且Cho等扩展了这个想法,以隔离正常世界的应用程序和系统管理程序。除了ARM硬件体系结构,SICE还为x86多核平台引入了基于SMM的隔离环境。SICE可以为用户提供远程证明,以验证内核在其隔离环境中的完整性。基于SMM,将我们的安全异步自检移植到X86多核处理器上似乎是合理的。关于最新的英特尔硬件功能SGX的一些著作也能够测量SGX飞地中运行的内核的完整性并提供远程证明。但是,由于SGX飞地由主机OS调度,因此SGX技术无法用于对主机OS执行异步自省。

结论

在本文中,我们为ARM多核平台提出了一种可信且实用的基于TrustZone的异步自省机制。我们首先表明,在多核系统上,即使像以前的异步自省解决方案一样,安全世界使用随机核在随机时间点检查富操作系统内核,正常环境中的恶意软件仍然可以通过以下方式进行安全检查:利用在一个内核上运行的检测器与同时在其他内核上运行的恶意规避者之间的竞争条件。我们将这种新型的躲避攻击识别为TZ-Evader,并对其进行了系统的研究。我们开发了一种概念验证的TZ-Evader攻击,该攻击使用精确的内核级探针来击败现有的异步自省。最后,我们在多核ARM处理器上开发了一种安全的基于TrustZone的异步自省机制,称为SATIN,以克服TZ-Evader攻击。我们在ARM Juno r1开发板上实现了SATIN的原型,实验结果表明SATIN可以有效地防止对多核系统的逃避攻击,而开销很小。

你可能感兴趣的:(论文阅读笔记)