轻量化能力域:分解Linux内核外文翻译资料

 2022-05-17 22:47:58

Lightweight Capability Domains: Towards Decomposing the Linux Kernel

Charles Jacobsen Muktesh Khole lowast; Sarah Spall Scotty Bauer Anton Burtsev

University of Utah lowast;Microsoft Corporation Salt Lake City, UT, USA Redmond, WA, USA

charlesj@cs.utah.edu muktesh.khole@utah.edu spall@cs.utah.edu sbauer@eng.utah.edu aburtsev@cs.utah.edu

Abstract

Despite a number of radical changes in how computer systems are used, the design principles behind the very core of the systems stack—an operating system kernel—has remained unchanged for decades. We run monolithic kernels developed with a combination of an unsafe programming language, global sharing of data structures, opaque interfaces, and no explicit knowledge of kernel protocols. Today, the monolithic architecture of a kernel is the main factor un- dermining its security, and even worse, limiting its evolution towards a safer, more secure environment. Lack of isolation across kernel subsystems allows attackers to take control over the entire machine with a single kernel vulnerability. Furthermore, complex, seman- tically rich monolithic code with globally shared data structures and no explicit interfaces is not amenable to formal analysis and verification tools. Even after decades of work to make monolithic kernels more secure, over a hundred serious kernel vulnerabilities are still reported every year.

Modern kernels need decomposition as a practical means of con- fining the effects of individual attacks. Historically, decomposed kernels were prohibitively slow. Today, the complexity of a modern kernel prevents a trivial decomposition effort. We argue, however, that despite all odds modern kernels can be decomposed. Careful choice of communication abstractions and execution model, a gen- eral approach to decomposition, a path for incremental adoption, and automation through proper language tools can address complexity of decomposition and performance overheads of decomposed ker- nels. Our work on lightweight capability domains (LCDs) develops principles, mechanisms, and tools that enable incremental, practical decomposition of a modern operating system kernel.

Categories and Subject Descriptors D.2.12 [Software Engineer- ing]: Interoperability—interface definition languages; D.4.6 [Op- erating Systems]: Security and Protection; D.4.7 [Operating Sys- tems]: Organization and Design

General Terms Design, Security

Keywords decomposition, Linux, microkernels

  • Muktesh Khole contributed to the research described herein while he was a graduate student at the University of Utah.

c Charles Jacobsen, Muktesh Khole, Sarah Spall, Scotty Bauer, and Anton Burtsev, 2015. This is the authorrsquo;s version of the work. It is posted here by permission of ACM for your personal use. Not for redistribution.

Q

The definitive version was published in Proceedings of the 7th Workshop on Pro- gramming Languages and Operating Systems (PLOS), Farmington, PA, Nov. 2013, http://dx.doi.org/10.1145/2818302.2818307

Introduction

Over the last decade, attacks on computer systems have undergone major changes in terms of exploit discovery tools, attack complexity, and targeted parts of the system. Attackers routinely use fuzzing tools [42, 43], and attack every possible layer of the kernel: de- vice drivers, the network stack, the stack of USB protocols, file systems, and virtual machine monitors. Even though a number of static [2, 10, 18] and dynamic (stack guards [11], address space randomization [32], executable space protection, control flow in- tegrity [1, 19], code integrity checks [48]) mechanisms have been invented to protect execution of the operating system kernel, at- tackers come up with new ways to bypass these protection tech- niques [32, 45, 46, 49]. Modern kernels remain vulnerable [8].

Lack of isolation implies that in a modern system, an attacker is one kernel vulnerability away from taking control over the entire machine. A successful attack on any of the kernel subsystems pro- vides the ability to make the threat persistent in the face of reboots, conceal it from the user and anti-virus security tools and establish a platform for compromising local applications, collecting sensitive financial information and user credentials, mounting attacks on the network hosts, and establishing a distributed, peer-to-peer command and control infrastructure. In 2014, the Common Vulnerabilities and Exposures database lists 133 Linux kernel vulnerabilities that allow for privilege escalation, denial-of-service, and other exploits [13]. This number is consistent across several years [8, 12].

Why do we run monolithic kernels? The reason is twofold. First, for many years, isolation was prohibitively slow due to architectural limits of uniprocessor machines. While significant progress in un- derstanding the costs of inter-process communication mechanisms has been made (see [4] for a historical overview), context

