Harmonizing Performance and Isolation in Microkernels with Efficient Intra-kernel Isolation and Communication论文阅读总结

摘要

本文提出了一个新的设计方案UnderBridge机制,在运行时UnderBridge在用户空间和内核空间移动操作系统组件。
本文还对内核空间的英特尔用户空间内存保护密钥(PKU)进行了改造,以有效实现隔离,并且设计了一种跨操作系统的快速IPC机制。

一.介绍

微内核特点:微内核通过将操作系统组件(如文件系统,网络堆栈以及设备驱动程序)转移到隔离的用户进程中,从而最小化特权模式下运行的代码,从而实现良好的扩展性,完整性和故障隔离。

微内核的操作系统组件之间的通信开销是它的致命弱。

UnderBridge是对微内核运行时结构进行了重新设计,以协调性能和隔离性。

传统的微内核是由处于特权模式的核心内核和多个处于不同用户进程的系统服务器组成。

UnderBridge的关键思想就是在特权模式下构建隔离的域,并且提供高效的跨域交互,并可以使得用户空间的系统服务器可以在这些域中运行。系统服务器运行在内核就不需要昂贵的与内核的通信。可以与内核高效的交互。

UnderBridge支持服务器迁移,因为隔离域的数量是有限的,而且可能会比系统服务器的数量小,有了服务器迁移,微内核可以根据性能动态的决定在用户进程或内核中运行的服务器。

用户空间的保护密钥(PKU)也被称为英特尔内存保护密钥(MPK),PKU不仅可以在用户空间用,如果将内核页表条目的user/kernel位标为usr的话,PKU也可以在内核空间用,但这是不安全的。但是现在的操作系统有内核页表隔离机制KPTI,用户进程和内核对KPTI使用不同的页表,防止了应用程序访问内核的风险。

UnderBridge为内核分配一个单独的页表,并在内核空间的MPK内存域上构建独立的执行域。一个新的指令wrpku,可以通过创建一个特定的寄存器PKRU(保护用户页面的密钥权限寄存器)来帮助域交换。

在内核只是用MPK是无法实现与传统内核相同的隔离保证,那是因为MPK只在访问内存时检查每个任务的读写,而对指令没有限制,所以任何服务器都可以在同一个虚拟地址空间中执行所有代码,并且UnderBridge中用来建立两个特定服务器之间连接的IPC门可以被任何服务器滥用,因此UnderBridge通过检查IPC门的(唯一的)内存访问权限来对调用者进行身份验证,并通过在IPC门的两边验证一个秘密令牌来确保身份验证是不可绕过的。

二.动机

  1. 使用IPCs调用服务器的成本很高

    图中显示了一个涉及两个系统服务器的调用过程,从而导致了两个IPC,在这种情况下微内核在用户和内核之间总共需要四次往返,但是Linux只需要一次,即应用程序和操作系统之间最左边的箭头,这是因为Linux直接通过函数调用,调用不同的内核组件。

  2. IPC开销分析

    IPC的直接成本主要由三个部分组成,第一部分是特权切换,首先将IPC补货到内核中来启动IPC,再保存调用者上下文。第二部分是流程切换,主要成本是CR3修改指令,由于调用者和被调用者被隔离在用户的不同的地址空间中,内核必须将地址空间从调用者更改为被调用者。第三部分是其他逻辑,比如权限和快速路径条件检查。

  3. 在内核中使用intel MPK
    Intel内存保护密钥(MPK)是一种限制内存访问的新硬件特性。MPK将一个四位域ID(即保护密钥)分配给虚拟地址空间中的每一页,方法是将该ID填入以前未使用的页表条目的位中。因此,MPK可以将一个虚拟地址空间中的用户页面划分为最多16个内存域。为了确定每个内存域上的访问权限(只读、读写、无),它引入了一个每核寄存器PKRU和一条新指令wrpkru,以便仅在28个周期内修改PKRU寄存器。

  4. 构建隔离区域
    利用高级硬件特性来构建隔离域可以获得更好的运行时性能。例如,利用(扩展的)页表在用户空间中提供隔离的域,并利用vmfunc和wrpkru等指令来实现快速域切换。我们在表1中列出了这些常用仪器的费用。wrpkru的成本是最接近于间接调用的,间接调用是在单片内核中调用内核组件(使用函数指针)。因此,考虑到MPK适用于内核并具有良好的性能,我们提出可以利用MPK在内核中实现一种高效的细粒度隔离机制。

三. UnderBridge

