LAZARUS:抗侧信道的内核随机化

LAZARUS:实用的抗侧信道内核空间随机化

摘要

内核漏洞利用通常用于权限提升,以完全控制一个系统,例如通过代码复用攻击实现。因此,现代内核采用了内核地址空间布局随机化(KASLR)进行加固,该技术在启动时对内核代码段的起始地址进行随机化。因此,攻击者必须首先绕过这种随机化,然后才能在第二步中使用调整后的有效载荷实施攻击。最近,研究人员证明,攻击者可以利用非特权指令通过处理器分页子系统中的侧信道收集时间信息。这可能导致随机化密钥被泄露,即使软件本身不存在任何信息泄露漏洞。

本文提出 LAZARUS,这是一种增强内核地址空间布局随机化( KASLR)以抵御基于分页的侧信道攻击的新技术。特别是,我们的方案允许对实现随机化的虚拟内存映射进行细粒度保护。我们通过在近期的Linux内核中集成LAZARUS来验证该方法的有效性,成功缓解了此前所有已提出的针对 KASLR的侧信道攻击。我们广泛的评估表明,LAZARUS在标准基准测试中仅引入0.943%的开销,因此具有很高的实用性。

关键词 : KASLR · Code-reuse attacks · Randomization · Side channels

1 引言

三十多年来,内存破坏漏洞一直对计算机安全性构成挑战。这类漏洞使攻击者能够以开发者未预期的方式覆盖内存,从而导致恶意控制流或数据流。近年来,由于用户模式应用程序防护技术的进步,内核漏洞在实际攻击中变得更加普遍。

例如,浏览器和其他流行目标通过在沙盒环境中运行来实现隔离。因此,攻击者除了初始漏洞利用外,还需要执行一次权限提升攻击才能完全控制整个系统 [4,17–19]。操作系统内核是攻击者的自然目标,因为内核由庞大而复杂的代码库组成,并向低权限进程暴露了丰富的功能。Molinyawe 等人[20]总结了 Pwn2Own漏洞利用竞赛中使用的技术,并得出结论:大多数权限提升攻击都需要内核漏洞利用。

过去,为了降低内存破坏漏洞的风险,内核采用了不同的缓解技术进行加固。例如,强制地址空间只能是可写或可执行(W⊕X),但不能同时兼具两者,从而防止攻击者注入新代码。此外,启用新的 CPU 特性,如监督模式访问保护(SMAP)和监督模式执行保护(SMEP),可以防止某些类型的用户模式辅助攻击。为了缓解代码复用攻击,现代内核进一步采用了内核地址空间布局随机化(KASLR)[2]。KASLR 在启动时对内核代码段的基地址进行随机化,迫使攻击者为其针对的每个内核定制利用程序。具体而言,攻击者在发起代码复用攻击之前,必须首先泄露随机化密钥。

通常,绕过随机化有两种方法:(1)暴力破解攻击,以及(2)信息泄露攻击。尽管内核地址空间布局随机化(KASLR)旨在使暴力破解攻击变得不可行,但攻击者仍可利用信息泄露攻击,例如泄露随机化密钥。攻击者可以通过利用内存破坏漏洞或通过侧信道实现这一目的。最近的研究表明,侧信道攻击更为强大,因为它们不需要任何内核漏洞[6,8,10,13,23]。这些攻击利用底层微架构的特性来推断KASLR的随机化密钥。特别是,现代处理器在用户模式和内核模式之间共享缓存等资源,从而导致特权和非特权执行之间泄露时间信息。

这类攻击的基本思路是探测不同内核地址并测量探测的执行时间。由于有效和无效内核地址的时间特征不同,攻击者可以通过将提取的信号与参考信号进行比较来计算出随机化密钥。

大多数针对内核地址空间布局随机化分页[8,10,13,23]的侧信道攻击基于这一点。在这里,攻击者利用了对未映射的内核地址的中止内存访问与对已映射的内核地址的中止内存访问之间的时间差异。正如我们在相关工作第7节中详述的那样,现有研究的重点在于攻击,仅包含对可能的防御措施的理论讨论。

例如,Gruss 等人 [8]简要讨论了一种类似于我们所实现的防御的想法,建议在执行用户模式时完全取消内核地址空间的映射,就像 ARM 上的 iOS 所做的那样 [16]。然而,正如作者所指出的,[8]他们并未实现或评估其方法的安全性,而只是对该技术进行了模拟以提供

对于系统调用密集型应用程序,预期运行时开销的粗略估计约为5%。

目标与贡献

本文的目标是防止内核空间随机化方法通过处理器的分页子系统泄漏侧信道信息。为此,我们提出了LAZARUS,作为一种针对基于分页的侧信道攻击在内核地址空间布局随机化(KASLR)上的新型实用防御方案。

我们的纯软件防御基于以下观察:所有已提出的攻击都具有一个共同的泄漏源:在执行继续处于用户模式时,有关随机化的内核地址的信息被存储在处理器的分页缓存中。更具体地说,处理器会在缓存中保留最近使用过的地址的分页表项,而不管其关联的特权级别如何。这导致了时序侧信道,因为对缓存条目的访问比缓存未命中更快。我们的防御机制根据分页表项的特权级别在缓存中对其进行隔离,并提供一种机制使内核能够通过软件高效实现这一点。

LAZARUS 仅对可能泄露随机化密钥的地址空间部分进行隔离,而非随机化内存的表项则保持共享。我们的基准测试表明,这显著降低了性能开销。我们提供了该侧信道防御的原型实现,并在流行的 Debian Linux 和 Arch Linux 发行版下,对近期内核中该原型的安全性和性能进行了广泛评估。