全文共40754字,剩余内容已隐藏,支付完成后下载完整资料


轻量化能力域:分解Linux内核

摘要:

尽管计算机系统的使用方式发生了一些根本性的变化,但系统堆栈的核心-- 操作系统内核 -- 背后的设计原则几十年来一直保持不变。我们运行的操作系 统内核是由不太安全的编程语言、全局数据结构共享、不透明接口和内核协议组合开发的单一内核。如今,内核的单片体系结构是威胁其安全性的主要因素,更糟糕的是,它限制了它向更安全,更安全的环境发展。内核子系统之间缺乏隔离性,攻击者可以利用单个内核漏洞来控制整个机器。此外,具有全局共享数据结构的、没有明确界面的、复杂的单片代码不适用于标准的分析和验证工具。即使经过几十年的努力使单片内核更加安全,每年仍有超过100个严重的内核漏洞被报告。

现代内核需要分解为一种确定个人攻击影响所对应的各个部分。历史上,分解的内核速度过于缓慢。今天,现代内核的复杂性抑制了一个看上去微不足道的分解工作。然而,我们认为,所有的现代内核都可以被被分解。通过仔细选择通信抽象和执行模型,采取通用的分解方法和逐步求精的途径,并且通过恰当的语言工具实现自动化,就可以解决复杂的内核分解和性能开销问题。我们在轻量级能力域(LCD)方面的工作中开发了一套原理、机制和工具,能够对现代操作系统内核进行渐进且实用的分解。

  1. 简介

在过去的十年中,计算机系统的攻击在漏洞发现工具,攻击复杂性和攻击目标几个方面发生了重大变化。攻击者经常使用模糊工具,攻击内核所有可能被攻击的层面:设备驱动程序,网络堆栈,USB协议栈,文件系统和虚拟机监视器。尽管发明了大量的静态和动态(堆栈守卫,地址空间随机化,可执行空间保护,控制流程完整性,代码完整性检查)机制来保护操作系统内核的执行,研究人员还是找到了了绕过这些保护技术的新方法。现代内核仍然容易遭受攻击。

缺乏隔离意味着在现代系统中,攻击对象是一个无法控制整个机器的内核漏洞。对任何内核子系统的成功攻击,都可以使威胁在重启后仍然持续存在,将其从用户和反病毒安全工具中隐藏起来,建立一个平台来损害本地应用程序,收集敏感的财务信息和用户凭证,也可以在网络主机上发起攻击,建立分布式对等命令和控制基础设施。 2014年,通用漏洞披露数据库列出了如允许扩大权限,拒绝服务等133个Linux内核漏洞。这个数字在几年间都差不多。

那我们为什么要运行单片内核呢?原因有两方面。首先,多年来,由于单处理器机器的架构限制,隔离速度非常缓慢。虽然在了解进程间通信机制的开销方面取得了重大进展,但产品硬件的上下文切换开销仍然很大。多年来,单片内核仍然是保证性能的唯一实用设计选择。其次,单片且共享内存的内核其复杂性抑制了内核分解工作的研究。分解需要分隔一些子系统,这些子系统使用丰富的接口、复杂的交互模式,它们紧密连接,优化良好。由于缺乏适当的抽象和自动化工具,一些分解内核代码的尝试均以失败告终。

听起来可能不可思议,但我们认为,现代内核可以被分解。首先,分解是由近期的硬件发展驱动的。今天,我们运行带有集成内存和PCIe总线控制器的多核CPU,大容量最后一级缓存以及低延迟网络和存储接口。传统内核的开销已经极大影响了I/O和计算密集型应用的性能表现。需要对网络和基于PCIe的闪存存储设备进行无中介,低延迟访问,对CPU核心的未中断访问,最大限度地减少高速缓存未命中和内存访问次数的能力,对接收数据包和流转向机制的访问,以及避免上下文切换和调度开销的能力,从而促进某种形式的内核分解,或者至少要使得系统内核中的控制层和数据层之间是分开的。其次,经过几十年旨在模块化内核组件工研究工作中的努力,内核子系统耦合性较差,接口相对简洁,而且大多数复杂性的东西都封装在各个子系统内。通过适当的语言工具和将代码拆分的一般方法,分解成独立的子系统是可行的。