UnderBridge的目标是优化同步IPC,同时保持强隔离,一种直观的设计是采用基于MPK的进程内隔离来在应用程序地址空间内运行系统服务器。然而这种设计有三个主要问题:

  1. 它需要将一个服务器映射到多个应用程序的页表中,这使得更新服务器的内存映射特别昂贵。
  2. 由于频繁修改页表,设置IPC的成本是不可忽略的。
  3. 它限制了应用程序自由的使用整个地址空间和MPK硬件的能力。

然而UnderBridge通过将系统服务器放回到内核中来提高IPC能力
在图中,系统服务器A和B就运行在内核空间,但是被限制在隔离的环境中(被称为执行域),UnderBridge使核心内核和内核系统服务器共享相同的(内核)地址空间,同时利用Intel MPK来保证内存隔离。

为了可以在内核空间中使用MPK,UnderBridge将内核页表的内存页的访问位全标记为User,并且为了防止无特权应用程序访问内核,UnderBridge为每个应用程序单独分配一个页表,应用程序的页表中不包含内核空间的内存,除了一个用于特权切换的蹦床区域。

构建与内核内系统服务器的IPC连接需要执行以下步骤:

  1. 系统服务器在处理请求之前预先在核心内核中注册一个函数地址(IPC函数),核心内核将会检查该地址是否合法,可执行文件是否属于服务器。
  2. 另一个服务器可以请求核心内核与注册的服务器建立IPC连接。(这点我有点不理解)
  3. 核心内核生成一个IPC门,它有助于完成IPC函数调用。

Building IPC connections with in-kernel system servers takes the following steps. First, a system server proactively registers a function address (IPC function) in the core kernel before serving requests. The core kernel will check whether the address is legal, i.e., both executable and belonging to the server. Second, another server can ask the core kernel to establish an IPC connection with the registered server. Third, the core kernel generates an IPC Gate, which helps to accom- plish the IPC function invocation.

如果应用程序需要调用内核内服务器,他首先需要建立连接,然后调用IPC系统调用,陷入内核中,然后内核将通过相应的IPC门(在内核和服务器之间)帮助调用系统服务器。

3.1 执行域

如上图所示,UnderBridge在MPK内存域上构建隔离的执行域,并将每个内核系统服务器限制在单独的执行域中。具体来说,UnderBridge在内核空间中构建16个执行域,并为每个域分配一个唯一的域ID(0 ~ 15)。执行域0专门用于运行(可信任的)核心内核,可以访问所有内存。

每个执行域都有一个具有特定ID的内存域,默认情况下只能访问它的私有内存域,在一个执行域中运行的系统服务器将其数据,栈,堆存储在其私有内存域中,其他服务器无法访问这些域,然而它的代码驻留在内存域0中,只能被核心内核读取。

UnderBridge确保执行域只能通过配置其PKRU寄存器来访问允许的内存域。

两台服务器之间的共享内存是通过让它们一起访问一个空闲内存域来分配的(例如,memory domain -3)。服务器和核心内核之间的共享内存是通过让核心内核直接访问服务器的私有内存域实现的。应用程序和服务器之间的共享内存是通过在应用程序的页表中映射服务器的一些私有内存来实现的,这不需要空闲内存域

3.2 IPC门

即使两个系统服务器都在内核地址空间中,当这两个服务器进行连接时,核心内核还会为他们生成一个IPC门,它驻留在内存域0中。具体来说,它首先为门分配一块内存,并将门码加载到内存中,门码很小,如图4所示。然后,它将特定的值(例如,每个门的SECRET_TOKEN)填充到门中。然后,它将门地址提供给通过这个门连接的两个系统服务器。

在IPC调用期间,ipc门将控制流从调用者传输到被调用者。更具体地说,它保存调用者的执行状态,通过设置PRKU寄存器切换到被调用者的域(这个如何实现的?),并恢复被调用者的执行状态。UnderBridge允许呼叫者和被呼叫者定义各自的呼叫约定(gates默认只保存/恢复必要状态),灵活高效。通过寄存器和共享内存传输消息都受到支持。

3.3 服务器迁移

由于MPK总共提供16个内存域,所以UnderBridge最多只能同时支持16个执行域,包括为核心内核保留的一个。

相反,UnderBridge支持服务器迁移,即在用户和内核空间之间移动服务器。每个服务器被编译为独立于位置的可执行文件,内核为不同的系统服务器分配互不相干的虚拟内存区域。每当在内核或用户进程的执行域中运行时,服务器总是使用相同的虚拟地址。因此,在用户和内核之间迁移服务器时,UnderBridge不需要进行重定位,因为服务器中的所有内存引用都是有效的(没有更改),这极大地简化了迁移过程。