总结来说,我们的贡献如下:
– 新型侧信道防御。我们提出了LAZARUS的设计,这是一种纯软件的防护方案,旨在抵御基于分页机制的针对内核地址空间布局随机化的侧信道攻击。
– 原型实现。我们为近期的Linux内核版本4.8提供了一个完全可运行且实用的防御原型实现。
– 全面评估。我们对原型进行了广泛的评估,涵盖所有先前提出的侧信道攻击,并证明内核地址空间布局随机化的秘密信息不再会被泄露。我们重新实现了所有此前针对Linux内核中内核地址空间布局随机化所提出的攻击方法。此外,我们还进行了详尽的性能评估,结果表明该方案具有很高的实用性,在常见基准测试中的平均开销仅为0.943%。

2 背景

在本节中,我们首先解释理解本文其余部分所需的现代处理器架构的细节。然后,我们解释相关工作提出的针对内核地址空间布局随机化的不同攻击方式。

2.1 虚拟内存

虚拟内存是分离特权系统内存与非特权用户内存以及隔离进程间相互访问的关键构建模块。虚拟

当虚拟内存处于活动状态时,处理器的所有内存访问均由内存管理单元进行中介1:它从内存中加载相应的页表项2到转译后备缓冲区(TLB)中,检查所需特权级别3,并且仅当处理器的当前特权级与所需特权级别匹配时,才将虚拟内存地址转换为对应的物理内存地址4。

内存通过在处理器的地址空间与物理内存之间强制引入间接层来实现,即处理器发起的每次内存访问都由一个称为内存管理单元(MMU)的硬件组件进行中介。MMU 将虚拟地址转换为物理地址,并根据所请求地址定义的权限实施访问控制。转换信息以及访问权限存储在一个由内核维护的层次化数据结构中,称为页表。内核通过为每个进程维护独立的页表(从而具有不同的权限)来实现进程之间的隔离。相比之下,内核并未使用单独的页表进行隔离,而是通过在翻译内核内存的页表项中设置监督位来实现。事实上,每个进程的页表都包含映射内核的条目(通常位于虚拟地址空间的顶部区域)。这提高了内核与用户应用程序之间上下文切换的性能,因为更换活动页表会迫使 MMU 从其内部缓存(称为转译后备缓冲区(TLB))中清除条目。TLB 缓存最近或最常使用的页表项,这是一种合理的策略,因为软件通常表现出(空间或时间)局部性。

因此,所有后续通过缓存的页表项进行翻译的虚拟内存访问都将得到更快的处理。

图1展示了虚拟内存的主要组件及其相互作用。接下来,我们将详细描述内存管理单元和转译后备缓冲区(TLB),并解释它们在基于分页的侧信道攻击中的作用。

中央处理器(CPU)包含一个或多个执行单元(核心),用于对单个机器指令进行解码、调度并最终执行

指令,也称为操作。如果一个操作需要内存访问,例如加载和存储操作,并且处理器的虚拟内存子系统已启用,则该访问由内存管理单元(MMU)进行中介(步骤1)。如果所请求的虚拟地址对应的页表项未缓存在TLB中,内存管理单元会通过遍历位于物理内存中的页表(通常称为页表遍历)将该页表项加载到TLB中(步骤2)。然后,内存管理单元将相应的页表项加载到TLB中(步骤3)。接着,它使用TLB中的条目查找与虚拟地址对应的物理地址以及所需的特权级别(步骤4)。

2.2 基于分页的侧信道攻击对内核地址空间布局随机化的影响

所有现代操作系统都通过内核代码随机化(KASLR)来实现内核空间随机化 [2,11,14]。然而,研究表明内核空间随机化容易受到各种侧信道攻击。这些攻击利用了底层硬件的微架构实现细节。更具体地说,现代处理器在特权与非特权执行模式之间通过缓存共享虚拟内存资源,这已被证明可被用户空间对手所利用。

接下来我们简要描述最近基于分页的侧信道攻击,其目的是泄露KASLR的随机化密钥。所有这些攻击都利用了一个事实:转译后备缓冲区(TLB)在用户应用程序和内核之间是共享的(参见图1)。因此,在从内核切换到用户模式应用程序执行后,TLB中将包含内核的页表项。此后,攻击者使用特殊指令(取决于具体的侧信道攻击实现)来访问内核地址。由于攻击者以用户权限执行攻击,该访问将被中止。然而,访问尝试与中止之间的时间差取决于猜测的地址是否缓存在TLB中。此外,攻击者还可以测量存在的映射(需要页表遍历)与不存在的映射(立即中止)之间的时序差异。攻击者可以利用由此产生的时序差异作为侧信道来泄露随机化密钥,这一点最近已有展示 [8,10,13,23]。

页错误处理程序 (PFH)

洪德等人 [10]发表了首个利用侧信道攻击击败内核地址空间布局随机化的研究。他们通过用户进程访问内核空间中的地址,在内核中触发页错误。尽管页错误处理程序正确地拒绝了这种非特权访问,但在处理内存请求期间会查询转译后备缓冲区(TLB)。他们表明,未映射页面与已映射页面在异常处理时的时间差异可被利用,以泄露随机偏移。

预取指令

此外,即使是单个指令也可能泄露时间信息,并可能被利用 [8]。更具体地说,近期英特尔处理器上预取指令的执行表现出时间差异,