我们开发出了轻量级能力域(LCD),这是一个分解Linux内核的一般框架。我们做出以下工作。首先,为了实现实际的增量分解,我们扩展了一个通用嵌入式微内核接口的产品内核。这个接口使分解的子系统与未分解的内核的其余部分并行执行,并为分解子系统的开发提供了一个便捷的执行环境。其次,我们开发分解模式—它是分解内核中常见代码模式中一般原则和抽象的集合。第三,我们设计了一个接口定义语言(IDL),旨在对现有的内核代码进行最小限度的改动,实现自动分解。 IDL旨在模拟共享内存,单磁盘环境,无共享孤立的系统。最后,我们在现代硬件上使分解环境高效:我们将快速跨核心异步通信与轻量级执行模型相结合,该模型支持不修改内核代码的可组合异步编程。

  1. 分解策略

试图一次分解整个系统是一种方法,可是这将快速产生过时淘汰的代码。相反,我们将工作重点放在开发一个平台上,该平台1)允许逐步分离隔离一个内核子系统,2)可以应用于快速拓展的内核代码库,3)为开发实用,高效的系统奠定基础。

增量分解:为了提供增量分解的路径,允许并行执行遗留单片代码和隔离子系统,我们在商用Linux内核中嵌入了一个小型微内核(图1)。 LCD微内核与嵌入Linux内核的KVM虚拟机监视器相似。然而,我们的目标是提供一个更通用的界面,适用于开发语义丰富的分解子系统,而不是虚拟化CPU和I / O设备的低级界面。微内核实现了最少的接口:线程,同步通信,性能访问控制和内存管理。

LCD

Domains

NFS

VFS

ext3

TCP/IP

Disk Driver

Memory Mngmt

NIC

Driver

Linux Kernel

Microkernel

Auto-generated Glue Code

Unmodified Code

图1. LCDs架构。 LCD作为嵌入Linux内核的微内核运行。 隔离的子系统通过能力控制的IPC机制进行通信。

拆分代码:我们制定了一套分解模式-设计和开发的原则,旨在将现有单片代码的典型模式分解为独立的子系统。数据结构和产品单片内核的代码被设计为在共享内存环境中运行。内核通过跨子系统传递对象来共享其组件的控制信息和状态。在分解的环境中,每个内核子系统都在其自己的系统状态版本上运行。此状态在跨子系统调用时同步。我们开发技术用于透明地同步对象,并在孤立的无共享域之上维护全局状态的视图。我们的分解模式覆盖了内核代码的常用模式:全局变量,导出和导入函数,函数指针,数据结构和数据结构的层次结构。

接口定义语言: 分解模式提供了将单片代码分开的一般方法。为了实现这一任务的自动化,我们依靠一种旨在生成跨域能力调用和对象同步代码的接口定义语言(IDL)。我们的IDL编译器的目标是确保与跨越孤立域边界有关的大部分代码是自动生成的,并且与未修改的遗留代码向后兼容,即隔离的子系统不需要对它们的代码进行大的改动,相同的代码可以凭分解配置在单片机上运行。 IDL描述了跨LCD域和内核非隔离部分的接口。有两个目标驱动着LCD的IDL编译器的设计。首先,IDL生成的代码要与内核源代码兼容:首先我们为内核函数生成代理和存根代码,同时保留函数签名,以便它可以与未修改的内核模块的代码链接,并在稍后加载进独立的域。其次,LCD的IDL为指定内核数据结构如何在隔离子系统间同步提供了明确的支持。

能力访问控制:我们创建能力的动机是双重的。首先,我们使用能力来有选择地限制隔离子系统的权限。每个隔离的子系统都拥有完成其任务所需的最小权限子集。因此,单个内核子系统受损的影响仅限于子系统可以访问的一组资源。LCDs借用对象能力语言和能力微内核的想法。在LCD中,能力是受微内核保护的数据结构中的条目,其可以通过本地名称从隔离代码引用。在微内核中,每个能力描述由微内核或Linux内核实现的一个对象。其次,LCD中的能力实现了跨域指针的概念,使我们能够跨孤立域安全地引用对象。与LCD微内核类似,每个隔离域为其管理的对象实现了能力地址空间,例如,文件系统域通过能力来解析文件对象。在这个级别上,能力允许孤立的域在其权限内的其他域内引用对象。