将服务从内核空间迁移到用户空间需要四个步骤:

  1. 核心内核将通过暂时阻塞对服务器的新IPC请求并等待正在进行的请求的完成来等待服务器进入静止状态。
  2. 它将修改服务器的syscall页面,并使服务器稍后通过syscall指令而不是IPC门执行系统调用。
  3. 通过将服务器页表条目的域ID设置为0并刷新TLB,它将释放服务器的执行域(ID)。(为什么将服务器页表条目的域ID设置为0?0不是内核空间的吗)

如果服务器与另一个内核服务器安装共享内存,共享内存的域ID也将被释放,因为共享内存可以使用内核页表中的域ID。最后,核心内核将激活用户内服务器,并允许客户机向其发送ipc。将服务器从用户空间迁移到内核空间的工作原理与此类似。

4.在UnderBridge实施隔离

威胁模型和假设:UnderBridge的目标是实现与现有微核相同的安全保证,并继承相同的信任模型。特别地,(受信任的)核心内核被假定是没有bug的,并且正确地简单。

虽然UnderBridge利用MPK硬件实现了内存隔离,但仍然存在两个安全威胁:
第一个威胁是任意IPC问题。核心内核在内存域0中生成IPC门,以确保任何服务器都不能修改门。但是,IPC gate仍然可以被任何(内核中的)系统服务器调用,因为MPK不对执行权限强制执行权限检查。
解决方案:通过在门中添加强制身份验证,UnderBridge确保只有合法的调用者(被核心内核所允许)才能成功地使用IPC门。

第二个威胁是不受信任的内核系统服务器以监视模式(Ring-0)运行,因此,一个受损的服务器理论上可以执行任何特权指令,从而威胁到整个系统。
解决方案:利用硬件虚拟化技术,在非根模式下运行ChCore。根模式下的一个小型安全监控器通过VMExits对大多数特权指令的执行进行审计。同时,我们使用二进制重写技术来避免在关键路径上使用昂贵的VMExits。

4.1 未授权ipc预防

ipc门的职责是保存/恢复调用方/被调用方的执行上下文,并将执行域从调用方切换到被调用方。

图a中的第2-4行为wrpku准备了参数寄存器,第5行中的wrpku指令是将PKRU_CALLEE设置为PKRU寄存器,该寄存器指定每个任务的内存访问权限,因此在指令结束后,执行域将更改为被调用者的域,第6-7行是为了防止受信任的线程直接跳到第5行,如果跳到第5行了,第六行再对其进行检查,不对的话就给这服务器丢掉。
图b添加了对调用者的身份检查,由于内核创建ipc门,因此他知道哪个域是门的合法调用者,又因为每个域都有唯一的内存访问权限,因此我们将该权限作为域的标识,并通过rdpku对标识进行检查。第2行添加了一个赋予秘密令牌的指令,用在第11行,防止受信任服务器跳到第9行,从而绕过身份检查,这样在第11行进行令牌验证时就会不通过,从而被丢弃。
图c是为了消除身份验证的开销,删除了5.6.7行,添加了一个第八行,如果任何非法调用者在访问ADDR_IN_CALLER时会触发错误被捕获。

4.2 特权的剥夺

主要是取消服务器在执行域(Ring-0)运行时的特权。

4.3 安全性分析

主要分析系统服务器在内核中,可能会滥用特权指令造成的安全问题,并说明如何去防范。

限制特权内核服务器:在我们的威胁模型中,系统服务器不受信任。尽管它们可以在内核模式下运行,但在试图攻击核心内核、其他服务器或应用程序时,它们受到高度限制。假设一个内核内的服务器,可以执行任何特权指令,但是这个服务器在其他的执行域,对内存域0没有访问权限,因此不能直接访问内核的内存,并且他如果试图读或写任何不允许的内存,cpu异常会立即触发。

有四种方法可以绕过mpk强制执行的内存隔离机制:

  1. 运行禁用指令
  2. 修改PKRU寄存器,非法获取其他内存域的访问权限
  3. 通过设置CR3格式来改变页表的基地址
  4. 直接修改页表

ChCore可以抵御所有这些攻击:
第一:在加载服务器之前,ChCore使用二进制扫描/重写来消除不需要的特权指令,在运行时,安全监视器将阻止服务器执行其他私有指令。
第二:系统禁止使用两种修改PKRU寄存器的方法。
第三:恶意服务器无法修改CR3,因为二进制重写保证了任何服务器的地址空间中不存在CR3修改指令。
第四:恶意服务器无法修改页表,因为内核页表驻留在内存域0中。同时,它不能修改或添加需要先更改页表的指令。