我们侧信道保护的核心思想:一个非特权用户进程( 1)可以通过在内存管理单元分页缓存中的共享缓存访问,利用时序侧信道来探测内核地址( 2)。我们的防御机制通过强制实施( 3)针对随机化地址的不同特权级别之间的隔离( 4),从而缓解这一问题。

这直接依赖于转译后备缓冲区(TLB)的状态。与其他侧信道攻击类似,攻击者利用此方法访问特权地址。由于此访问源自非特权指令,因此会失败,并且根据文档说明,处理器不会引发异常。因此,对于已缓存的内核地址,其执行时间会有所不同。这就产生了另一个泄露随机化密钥的侧信道。

英特尔TSX

英特尔引入的事务内存扩展将一系列内存访问封装起来,以提供增强的安全保证,例如回滚。尽管这在实现无需基于锁的同步的并发软件方面具有潜在吸引力,但事务内的错误访问不会报告给操作系统。更具体地说,如果内存管理单元检测到访问违规,则该异常会被屏蔽,且事务被静默回滚。然而,攻击者可以测量两个失败事务之间的时序差异,以识别缓存在TLB中的特权地址。这使得攻击者能够显著改进原始的页面错误计时侧信道攻击[13,23]。

原因是操作系统的页错误处理程序从未被调用,从而显著减少了时序信号中的噪声。

3 LAZARUS

在本节中,我们将概述LAZARUS的设计思路与架构,详细阐述其面临的主要挑战,并深入说明我们如何应对这些挑战。

3.1 攻击者模型和假设

我们从相关攻击性研究 [6,8,10,13,23] 中推导出我们的攻击者模型。

– 可写的 ⊕可执行内存。内核强制实施可写 ⊕可执行内存(W⊕X)机制,以防止内核空间中的代码注入攻击。此外,内核利用现代 CPU 特性(如 S MAP 和 SMEP)[12]来阻止用户模式辅助的代码注入和代码重用攻击。
– 内核地址空间布局随机化(KASLR)。内核的基地址在启动时[2,14]被随机化。
– 不存在基于软件的信息泄露漏洞。内核不包含任何可用于泄露随机化密钥的漏洞。
– 恶意内核扩展。攻击者无法加载恶意内核扩展以获得对内核的控制权,即仅允许加载受信任(或已签名)的扩展。
– 内存破坏漏洞。这是许多现实世界中内核漏洞利用的标准假设。内核或某个内核扩展包含一个内存破坏漏洞。

攻击者完全控制一个用户模式进程,并可通过该进程利用此漏洞。该漏洞

图2。 我们侧信道保护的核心思想:一个非特权用户进程( 1)可以通过在内存管理单元分页缓存中的共享缓存访问,利用时序侧信道来探测内核地址( 2)。我们的防御机制通过强制实施( 3)针对随机化地址的不同特权级别之间的隔离( 4),从而缓解这一问题。

使攻击者能够覆盖内核的代码指针,从而劫持内核的控制流。然而,攻击者无法利用此漏洞泄露任何地址。

尽管现代内核存在基于软件的信息泄露漏洞,但基于侧信道的信息泄露攻击构成了更严重的威胁,因为即使不存在软件漏洞,这些攻击仍可被利用来泄露信息。我们针对侧信道这一问题进行研究,并将基于软件的信息泄露漏洞视为一个正交问题。

3.2 概述

通常,内核模式和用户模式共享相同的虚拟地址空间。虽然对内核地址的合法访问需要更高特权,但这些地址仍然占据着用户进程可见的虚拟内存空间的一部分。我们侧信道防御的核心思想是将随机化内核内存与用户空间的虚拟内存进行严格且高效的分离。

我们的想法如图2所示。内核执行和用户空间执行通常共享一组共同的体系结构资源,例如执行单元(核心)和内存管理单元。攻击者通过以下方式利用这些共享资源:在步骤1中,攻击者设置将泄露随机化密钥的用户进程和内存设置。随后,该用户进程发起对内核地址的虚拟内存访问。

接下来,处理器在步骤2中调用内存管理单元以检查所需特权级别。由于用户空间进程不具备访问内核内存所需的特权,因此任何此类访问最终都会被拒绝。然而,为了拒绝访问,内存管理单元必须在页表中查找所需的权限。页表结构是分层的,具有多个层级,并且每个层级都有独立缓存。因此,即使是被拒绝的访问,也会构成一个直接依赖于最后缓存层级的时序侧信道。

Weaddress 3此侧信道的根源:我们分离了内核和用户空间的页表。这有效地防止了侧信道信息的

内核地址不会泄露到用户空间,因为内存管理单元使用不同的页表层次结构。因此,当处理器处于用户模式时,内存管理单元将无法引用任何关于内核虚拟地址的信息,如步骤4所示。

3.3 细粒度地址空间隔离的挑战

为了使LAZARUS能够分离和隔离执行域,必须应对若干挑战:首先,我们必须提供一种机制,能够在任意时刻在内核和用户态执行之间切换,同时不破坏随机化的内核内存(C1)。具体而言,尽管内核空间和用户空间不再共享特权虚拟内存的随机化部分,系统仍需能够在两种执行模式下执行代码页。因此,我们必须支持内核空间与用户空间之间的切换。这具有挑战性,因为此类转换可能通过显式调用(如系统调用或异常)发生,也可能通过硬件事件(如中断)触发。我们将展示,我们的防御机制能够安全且高效地处理这两种情况。