可组合的异步I/O:传统上,内核使用线程作为主要执行模型,同步过程调用作为主要通信机制。单个执行线程通过一系列同步函数调用跨内核子系统移动。控制信息和数据作为全局共享数据结构的层次结构通过子系统参考传递。可惜的是,同步函数调用在分解的环境中效果不好。 尽管在理解同步IPC设计方面有许多改进,但硬件上下文切换机制并没有得到更快的发展。 同步函数调用仍然非常慢。 我们围绕CPU跨核LCD调用的思想和异步执行模型设计LCD。 每个LCD都运行在一组专用CPU内核上。 我们设计和构建了一个高效的异步跨内核通信机制,并在异步消息传递之上模拟传统的同步函数调用。 为了将阻塞的异步消息与现有的同步代码集成在一起,LCD实现了一个协作执行环境,能够以本地代码的形式实现上下文切换异步线程

  1. LCDs架构
    1. LCDs微内核

LCD微内核遵循L4微内核系列的设计。微内核接口的两个部分对LCD架构至关重要。与seL4 类似,LCD微内核实现了一个纯粹的基于能力的IPC,可明确控制隔离子系统间的所有通信。这个同步IPC用于请求微内核资源,特别是为将来的异步通信建立共享内存区域。我们实现了能力地址空间和能力派生树。

我们做出几个实用的设计选择来简化开发。虽然表现出非常缓慢的上下文切换性能,但我们仍然选择硬件来辅助虚拟化进行隔离,因为它更容易编程,例如处理隔离域内外的低级硬件条件。通过将LCD作为内核模块开发,我们能够重用Linux内核提供的链接和加载功能。该模块映射到来宾虚拟地址空间中的相同位置,因为它已映射到主机(位于高地址范围内),因此我们无需在模块中重新定位符号。我们进一步依靠Linux内核线程和Linux调度程序来调度微内核线程。

    1. 接口定义语言

LCD的IDL编译器负责生成域间通信和同步代码,确保原始单片代码的分解透明性。 IDL的核心是调用隔离子系统(远程函数调用)的定义,以及用于同步内核数据结构的规则。

函数: 我们的主要目标是IDL编译器生成具有与单片内核中使用的函数相同签名的代理/存根函数。 例如,要导出具有以下签名的函数:

int register_filesystem(...);

LCDs require the following IDL definition of an interface:

interface filesystem (capability cap = null) {

rpc int register_filesystem(capability cap, ...);

}

该函数定义扩展了一个能够明确命名实现接口的汇合点或异步通道。 为了提供与未修改的代码的兼容性,该接口被声明为具有可选参数:实现虚拟文件系统接口的汇聚点的能力。 接口的实例可以声明为接口的能力:

interface filesystem (vfs);

从接口定义和上面的声明中,我们生成以下向后兼容的存根:

int register_filesystem(struct file_system_type fs) {

lowast;

return register_filesystem_callee_stub(vfs, fs);

}

其中vfs是在LCD初始化期间指定的,这在下面描述。

初始化LCD IDL支持声明由LCD输入和输出的接口。 例如,运行文件系统并需要访问虚拟文件系统和块设备接口的LCD可能使用IDL支持的以下配置文件:

module fs {

require capability vfs; require capability bdev;

}

IDL生成两个函数:一个用于主内核创建一个新LCD,另一个函数在启动期间在内部初始化LCD。

    1. 分解模式

LCDs旨在实现隔离子系统不共享状态的环境。 相反,多个孤立的子系统维护它们自己的私有对象层次并在函数调用时显式同步它们。 这个假设是安全性的关键 - 一个受损子系统不能通过修改共享对象来影响其他人的执行。

对象同步:Linux内核中的典型模式是通过跨子系统的引用来传递对象的。 但是,在LCD的情况下,分解的子系统不相互信任。 为了确保隔离,每个LCD都维护每个对象的私有卷影副本。 LCD允许显式控制一组对象字段,这些对象字段将在函数调用时通过保护机制传递并返回。

// Projecting two fields of the super_block data structure projection super_block lt;struct super_blockgt; {

[out,in

全文共9752字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[12214],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。