G.O.S.S.I.P 阅读推荐 2024-09-20 BULKHEAD

由南京大学曾庆凯老师研究组和明尼苏达大学卢康杰老师研究组合作完成的关于Linux内核分隔化的工作BULKHEAD: Secure, Scalable, and Efficient Kernel Compartmentalization with PKS,该论文目前已被NDSS 2025录用。

背景

Linux内核漏洞

庞大的Linux宏内核在同一地址空间共享特权。在缺少隔离的现状下,攻击者只需利用薄弱组件中的一个漏洞就可以攻陷内核,进一步控制整个系统。尽管安全研究人员付出了巨大的努力,内核漏洞仍然层出不穷。过去十年间已经报告了近三千个Linux内核CVE,其中2023年的CVE数量较2013年增长了179%。面对这一严峻问题,亟需一种通用的、原则性的防御方案来限制潜在漏洞的影响范围。借鉴古人造船的智慧,通过增加隔板(bulkhead)构筑水密隔舱(compartment),可以有效防止漏洞威胁蔓延,避免整个系统倾覆。

Intel PKS

PKS即Intel Memory Protection Keys for Supervisor-mode,是12代Core和4代Xeon处理器引入的适用于内核态页面的Intel MPK技术。虽然其用户态版本PKU已经被很多工作应用于intra-process isolation,将PKS应用于intra-kernel isolation却面临着内核特权环境带来的独特挑战:

  1. 宏内核代码共享了修改页表和PKRS寄存器的权限,可以借此绕过隔离保护。

  2. 基于PKS的内存访问控制并不限制执行权限,忽略了对控制流的保护。

  3. 4-bit pkey最多支持16个内存域,难以满足对数以百计的loadable kernel modules (LKMs)的分隔需求。

理想的内核分隔化

本文对现有的内核隔离工作做了全面调研,包括基于微内核、SFI、虚拟化、硬件机制的多种方案,从四个方面总结了理想的内核分隔化应该满足的目标:

  1. 安全性:全面的安全保护包括双向隔离数据保护控制流保护以及分隔域接口保护。此前工作往往仅关注限制驱动访问主内核的单向隔离而忽视源自主内核的安全威胁。另外,分隔域接口缺乏保护会导致confused deputy attack(即通过接口欺骗某一个模块代替攻击发起模块访问攻击者本无权限访问的资源)。本文创新性地提出了双向隔离方案及分隔域接口完整性,并且不依赖于更高特权层的hypervisor。

  2. 可扩展性:为了实现细粒度的分隔化,系统应该支持尽可能多的安全域。本文提出局部性感知的两级分隔化,突破了PKS自身仅支持16个域的硬件限制,能够通过地址空间切换无限扩展分隔域数量。

  3. 性能:实用的内核分隔化不能忽视性能表现,包括域切换性能数据传输性能。基于PKS的安全域切换仅需一次PKRS寄存器更新,避免了昂贵的页表操作和TLB刷新。此外,本文实现了零拷贝的跨域数据传输,安全且高效。

  4. 兼容性:为了方便部署,BULKHEAD最大程度上考虑了兼容性。其借助Intel现有硬件特性PKS,无需硬件修改。即插即用的in-kernel monitor仅不足三千行代码,不需要微内核那样的架构变动,也不依赖于虚拟化。该方案对上层应用透明,也可以无障碍地迁移至云环境而不用考虑嵌套虚拟化带来的约束。

BULKHEAD设计

In-kernel Monitor

通过基于PKS的内存隔离基于二进制改写的特权指令消除BULKHEAD在内核内构建了轻量级的monitor以保障互不可信的内核模块间的双向隔离,从而将主内核也排除在可信计算基(TCB)之外,实现类似微内核的安全效果。特别的,页表以及保存域切换相关metadata的 switch gate table (SGT) 仅能由monitor安全更新。

安全不变式

  1. 数据完整性(Data Integrity)BULKHEAD通过pkey保证数据的唯一所有权,每个分隔域均使用私有堆和私有栈,攻击者无法篡改其他分隔域的数据。

  2. 仅执行内存(eXecute-Only Memory):所有内核代码不可读写,XOM结合KASLR和cross-compartment CFI显著缓解了代码注入或代码复用等控制流劫持攻击。

  3. 分隔域接口完整性(Compartment Interface Integrity):分隔域切换仅能发生于定义好的出入口并根据安全策略传输数据。不同于此前PKU相关工作中两个隔离域之间的切换,内核分隔化涉及多个互不可信的特权域。BULKHEAD由monitor在switch gate table中维护了丰富的metadata,如源/目标地址、地址空间、PKRS寄存器值和私有栈指针等,对交互双方进行严格验证,保障域切换的原子性、确定性和排他性。

两级分隔化

两级分隔化的第一级指同一地址空间内基于PKS的隔离,而第二级则是局部性感知的多地址空间切换,每个地址空间都会新增16个域支持。经过分析,在6296个内核模块中,仅有54个依赖于超过12个模块。BULKHEAD根据这种模块间依赖关系的局部性来划分地址空间,并将内存划分为共享区域和私有区域。如下图所示(以两级页表为例),主内核和monitor由各个地址空间共享,而LKM1/2和LKM3/4分处不同地址空间,因而可以复用相同的pkey标记。这种局部性感知的划分在尽可能避免地址空间切换的同时有效扩展了分隔域的数量。分配给地址空间的 Address Space Identifier (ASID) 可以防止地址空间切换带来频繁的TLB刷新,从而优化性能。

实验评估

本文基于Linux kernel v6.1和LLVM 14.0.0实现了自动化分隔LKM的原型系统,并在Intel Core i7-12700H CPU上做了丰富的实验评估,以下展示一些代表性结果,实验详情参见论文。

安全分析

作者选取了分布于不同Linux内核模块的多种类型的高危CVE进行分析,BULKHEAD可以有效限制漏洞影响,避免攻击者构建完整利用链攻陷内核。

性能测试

下表以Phoronix测试套件为例展示了BULKHEAD对系统整体性能的影响。从仅构建monitor、隔离ipv6到160个LKM域,开销并未随着分隔域数量的增长而显著增加,即使分隔160个内核模块到互不可信的安全域中也仅产生2.44%的平均开销。

聚焦到ipv6模块,ApacheBench的开销也仅在2%左右,显著优于基于ARM MTE和PAC的内核分隔化工作HAKC(NDSS’22杰出论文)。HAKC仅对两个分隔域进行了实验,每个分隔域带来14%-19%的性能开销。

总结

本文利用Intel PKS机制实现了安全、高效、可扩展的Linux内核分隔化。通过双向隔离,轻量、新颖的in-kernel monitor保障了数据完整性、仅执行内存、分隔域接口完整性等安全不变式。局部性感知的两级分隔化则大大扩展了PKS支持的分隔域数量。实验表明BULKHEAD可以有效防止攻击者通过各类型漏洞攻陷内核,自动化分隔160个内核模块仅产生了平均2.44%的性能开销。


论文:https://arxiv.org/abs/2409.09606(相关代码将在整理后开源)

投稿作者介绍:郭迎港,南京大学计算机软件新技术全国重点实验室final-year PhD,导师为曾庆凯老师,曾赴美国明尼苏达大学卢康杰老师研究组访问交流。主要研究方向为操作系统内核安全,包括对内核特权分离的形式化建模分析以及内核模块分隔化。研究目标是基于最小特权原则限制潜在漏洞的影响。相关成果发表于NDSS、ACSAC、ESORICS、软件学报等会议和期刊。

个人主页:https://gyg128.github.io/


免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。查看原文

为您推荐