其次,我们必须防止切换机制泄露任何侧信道信息(C2)。取消映射内核页面在侧信道信息方面也存在挑战,即未映射内存页与已映射页面相比仍表现出时间差异。因此,LAZARUS 必须防止通过探测未映射页面造成的信息泄露。

第三,我们的方法必须尽量减少应用程序运行时的开销,以提供一种实用的防御机制(C3)。高效地实现地址空间的严格隔离较为复杂,因为我们仅隔离地址空间中特权且随机化的部分。我们只需修改页表层次结构中定义随机化地址转换的部分。

在下文中,我们将解释我们的防御如何应对这些挑战。

C1:内核-用户切换

处理器资源在进程和操作系统之间进行时间共享。因此,内核最终会通过显式调用或基于信号事件来控制这些资源。显式调用内核的示例包括系统调用和异常。这些属于同步事件,意味着生成该事件的用户进程会被挂起,并等待处理该事件的内核代码执行完毕。

一方面,从用户模式切换到内核模式后,由于事件处理程序代码位于内核中,因此在虚拟内存中不再映射。因此,我们必须提供一种机制,在从用户空间进入内核执行时恢复此映射。

另一方面,当系统调用或异常处理程序结束并将执行返回给用户空间进程时,我们必须再次清除这些映射。否则,分页表项可能在特权级别之间共享。由于所有系统调用都通过明确定义的硬件接口进入内核,因此我们可以通过修改这个中心入口点来激活和停用相应的表项。

内核与用户空间执行之间的转换也可以通过中断发生。此类事件的一个简单示例是定时器中断,该中断由内核编程以在固定时间间隔内周期性触发。与系统调用或异常不同,中断是异步发生的事件,可能在任意时刻暂停当前的内核或用户空间执行。

因此,中断处理程序在处理待处理的中断之前必须保存当前进程上下文。然而,当中断发生时,处理器可能正在执行内核代码。因此,我们必须区分在用户空间或内核执行期间发生的中断,以便仅在进入和退出用户空间时分别恢复并清除内核条目。为此,我们利用中断处理程序所保存的被中断执行上下文的状态,以区分特权上下文与非特权上下文。

这使得LAZARUS仍能在内核执行期间发生中断时利用分页缓存。

C2:保护切换机制

执行地址空间切换的代码必须在用户态执行期间被映射。否则,将无法在内核中实现切换机制,因为处理器将无法访问相应的代码页。因此,必须防止这些已映射的代码页泄露任何侧信道信息。实现这一目标有两种可能的方法。

首先,我们可以将切换代码映射到与其余内核代码段不同的偏移处。在这种情况下,攻击者只能泄露切换代码的偏移,而实际的随机化密钥仍将受到保护。

其次,我们可以通过在未映射区域插入虚拟映射来消除时序信道。这使得周围的地址与切换代码表现出相同的时间特征。

由于攻击者仍然可能利用第一种情况下的切换代码进行代码复用攻击, LAZARUS 会将虚拟映射插入到用户空间页表层次结构中。

C3:最小化性能开销

一旦在处理器上启用了分页,所有内存访问都将通过虚拟内存子系统进行。这意味着每次内存访问都需要进行页表遍历。由于遍历页表会导致较高的性能开销,内存管理单元会将最常用的地址转换缓存在转译后备缓冲区(TLB)中。

LAZARUS 在用户空间执行期间从页表层次结构中移除内核地址,因此相应的转译后备缓冲区(TLB)条目需要被失效。结果,在恢复内核执行后,对内核内存的后续访问将变慢。

为了尽量减少这些性能开销,我们必须将失效的转译后备缓冲区(TLB)表项数量降至最低,同时仍强制实现内核与用户空间地址之间的明确隔离。具体而言,我们仅移除那些落入随机化内核区域(例如内核代码段)位置的虚拟映射。

4 原型实现

我们为x86架构的64位版本Linux内核4.8实现了LAZARUS原型。然而,我们所使用的技术具有通用性,可应用于所有采用多级页表的架构。我们的补丁对七个文件进行了约300处修改,其中大部分代码涉及初始化。因此, LAZARUS应能轻松移植到其他架构。接下来,我们将解释实现细节,包括初始化设置、切换机制以及如何最小化性能影响。

4.1 初始化

我们首先设置第二组页表,用于执行切换到用户空间时使用。这些页表不得包含属于内核的地址空间的随机化部分。然而,特权与非特权执行之间的切换需要在从用户空间过渡时将内核中的某些代码进行映射。我们显式地在用户页表中创建专用的入口点,指向所需的切换例程。

固定映射 。此外,还有一些内核地址被映射到地址空间顶部的固定位置。这些 fixmap条目本质上表示一种基于地址的接口:即使物理地址在启动时确定,其虚拟地址也在编译时固定。其中一些地址会被映射为用户空间可读,我们也必须显式地添加这些条目。

我们仅在启动时、第一个用户进程开始之前,设置一次这第二组页表。此后每个进程在用户态执行期间都会切换到这组页表。

虚拟映射 。 如第3节所述,保护切换机制代码页的一种方法是在用户空间页表层次结构中插入虚拟映射。具体而言,我们为随机选择的虚拟内核地址创建映射,以覆盖整个代码段。我们将这些映射分布在2M间隔中,以覆盖所有用于映射代码段的第三级页表项。因此,在用户空间执行期间,通过我们随机生成的虚拟条目,可能包含随机化内核代码段的整个地址范围都将被映射。

4.2 系统调用

