G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

admin 2023年12月19日00:51:00评论15 views字数 4159阅读13分51秒阅读模式

今天我们要为大家介绍的论文PANIC: PAN-assisted Intra-process Memory Isolation on ARM2023年ACM CCS杰出论文奖得主之一,而且今天的内容是由论文作者之一的谢梦瑶老师(也是我们2023年暑期学校的讲师之一,还作为G.O.S.S.I.P特约记者为大家从CCS 2023前线发回报道)亲自撰写!

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

首先,从论文标题我们就能够大概知道这项工作研究是ARM上的进程内(内存)隔离(Intra-process memory isolation)。进程内隔离机制可以在系统内部强制实施最小特权安全原则,可以用于保护防御机制的元数据(如影子栈 Shadow Stack),也可以用于保护核心机密例如OpenSSL库中的密钥(此处强行插入软广告,欢迎了解一下G.O.S.S.I.P的Goshawk系统),还可以用于保护即时编译器动态生成的代码。

通常来说,进程内隔离机制可以分为两大类,分别是基于地址(address based)的隔离方法基于域(domain based)的隔离方法。基于地址的隔离方法(如SFI机制)需要插桩每条访存指令,在每条访问指令执行之前检查访问的目的地址是否落在被隔离区域内。由于需要对所有访存指令插桩,因此会导致比较严重的代码膨胀问题。基于域的隔离方法将被隔离区域单独划分为一个域,访问被隔离区域前打开其访问权限,访问完成后立即关闭访问权限。ARM memory domain和Watchpoint等硬件机制都可以用于实现高性能的域隔离。

然而,此前AArch64架构下缺乏高效、通用的进程内隔离机制,为此,本文提出了一种高效的进程内隔离机制PANICPANIC可以应用在三种场景中:

  1. 保护防御机制的元数据(如,影子栈);

  2. 保护敏感数据和敏感代码,如OpenSSL库中的密钥和相关的代码;

  3. 保护即时编译器中动态生成的代码。

在了解PANIC之前,我们先要了解AArch64架构的一些硬件特性的背景知识。图1介绍了AArch64的几种硬件特性。为了阻止内核对用户数据的直接访问(a),ARM推出了特权访问禁止(Privileged Access Never,PAN) 机制。该机制开启后,能够阻止内核态(EL1)的访存指令访问用户数据(b),用户数据所在的页面被称为非特权页面(Unprivileged Page,U-page)。非特权读/写指令(Load/Store Unprivileged instructions,LSU指令)是一类特殊的访存指令,当运行在内核态时,它们可能表现得像运行在用户态一样,即能够访问用户数据。LSU指令的行为取决于非特权访问覆盖控制(Unprivileged Access Override control,UAO),当UAO关闭时,LSU能够访问用户数据(c),当UAO开启时,LSU无法访问用户数据(b)。

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

图1 AArch64硬件特性介绍

PANIC的核心思想如图2所示。我们将目标进程运行在内核态,将隔离内存设置为非特权页面,进程的堆、栈等数据页和代码页设置为特权页面。当程序运行时,隔离内存只能被可信代码中的LSU指令访问,而不可信代码的普通读/写指令无法访问。PANIC通过将访存指令划分为普通读/写指令和LSU指令,达到了保护隔离内存区域的效果。经过测试,LSU指令的执行和普通读/写指令一样快,因此PANIC能够实现非常低开销的进程内隔离。

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

图2 PANIC核心思想

然而,将应用程序运行于内核态,给PANIC设计带来了许多麻烦。首先,原本基于特权级别和PAN的用户-内核双向内存隔离被打破了:应用程序和内核处于同一特权级别,PAN机制也被用于内存隔离,这其中的难点是如何重构用户-内核双向内存隔离;其次,运行在内核态的应用程序拥有了特权指令的执行权限,此外作者还发现有些指令在用户态执行的行为和在内核态执行的行为是不一致的,如何定义、识别和处理所有敏感指令,又是一个非常具有挑战的待解决难点。

图3展示了PANIC的系统架构,其核心是一个内核模块,支持目标应用运行在内核态。除此之外,PANIC还包含3个主要组件:Runtime shim组件用于重构用户-内核的双向内存隔离,Instruction Scanner组件用户扫描和模拟敏感指令,Memory Management组件用于配置普通内存区域和隔离内存区域等。

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

图3 PANIC架构

PANIC的设计中,引入了一个核心概念——shim,并且基于此提出了Shim-based memory isolation,那么到底什么是shim呢?你可以把它想象为一段特殊的代码,既能够支持用户态代码在内核模式执行,同时还能够实现内核代码和用户态代码的双向隔离(图4)。你可以把它想象成一种很特殊的受控代码模式,其中包含了两类代码——user shim和kernel shim,PANIC利用它们重构了用户-内核内存隔离:首先利用地址翻译控制寄存器 (Translation Control Register, TCR_EL1) 的特性——控制用户空间和内核空间的虚实地址翻译,包含了多个控制域(其中EPD0和EPD1分别控制了进程地址空间和内核地址空间的翻译过程)。在用户态上下文运行时,内核空间的地址翻译处于关闭状态(即内核空间是隐藏的);发生异常时,进入User Shim,开启内核空间的地址翻译,然后跳到Kernel Shim执行;Kernel Shim关闭用户空间的地址翻译(即用户空间是隐藏的)。