内核内服务器之间的隔离与内核内服务器与核心内核之间的隔离相同。由于内核服务器不与用户应用程序共享地址空间,所以它也不能访问应用程序的内存。

5.实现

Harmonzing Performance and Isolation in Microkernels论文阅读相关推荐

  1. 【论文阅读】Cross-X Learning for Fine-Grained Visual Categorization

    [论文阅读]Cross-X Learning for Fine-Grained Visual Categorization 摘要 具体实现 OSME模块 跨类别跨语义正则化(C3SC^{3} SC3S ...

  2. 【论文阅读】Learning Traffic as Images: A Deep Convolutional ... [将交通作为图像学习: 用于大规模交通网络速度预测的深度卷积神经网络](1)

    [论文阅读]Learning Traffic as Images: A Deep Convolutional Neural Network for Large-Scale Transportation ...

  3. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](7)

    [论文阅读]A Gentle Introduction to Graph Neural Networks [图神经网络入门](7) Into the Weeds Other types of grap ...

  4. 【论文阅读】A Gentle Introduction to Graph Neural Networks [图神经网络入门](6)

    [论文阅读]A Gentle Introduction to Graph Neural Networks [图神经网络入门](6) GNN playground Some empirical GNN ...

  5. DnCNN论文阅读笔记【MATLAB】

    DnCNN论文阅读笔记 论文信息: 论文代码:https://github.com/cszn/DnCNN Abstract 提出网络:DnCNNs 关键技术: Residual learning an ...

  6. YOLOv4论文阅读(附原文翻译)

    YOLOv4论文阅读(附原文翻译) 论文阅读 论文翻译 Abstract摘要 1.Introduction 引言 2.Related work相关工作 2.1.Object detection mod ...

  7. GAN 生成对抗网络论文阅读路线图

    路线图按照下面四个准则构建而成:  ●  从提纲到细节  ●  从经典到前沿  ●  从通用领域到特定领域  ●  专注于最先进的技术 Generative Adversarial Networks ...

  8. [论文阅读] (13)英文论文模型设计(Model Design)如何撰写及精句摘抄——以入侵检测系统(IDS)为例

    <娜璋带你读论文>系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢.由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学 ...

  9. 深度学习论文阅读目标检测篇(四)中英文对照版:YOLOv1《 You Only Look Once: Unified, Real-Time Object Detection》

    深度学习论文阅读目标检测篇(四)中英文对照版:YOLOv1< You Only Look Once: Unified, Real-Time Object Detection> Abstra ...

最新文章

  1. Generative Adversarial Text to Image Synthesis --- 根据文字描述生成对应的图片
  2. TCP长连接,短连接
  3. 推荐系统(3)-协同过滤2-矩阵分解算法
  4. 《Vim实用技巧(第2版)》——1.4 执行、重复、回退
  5. 人脸对齐(十九)--Regressing a 3D Face Shape from a Single Image
  6. 链表实现直接选择排序
  7. 关于游戏运营策划管理相关必备知识
  8. matlab中的semilogy,MATLAB 函数Semilogy()
  9. 常见经典音频运放(一般作前级用)
  10. 更新macOS Monterey后,Flutter页面崩溃、白屏
  11. 创业公司怎么搞大数据?
  12. 《吐血整理》一篇文章教你学废Git版本管理
  13. python递归编程题_Python数据结构与算法41:递归编程练习题4:铺瓷砖
  14. stm32--JLINK调试
  15. 运行lidar_align进行全局优化时出现程序中断问题
  16. 基于单片机的遥控晾衣架电路设计(#0209)
  17. 公有继承/私有继承/保护继承的区别
  18. 常见三维文件格式之IGES
  19. codeblocks输出中文乱码解决办法
  20. 报错解决:[nodemon] app crashed - waiting for file changes before starting...

热门文章

  1. C++新特性之五:标准库中的正则表达式扩充
  2. 2022年,我是这样又折腾了一年,太多不易了
  3. InterSystems 最佳实践系列---APM – 监控 SQL 查询性能
  4. 睡眠专家的7个建议 让你一夜好眠
  5. 暖科技激活《清明上河图》,感受数字技术下的生活之美
  6. 金融科技独角兽壹账通 背靠平安集团科技发展四大优势
  7. python有一分数序列求前20项和答案_求分数序列前20项和matlab
  8. 几个html+css常用表格
  9. OpenAI 插件可以让 ChatGPT 做什么?
  10. 阿里云ECS关闭删除安骑士