Linux内核中有一个用于系统调用的单一入口点,称为系统调用处理程序。我们在执行进入系统调用处理程序后立即添加一个汇编例程来执行。该例程从预定定义的用户页表切换到内核页表,并继续分发请求的

系统调用。我们在系统调用处理程序返回前不久添加了第二个汇编例程,以从进程的页表层次结构中移除内核页表,并插入我们预定义的用户页表。

然而,与单一入口不同的是,系统调用处理程序有多个退出点。例如,存在专用的错误路径,以及常规执行的快慢路径。我们对所有这些退出点进行监控,以确保在用户态执行期间不会使用内核页表。

4.3 中断

与系统调用处理程序类似,我们需要修改中断处理程序以恢复内核页表。然而,与系统调用不同的是,中断也可能在处理器处于特权执行模式时发生。因此,为了处理中断,我们需要区分这两种情况。虽然我们可以通过查询寄存器轻松获取当前特权级,但这种方法仅提供当前执行上下文的信息,而要区分上述两种情况,我们需要的是被中断的上下文的特权级别。

幸运的是,处理器在调用中断处理程序例程之前会保存一些硬件上下文信息,例如指令指针、堆栈指针和代码段寄存器。这意味着我们可以利用与前一个代码段选择子相关联的存储的特权级来检测被中断执行上下文的特权级别。

然后,仅当其为用户上下文时才恢复内核页表。

我们仍需处理一个特殊情况:不可屏蔽中断(NMI)。由于不可屏蔽中断始终无法被屏蔽,因此由专用中断处理程序进行处理。为此,我们在内核中修改该专用NMI处理程序,以同时包含我们的机制。

4.4 细粒度页表切换

作为一种纯软件防御技术,LAZARUS 的主要目标之一是提供实际性能。尽管在内核模式和用户模式之间分离整个页表层次结构看似诱人,但这种方法并不切实际。

特别是,切换整个页表层次结构会使所有缓存的TLB项失效。这意味着每次上下文切换时缓存都会被重置,因而无法在上下文切换后继续利用缓存。因此,我们仅替换页表层次结构中定义了随机化地址的虚拟内存映射的部分。对于内核地址空间布局随机化而言,这对应于内核的代码段。更具体地说,内核代码段由512个第4级条目中的最后一个进行管理。

因此,我们仅在特权与非特权执行之间进行上下文切换时替换此条目。结果是,对于非随机化地址,缓存仍然可以在不同的特权级别之间共享。正如我们将在第5节中讨论的那样,这不会以任何方式影响我们的安全保证。

LAZARUS:实用的抗侧信道内核空间随机化

5 评估

在本节中,我们将评估我们在Linux内核上的原型实现。首先,我们证明 LAZARUS成功防止了所有先前发布的侧信道攻击。其次,我们证明我们的防御对标准计算工作负载仅造成可忽略的性能影响。

5.1 安全性

我们的主要目标是防止通过基于分页的侧信道攻击将内核中的随机化密钥泄漏给非特权进程。为此,我们将地址空间的特权部分与非特权部分的页表进行隔离。我们确保这种隔离在随机化地址上得到强制执行,以实现实际性能。

由于所有基于分页的攻击都依赖于特权虚拟地址的缓存与未缓存条目之间的时间差异,我们首先进行了一系列时序实验,以测量在启用LAZARUS的情况下仍存在的侧信道。

在第二步中,我们在采用LAZARUS加固的系统上执行所有前述的侧信道攻击,以验证我们方法的有效性。

LAZARUS对时序侧信道的影响 。为了估计剩余的时序侧信道信息,我们测量了特权虚拟地址的时间差异。我们至少访问一次内核代码段中的每个页面,并使用rdtscp指令测量其时间。通过这种方式探测特权地址空间,我们为每个内核代码页收集了执行周期的时间序列。结果如图3所示。

时序侧信道在原始的内核地址空间布局随机化实现中明显可见:实际代码段映射的起始位置位于从160个周期跃升至180个周期的第一个明显跳变处。给定相应内核镜像的参考时序后,攻击者可以通过从参考时序中的地址减去峰值地址,轻松计算出随机偏移。

与此相反,LAZARUS 的时序呈现一条直线,最大周期距离为两个周期。特别是,在加固内核的时序信号中,任何地址与峰值之间均不存在相关性。这表明我们的防御方法确实成功关闭了分页引发的时序信道。我们注意到, LAZARUS 所示的平均周期数也与相关工作 [8,13] 报道的缓存页表项的时序一致。为了进一步评估我们方法的安全性,我们还针对所有以往的侧信道攻击对其进行了测试。

时序侧信道测量。

现实世界侧信道攻击 。 我们实现并运行了所有针对采用LAZARUS加固的系统的先前侧信道攻击,以通过实验评估我们的方法在抵御现实世界攻击方面的有效性。

缺页异常处理程序 。针对内核地址空间布局随机化的首个真实世界侧信道攻击由洪德等人发表。[10]他们注意到,操作系统内核中缺页异常处理程序的执行时间取决于分页缓存的状态。更具体地说,他们从用户空间访问内核地址,从而引发页错误。虽然这通常会终止导致访问违规的进程,但POSIX标准允许进程通过信号来处理此类事件。通过为段错误(SIGSEGV)安装信号处理程序,用户进程可以从错误中恢复,并测量从初始内存访问到信号返回用户空间之间的时间差异。通过这种方式,可以扫描整个虚拟内核代码段,并将每个地址与其对应的时间测量值关联起来,从而使用户空间进程能够重构内核代码段的起始地址。我们已在启用内核地址空间布局随机化的原生Linux内核上实现并成功测试了该攻击。特别是,我们发现对于已映射和未映射页面,缺页异常处理程序表现出约30个周期的时间差异,平均耗时约为2200个周期。尽管与其他攻击相比这一差异相对较小,但这归因于内核中缺页异常处理程序代码执行路径所产生的大量噪声。当我们对内核应用LAZARUS后,该攻击不再成功。