然而,EPDx只能控制地址翻译(即只能在TLB缺失时生效),因此PANIC为目标应用和内核分配不同的ASID,隔离用户和内核的TLB表项;在Shim中,则通过切换TCR_EL1.A1的值来切换ASID。PANIC还利用Debug寄存器保证Shim的原子性:只有从Shim的入口开始执行,才能清除Debug寄存器设置的执行断点,使得修改TCR_EL1的MSR指令能够正常执行。

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

图4 不同上下文的内存视图

PANIC假设操作系统和硬件是安全且可信的,攻击者能够利用内存破坏漏洞拥有任意地址读写的能力。特别地,在后两种场景下,攻击者还拥有控制流劫持的能力。作者详细梳理了针对Shim可能发起的攻击和相应的防御方法,具体可以参见原文。

为了完成这篇论文,作者花费8人月梳理了ARMv8-A指令手册中的1529条指令,将在用户态和内核态下执行行为不一致的指令定义为敏感指令,并将敏感指令分为无条件敏感指令和有条件敏感指令。在敬佩作者的努力之余,我们也要搞清楚什么是无条件敏感指令和有条件敏感指令。

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

图5 敏感指令实例

图5(a)给出了一个无条件敏感指令的例子,在任何系统配置下,这条Cache maintenance指令在用户态下执行始终会触发指令未定义异常;(b)是一条控制寄存器读指令,在某些系统配置下,用户态和内核态都可以正常运行,但其读到的值是不同的,我们将这种在不同上下文都能执行,但行为不一致的指令称为条件敏感指令。

PANIC首先会扫描代码页的所有4字节指令,确定是否为敏感指令。如果是无条件敏感指令,则原地转换为UDF指令;如果是有条件敏感指令,则记录到指令map中,然后转换为BRK指令,BRK的立即数操作数是指令map当前的偏移。运行过程中,UDF指令会触发指令未定义异常;BRK指令会触发断点异常,PANIC截获该异常,根据立即数操作数索引到原指令并模拟其在用户态的行为。

PANIC默认在编译阶段完成上述指令转换过程,对于没有源码的二进制,作者还开发了一套二进制扫描工具,对敏感指令进行扫描和转换。此外,ARM二进制的可执行段中可能包含数据(称为内嵌数据),具体来说有两种情况:

  1. .rodata section等数据段会和.text section一起映射到可执行段;

  2. padding和literals等只读数据会编码到代码段。

PANIC的二进制扫描工具会对内嵌数据进行识别和处理,具体方法可以参见原文。

PANIC支持三种场景,分别是保护防御机制的元数据如影子栈、保护敏感数据和敏感代码以及保护即时编译器动态生成的代码。由于篇幅原因,只介绍第二个场景。为了保护敏感数据和代码,PANIC创建了隔离执行环境(Isolated Execution Environment,IEE),将敏感数据设置为U-page。为了阻止IEE中的LSU指令被滥用,PANIC提供了基于UAO的执行门:在IEE的入口关闭UAO,使得LSU指令可以访问U-page;在IEE的出口开启UAO,使得LSU指令无法访问U-page。

表1列出了PANIC APIs,包括隔离内存的分配/释放API,隔离内存的读/写API,以及IEE的支持等。

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

表1 PANIC APIs

在实验评估部分,作者首先测试了保护影子栈机制的性能开销,将PANIC和LLVM编译器的默认返回地址保护方法(LLVM-PAC)以及PACStack做对比。如图6所示,在SPEC CPU2017 C/C++测试用例中,PANIC的几何平均性能开销低于1%。

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

图6 保护SPEC CPU2017 C/C++测试套件的返回地址的性能开销

PANIC在保护OpenSSL库中的session key时,在网络服务器Nginx上引入的性能开销是4.94%(图7)。

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

图7 保护OpenSSL session key时Nginx的性能开销

作者还测试了保护JavaScriptCore引擎的代码缓存的性能开销,如图8所示,PANIC引入的性能开销低于已有的基于mprotect的性能开销。

G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

图8 使用mprotect/PANIC保护JavaScriptCore引擎的代码缓存时,给Octane 基准测试集引入的性能开销

总结一下,进程内隔离是提高进程内安全性的经典技术。基于AArch64中的PAN和LSU,作者提出了一种高效通用的内存隔离技术PANIC,通过两种新技术——基于shim的内存隔离技术和敏感指令模拟技术,实现了在内核态安全地运行用户进程这一神奇目标!


论文下载:https://dl.acm.org/doi/10.1145/3576915.3623206


原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2023-12-18 PANIC

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月19日00:51:00
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   G.O.S.S.I.P 阅读推荐 2023-12-18 PANIChttps://cn-sec.com/archives/2314748.html

发表评论

匿名网友 填写信息