预取 。最近,人们发现许多英特尔 x86 处理器上的预取指令能够对内核地址空间布局随机化 [8] 发起侧信道攻击。该指令本意是提供一种良性方式来监控缓存:程序员(或编译器)可使用该指令向处理器发出提示,以缓存指定的虚拟地址。

尽管无法保证此提示会以任何方式影响缓存,但原则上该指令可用于任意地址。这意味着用户模式程序可以预取一个内核虚拟地址,而执行该指令将静默失败,即不会执行内核中的页错误处理程序,也不会引发异常。

然而,内存管理单元仍需对提供的虚拟地址执行权限检查,因此预取指令的执行时间直接取决于TLB的状态。

我们实现了针对 Linux 内核地址空间布局随机化的预取攻击,并成功在原始系统上执行该攻击以泄露随机偏移。而在启用 LAZARUS 防护的系统上执行该攻击时,我们发现攻击未能成功。

TSX 。 Rafal Wojtczuk 最初提出了一种利用英特尔x86处理器中提供的事务同步扩展(TSX)来绕过内核地址空间布局随机化(KASLR)的攻击方法, [23],该攻击通过 Jang 等人的一篇论文在学术界广受关注。 [13]TSX 提供了一种硬件机制,旨在通过锁省略简化多线程应用程序的实现。TSX 最初在 Haswell 处理器中发布,支持 TSX 的处理器能够在必要时动态决定对通过锁保护的临界区进行串行化处理。如果无法保证软件视角下的原子性视图,例如由于同一核心上的两个逻辑处理器之间发生访问冲突,则处理器可能会中止 TSX 事务。

TSX 会抑制在事务区域中发生的、本应暴露给软件的任何故障。引起页表遍历的内存访问可能会中止事务,根据规范不会通过 TLB 等结构的行为使这些访问在架构上可见[12]。然而,中止的时间特性可被利用来泄露 TLB 的当前状态。通过在事务块内引发页表遍历,中止事务的时间信息可以揭示映射到进程中的内核页的位置:首先,攻击者在事务块内发起对内核页的内存访问,这将导致(1)一次页表遍历,以及(2)一个段错误。由于 TSX 在硬件层面屏蔽了段错误,内核永远不会察觉该事件,中央处理器将执行由攻击者控制的应用程序提供的中止处理程序,该应用程序发起了恶意事务。其次,攻击者记录中止处理程序执行的时间信息。如果被探测的页已映射,事务中止大约耗时 175 个周期;如果未映射,则中止耗时约 200 个周期或更长 [23]。通过探测内核代码段起始位置的所有可能地址,此侧信道将内核地址空间布局随机化的偏移泄露给了用户空间中的非特权攻击者。

以这种方式在LAZARUS下探测页面不会泄露任何信息,因为我们已将所有内核代码页从进程的地址空间中取消映射,使得时序侧信道失效,因为对内核地址的任何探测都会显示为未映射。只有切换代码及其周围的虚拟条目被映射。然而,这些页面表现出相同的时间信息,因此对于攻击者而言无法区分。

5.2 性能

我们在一台配备英特尔酷睿 i7‐6820HQ 中央处理器(主频 2.70吉赫)和 16吉字节 内存的机器上评估了 LAZARUS。该机器运行的是 Arch Linux 的最新发行版,内核版本为 4.8.14。在测试中,我们启用了 Arch Linux 所附带的 Linux内核 中的 内核地址空间布局随机化。此外,我们还使用相同的配置编译了一个应用了 LAZARUS 的次要内核。

我们首先考察了在行业标准 SPEC2006 基准测试下的性能开销 [9]。我们在启用了 KASLR 的原始内核下,在测试平台中运行了整数和浮点基准测试。我们收集了这些结果,并在 LAZARUS 内核下再次进行了测试。我们的结果如图4所示。

观察到的性能开销可归因于测量不准确。我们计算出的最坏情况开销为 0.943%。需要注意的是,SPEC2006 旨在测试计算工作负载,在上下文切换方面的操作较少。

为了更好地评估 LAZARUS 对系统的影响,我们运行了 LMBench 提供的系统基准测试[L22]。LMBench3 通过消除早期版本基准测试中存在的一些问题,改进了上下文切换基准测试,尽管它在多处理器系统上仍存在问题。因此,我们在测试期间禁用了 SMP。我们的结果如图5所示。

我们可以看到,系统调用密集型应用在LAZARUS下的受影响最大。这是预料之中的,因为在进入内核执行时,必须重新映射属于内核的页表。总体而言,我们在运行这些基准测试时表现出47%的性能开销。然而,我们希望提醒读者,这些基准测试旨在对操作系统处理中断时的性能进行压力测试,并不能反映系统的正常运行情况。

为了更真实地评估LAZARUS,我们运行了Phoronix测试套件[15],该套件被广泛用于比较操作系统的性能。Phoronix基准测试套件包含大量覆盖系统不同方面的测试,并根据目标机器的子系统进行分组。具体而言,我们运行了系统和磁盘基准测试以测试应用程序性能。我们的结果如图6所示。在此基准测试中,我们显示出平均2.1%的性能开销,这与我们通过SPEC和lmbench基准测试得到的结果一致。表现最差的是那些受限于读取操作的基准测试。我们推测,这是因为在执行读取操作期间发生了大量的上下文切换,因为需要将内核内存中的缓冲区复制到用户空间的缓冲区或在那里重新映射。

最后,我们在一个测试PostgreSQL数据库上运行了pgbench基准测试,并测得2.386%的性能开销。

SPEC2006 基准测试结果

LMBench3 基准测试结果

Phoronix 基准测试套件

6 讨论

6.1 将LAZARUS应用于不同的KASLR实现

内核代码重定位是随机化方法如何用作防御构建模块的一个示例,几乎所有现实世界中的操作系统都实现了该方法 [2,11,14]虽然采用控制流完整性(CFI) 的内核 [1,3,21]从代码段的随机化中无法获得安全性收益,但它仍可能随机化其他内核内存区域的内存布局:例如,可以将其应用于模块段,以隐藏动态可加载内核模块代码的起始地址。此外,最近有人提出将随机化作为一种手段,用于保护页表免受通过仅数据攻击进行的恶意修改 [5]。

由于所有公开的攻击都集中在泄露内核代码段的随机偏移上,因此我们也为KASLR实现了我们的概念验证。尽管如此,我们注意到LAZARUS并不仅限于强化内核代码随机化,还可以应用于其他随机化实现。与保护KASLR的情况不同,当我们的防御应用于其他内存区域时,无需对底层切换代码进行特殊处理来隐藏它。

6.2 针对内核地址空间布局随机化的其他侧信道攻击

如第2节所述,几乎所有先前提出的针对内核地址空间布局随机化(KASLR)的侧信道攻击都利用了分页子系统。LAZARUS 通过分离用户进程和内核的页表,将内核虚拟内存与用户进程隔离。然而,Evtyushkin 等人 [6]最近提出了分支目标缓冲区(BTB)侧信道攻击,该攻击并不利用分页子系统来获取虚拟内核地址。

特别是,他们展示了如何利用用户空间和内核地址之间分支目标的冲突。该攻击通过在用户空间构建一条恶意的分支目标链来填充分支目标缓冲器,然后执行先前选定的内核代码路径。这会将之前在内核模式下执行过的分支目标从分支目标缓冲器中逐出,从而导致其后续执行时间变长。

尽管已证明分支目标缓冲器(BTB)攻击可以绕过Linux上的内核地址空间布局随机化(KASLR),但它与基于分页的侧信道不同,其成功依赖于一系列假设:(1)BTB的容量有限,仅为10位,因此要求KASLR实现部署较低的熵值才能成功;(2)攻击者需要构造一条分支目标链,导致内核地址从BTB中被逐出。为此,攻击者需要逆向工程用于索引分支目标缓冲器的哈希算法。由于每种微架构所使用的哈希算法都不同,这限制了潜在的攻击目标范围;(3)攻击结果可能具有歧义性,因为执行路径的任何变化都会直接影响BTB的内容。

有多种方法可以缓解针对KASLR的BTB侧信道攻击。一种直接的方法是增加KASLR的熵值,正如Evtyushkin 等人所指出的那样。[6]更通用的方法是在 BTB中对特权地址和非特权地址进行隔离。这可以通过提供专用的清刷新操作来实现,但这需要对硬件进行修改。或者,如果用于索引BTB的哈希算法已被逆向工程,则可在软件中模拟该清刷新操作。我们在对抗BTB攻击时实现了这一方法,通过调用一个执行一系列跳转指令并结合我们的页表切换例程的函数,在测试中无法通过BTB攻击恢复正确的随机化偏移。

7 相关工作

在本节中,我们讨论已提出的针对侧信道攻击的软件和硬件缓解措施,并将其与我们的方法进行比较。

7.1 硬件缓解措施

缓存中的特权级隔离 。通过修改底层硬件缓存实现,也可以消除分页侧信道。洪德等人首次指出了这一点[10]。然而,现代架构的缓存设计旨在优化性能。此外,对硬件的修改成本非常高,且需要多年时间才能广泛部署这些新系统。因此,这类修改不太可能被实施,即使实施了,现有的生产系统在很长一段时间内仍将处于易受攻击状态。我们仅通过软件的缓解措施可以通过修补内核立即部署。

禁用非特权用户对详细计时功能的访问 。所有先前提出的分页侧信道攻击都依赖于默认提供给非特权用户的详细计时功能。因此,洪德等人[10]建议为用户模式进程禁用 rdtsc 指令。虽然这可以通过软件实现,但它实际上改变了机器的应用程序二进制接口。由于现代平台需要支持大量遗留软件,实施此类更改将给许多实际的用户应用程序带来问题。正如我们在广泛的评估中所展示的那样,LAZARUS 对用户级程序是透明的,并且不会干扰遗留软件的正常工作流程。

7.2 软件缓解措施

分离地址空间 。 在用户态执行期间取消映射内核页表是分离各自地址空间的一种自然方法,如[8,13]中所建议的。然而,Jang 等人 [13]认为该方法不切实际,因为预期会有显著的性能下降。Gruss 等人 [8]估计重新加载整个页表层次结构的性能影响最高可达5%。在上下文切换期间通过CR3寄存器重新加载页表层次结构的顶层,但未提供其估算方法的任何实现或详细评估。重新加载页表的顶层会导致更高的性能开销,因为它要求处理器刷新所有缓存条目。苹果公司已在其iOS平台[16]上实现了地址空间隔离。由于ARM平台支持多组页表层次结构,因此在移动设备上的实现较为直接。我们首次提供了一种改进的、高度实用的方法,用于在x86平台上实现地址空间隔离。

增加KASLR熵 。一些已提出的侧信道攻击之所以得逞,是因为Linux内核中的内核地址空间布局随机化实现存在相对较低的熵 [6,10]。因此,增加熵的数量在实践中是一种缓解此类攻击的方法。尽管洪德等人 [10] 和 Evtyushkin 等人 [6], 已提出该方法,但它并不能消除侧信道。此外,这种缓解效果仅限于利用低熵随机化的攻击。相比之下,LAZARUS 能够缓解所有先前提出的分页侧信道攻击。

修改页错误处理程序 。 洪德等人 [10]通过调用页错误处理程序利用了执行时间差异。他们建议通过软件使页错误处理程序对所有内核地址的执行时间保持一致。然而,这种方法对于不调用内核的攻击[8,13]无效。我们的缓解措施通过软件重新组织缓存布局,成功阻止了利用硬件特性泄露侧信道信息的攻击,即使这些攻击不依赖于任何软件的执行时间。

KAISER 。在我们开展工作的同时,Gruss 等人实现了强大的地址空间隔离[7]。他们的性能数据与我们自己的测量结果一致,证实了将内核和用户空间的地址空间进行隔离是防御基于分页的侧信道攻击的一种实用方法。与 LAZARUS 不同,他们的方法并未使用虚拟映射来隐藏切换代码,而是将切换代码从其余的内核代码段中分离出来(如3.3.C2 所述)。

8 结论

随机化已成为现代操作系统安全架构的重要组成部分。侧信道攻击通过从非特权用户进程泄露随机化密钥,威胁到内核中部署的基于随机化的防御机制。由于这些攻击利用了底层硬件的微架构实现细节,因此通过纯软件缓解措施高效地关闭这一侧信道具有挑战性。然而,所有这些攻击都依赖于一个事实:内核和用户虚拟内存位于一个共享地址空间。通过LAZARUS,我们提出了一种纯软件的防御方法,以缓解先前提出的侧信道攻击。我们的方法表明,通过在软件中将随机化的特权地址的页表项与非特权地址的页表项分离,可以隐藏通过共享硬件资源泄露的侧信道信息。LAZARUS是对抗侧信道攻击、增强内核空间随机化的必要且高度实用的扩展。

【四轴飞行器】非线性三自由度四轴飞行器模拟器研究(Matlab代码实现)内容概要:本文围绕非线性三自由度四轴飞行器模拟器的研究展开,重点介绍基于Matlab代码实现的四轴飞行器动力学建模与仿真方法。研究构建了考虑非线性特性的飞行器数学模型,涵盖姿态动力学与运动学方程,实现了三自由度(滚转、俯仰、偏航)的精确模拟。文中详细阐述了系统建模过程、控制算法设计思路及仿真结果分析,帮助读者深入理解四轴飞行器的飞行动力学特性与控制机制;同时,该模拟器可用于算法验证、控制器设计与教学实验。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的高校学生、科研人员及无人机相关领域的工程技术人员,尤其适合从事飞行器建模、控制算法开发的研究生和初级研究人员。; 使用场景及目标:①用于四轴飞行器非线性动力学特性的学习与仿真验证;②作为控制器(如PID、LQR、MPC等)设计与测试的仿真平台;③支持无人机控制系统教学与科研项目开发,提升对姿态控制与系统仿真的理解。; 阅读建议:建议读者结合Matlab代码逐模块分析,重点关注动力学方程的推导与实现方式,动手运行并调试仿真程序,以加深对飞行器姿态控制过程的理解。同时可扩展为六自由度模型或加入外部干扰以增强仿真真实性。
基于分布式模型预测控制DMPC的多智能体点对点过渡轨迹生成研究(Matlab代码实现)内容概要:本文围绕“基于分布式模型预测控制(DMPC)的多智能体点对点过渡轨迹生成研究”展开,重点介绍如何利用DMPC方法实现多智能体系统在复杂环境下的协同轨迹规划与控制。文中结合Matlab代码实现,详细阐述了DMPC的基本原理、数学建模过程以及在多智能体系统中的具体应用,涵盖点对点转移、避障处理、状态约束与通信拓扑等关键技术环节。研究强调算法的分布式特性,提升系统的可扩展性与鲁棒性,适用于多无人机、无人车编队等场景。同时,文档列举了大量相关科研方向与代码资源,展示了DMPC在路径规划、协同控制、电力系统、信号处理等多领域的广泛应用。; 适合人群:具备一定自动化、控制理论或机器人学基础的研究生、科研人员及从事智能系统开发的工程技术人员;熟悉Matlab/Simulink仿真环境,对多智能体协同控制、优化算法有一定兴趣或研究需求的人员。; 使用场景及目标:①用于多智能体系统的轨迹生成与协同控制研究,如无人机集群、无人驾驶车队等;②作为DMPC算法学习与仿真实践的参考资料,帮助理解分布式优化与模型预测控制的结合机制;③支撑科研论文复现、毕业设计或项目开发中的算法验证与性能对比。; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,重点关注DMPC的优化建模、约束处理与信息交互机制;按文档结构逐步学习,同时参考文中提及的路径规划、协同控制等相关案例,加深对分布式控制系统的整体理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值