Intel SGX入坑必读——《Intel SGX Explained》(个人翻译,持续更新中)

article/2025/9/21 2:57:21

写在最前

入坑Intel SGX之前先打好基础。《Intel SGX Explained》就是入坑必读之一,有助于理解Intel SGX的原理。这里仅作个人翻译,便于加深理解,也方便感兴趣的小伙伴一起学习交流。
原文下载地址:《Intel SGX Explained》原文


摘要

Intel SGX是Intel架构上的一组扩展,用于在可能出现恶意特权软件(如内核或系统管理程序)的计算机上为安全敏感运算的执行提供机密性和完整性保障。

本文主要基于三个SGX专利、Intel开发者手册(已取代旧版的手册)、和Intel在ISCA 2015年发布的指南和另外两个SGX专利对Intel SGX进行介绍和分析。这些论文、参考文献、手册以及指南作为主要的数据来源,专利仅作为补充信息使用。

本文不再重复另外两篇已在本文初版之后发表论文的内容。
本文的主要贡献在于,首先,总结了针对Intel架构和微指令架构上的细节,帮助读者理解Intel SGX;其次,详实地将SGX相关的公开资料进行整理;再次,提供了一些关于SGX未公开技术细节的合理推断;最后,分析了SGX的安全属性。

1 概述

安全远程计算(如图1所示)是一个如何在被不可信方拥有和维护的远端计算机上运行应用程序时在一定程度上保证机密性和完整性的问题。在一般情况下,安全远程计算是无解的。全同态加密可以为部分特定的计算提供解决方案,但从性能表现上看并不实用。
图1Intel SGX是可信计算领域最新的研究成果,旨在利用可信硬件解决在远端计算机上进行安全远程计算的问题(如图2所示)。可信硬件建立一个安全容器,使用远程计算服务的用户将所需的数据和计算操作上传到这个安全容器中。可信硬件保护其中进行运算的数据的机密性和完整性。
图2与其前身TPM和TXT类似,SGX依赖于软件验证。通过认证(如图3所示)向用户证明其正在与由可信硬件支撑的安全容器中运行的特定的应用程序进行通信。(用于认证的)证明是一个对安全容器内容签发的密码学签名。远程计算机的拥有者可以将任意应用程序加载到安全容器中,但是使用远程计算服务的用户将拒绝将她的数据载入一个哈希值与期待不符的安全容器中。

使用远程计算服务的用户使用可信硬件生产商创建的背书证书来验证产生签名的认证密钥。证书规定认证密钥只对可信硬件可见且仅作认证使用。

SGX从众多处理器产品中脱颖而出,其原因是,认证所覆盖的代码处于在系统中受硬件保护的可信计算基(TCB)中。在最初TPM的设计中,认证覆盖所有运行在计算机上的代码,而TXT的认证则覆盖所有VMX虚拟机。Intel SGX,一个enclave(安全容器)只包含计算涉及的私有数据和操作计算的代码。

例如,一个云服务可以接受用户上传的经过加密处理的图像并对其进行机密的医学图像处理。用户可以将加密密钥发送给在enclave内部运行的应用程序。enclave将包含解密图像、图像处理算法和加密图像处理结果的代码。这些代码接收由用户上传的加密后的图像,图像的存放将在enclave外部进行。
一个启动了SGX的处理器通过将enclave内部的代码和数据与外部环境(包括操作系统、系统管理软件以及其他连接到系统总线上的其他硬件设备)隔离实现对enclave代码和数据的完整性和机密性的保护。同时,SGX模型仍兼容Intel体系架构中传统的软件分层,在这一体系架构中,操作系统内核和系统管理软件管理计算机资源。

本文针对最原始版本的SGX,即SGX 1,展开讨论。尽管SGX 2为enclave开发者引入了许多有价值的改进,但从设计和实现角度来看,这些改进仍然是较小的增量式的改进。在充分理解SGX 1背后的原理和安全属性后,读者将可以根据Intel参考文档轻松掌握SGX 2所带来的一系列变化。

1.1 SGX Lighting Tour


(20210320更新)

SGX 留出了一部分称为处理器保留内存(Processor Reserved Memory,PRM)的内存空间。CPU将阻止所有非enclave程序(包括内核、系统管理软件、系统管理模式访问、直接内存访问)对PRM的内存访问。

PRM管理Enclave Page Cache(EPC)。EPC由众多存储了enclave代码和数据的4KB页组成。不可信的系统软件负责将EPC分配给相应的Enclave。CPU跟踪EPC页的状态并将这些状态信息记录在Enclave Page Cache Metadata中,以保证每个EPC页与相应的enclave保持正确的映射关系。

初始化代码和数据将由不可信的系统软件加载到Enclave中。在加载阶段,系统软件将询问CPU并将数据从不受保护的内存(PRM之外的内存空间)拷贝到EPC页中,并将页对应分配给已经成功初始化的enclave。enclave的初始状态对系统软件来说是已知的。

所有enclave页都加载到EPC后,系统软件会通知CPU将这个enclave标记为“已初始化”。此时,应用程序将会在enclave中运行相应的代码。在enclave初始化结束后,以上提及的加载方法将失效。
enclave加载时,CPU会计算这个enclave内容的密码杂凑值。当enclave完成初始化时,这个hash操作也随之结束,最后形成的hash值将作为enclave的度量hash值。

远程终端通过软件认证(software attestation)确保自己正在和一个拥有特定度量hash值并运行在安全环境中的enclave进行通信。

执行流只能通过特殊的CPU指令进入enclave中,这个转换过程类似于从用户模式切换到内核模式。enclave总是在保护模式下,即ring 3,,运行,并遵守OS内核和系统管理软件设置的地址转换规则。

为防止隐私数据泄露,运行在enclave模式下的CPU将不会直接响应中断(interrupt)错误(fault)或者VM 退出操作。相反,CPU将会首先执行一个异步的enclave退出(AEX)操作,从enclave模式切换到ring 3模式,再响应中断、错误或VM退出。AEX的实现原理是,CPU将其状态保存在一个事先定义好的enclave区域中,并将控制权交付给一个已经预先声明好的enclave外部指令,随后用一堆无序数填充CPU寄存器。

给enclave分配EPC页的工作由OS内核(或管理程序)完成。OS通过特殊的ring 0CPU指令将分配决定告诉SGX实现(?有点没懂,这里指的是SGX application还是SGX CPU?)。OS也可以通过特定的CPU指令将EPC页驱逐到不受信任的DRAM中,并在之后再将这些页加载进来。SGX利用密码手段保证这些驱逐EPC页在不可信内存空间中的机密性、完整性和新鲜性。

1.2 Outline and Troubling Findings

考虑到要深入理解Intel SGX技术安全属性的原理需要大量背景知识,而这些背景知识的来源异常分散,所以本文很重要的一部分工作是对预备知识进行概括。

第2章概述了Intel架构的一些相关知识以及一些Intel处理器最新的一些微指令架构属性。第3章简述支持可信硬件系统的安全组件,包括密码学工具和相关的攻击。最后,第四章简要介绍创建SGX所依赖的上下文结构的可信硬件系统。

在对背景知识有一个粗略的认知后,第5章将提供一些SGX开发的细节,这些内容主要来源于开发者手册。

第6章分析了其他的公开信息,例如一些SGX相关的专利,以填补SGX介绍文档中缺失的细节。本章着眼于调研SGX安全属性的细节,这些信息会在本文剩余部分涉及到。这部分调研概述了一些SGX安全保障书中令人困扰的内容缺失,以及只能从其他Intel的信息中得出结论的方面。

整个安全分析中最令人头疼的部分也许正是Intel为SGX增加的启动控制,强制所有计算机拥有者必须获得第三方同意方能运行enclave。5.9节说明了在仅有的公开文献中,启动控制是一种许可机制,要求软件开发者必须与Intel达成商业协议才能在开发程序时使用SGX提供的保护措施。所有官方文档都谨慎地避开了这个问题,只在Intel SGX的一些专利中有所稍稍提及。这些专利透露了这种许可计划的存在。

这种许可机制问题目前也许无关痛痒,因为我们的安全分析显示,考虑到SGX保障存在的各种限制,对安全持谨慎态度的程序开发者压根儿就不会在安全远程计算中毫无顾忌地依赖SGX。同时,如果SGX能够开发出更好的安全特性,上述许可证方案将会变成一个大问题,毕竟Intel在桌面和服务器处理器市场中占有几乎垄断的市场份额。具体来说,这种许可证限制将赋予Intel极大的权利决定未来依赖云计算的产业的成败。

2 计算机架构背景知识

本章主要笼统地介绍Intel运用最广的处理器的架构原则以及这些处理器上运行的系统安全属性背后的原理。如非特别说明,这部分信息都是从软件开发手册中总结而来。

分析一个软甲系统的安全性必须理解软件执行环境所有组成部分之间是如何交互协同的。所以本章会特别长。我们尽量避免面面俱到地介绍安全内容,所以有x86架构背景的读者可以直接跳过本章,在必要时再倒回来查看。

我们用Intel processor或者Intel CPU来分别指代Intel Core系列的服务器或桌面版本的处理器产品。考虑到空间限制和阅读观感,我们忽略其他Intel处理器产品,比如嵌入式系列产品或者已经废止的安腾系列产品。相应地,Intel computer和Intel system分别指代围绕Intel core处理器建立的计算机系统。

本文中Intel architecture指代Intel SDM中描述的x86架构。为了支持从1990年遗留下来的众多直接在CPU上运行的软件,x86架构异常复杂。限于篇幅和观感,本文只涉及现代64位软件可见的架构。
本章所介绍的64位版本的x86架构实际上是由AMD发明的,所以也被记作是AMD64、x86_64或者x64。Intel架构已经明确我们主要关注Intel芯片上的架构实现并希望可以理解Intel SGX设计者的思路。

2.1 Overview

一台计算机的主要资源包括内存和处理器。在Intel计算机中,DRAM芯片提供内存,一个或多个CPU芯片组成逻辑处理器。这些资源将由系统软件进行管理。一台Intel 计算机常运行两种系统软件,一种是操作系统,一种是系统管理程序。

Intel架构为支持多程序实例运行设计,这些程序实例成为进程。操作系统将计算机资源分配给所有运行中的进程。服务器计算机,尤其处于云计算环境中的服务器计算机,可能同时运行多个操作系统实例。这是通过系统管理软件为每个运行的实例分配相应的计算机资源份额实现的。

系统软件使用虚拟化技术将其管理的每个程序分片与其他运行中的软件隔离开来。这种隔离机制是将软件复杂度管理在可控范围内的关键。同时,应用程序和操作系统开发者仅关注他们的软件,忽略和其他软件的交互。

虚拟化技术的核心是地址转换,让软件有独占计算机内存的感觉。地址转换提供的隔离机制可以有效防止恶意软件对其他软件造成危害,如篡改内存内容等。

虚拟化技术的另一个关键技术是通过CPU实施的软件特权分级。硬件层面的特权分离保证了任意软件无法通过干扰系统软件来间接破坏其他软件。

进程通过创建操作线程来表达对计算资源的需求,这些需求由操作系统分配给逻辑处理器。一个线程包含了执行上下文,这是执行运算必须的信息。例如,执行上下文结构保存了处理器处理的下一条指令的地址。

操作系统给每个进程一种计算资源无限的感觉,并根据进程创建的线程数量成倍地提供可用的逻辑处理器。现代操作系统实现抢占式多线程机制,逻辑处理器可以在极短的时间内在多个线程之间切换。分配给逻辑处理器的线程变化通过执行上下文切换实现。

系统管理软件为每个操作系统展示定量的虚拟处理器,并且使用上下文切换的方式实现为虚拟处理器上运行的多个客户机提供相应的逻辑处理器。

逻辑处理器中的执行核心处理指令和数据的速度将远远高于DRAM。现代计算机中许多复杂设计都是为了弥补这个速度差异。最近的Intel CPU依赖于超线程、无序执行和缓存机制来解决这个问题,但同时对安全带来了一些影响。

Intel处理器包含多级内存,这些内存的存取速度快于DRAM,但存储量级远小于后者。最快的中间存储器是逻辑处理器的寄存器文件。其他中间存储器称为缓存,Intel架构要求应用软件显式地管理好作为高速暂存空间的寄存器文件。同时,缓存将静默地加速DRAM请求速度,这些过程通常对于应用软件来说是不可见的。

Intel计算机拥有多个逻辑处理器,也因此拥有分散在CPU芯片上的多个缓存。在多包系统中,缓存将会分散在多个CPU芯片上。所以,Intel系统使用缓存一致性机制保证所有的缓存对DRAM保持同一视图。得益于缓存一致性机制,开发者在开发软件时不会意识到缓存的存在,而程序可以在分布式缓存设计下正确运行。但是,缓存一致并不会覆盖到地址转换使用的专用缓存,系统软件必须采取其他措施保证这些缓存的一致性。

处理器之间的通信通过外界的输入输出设备来完成,如网络接口卡和显示适配器等。在概念上,CPU和DRAM芯片、输入输出设备通过系统总线进行通信。

根据Intel架构开发的应用软件与输入输出设备通过I/O地址空间和内存地址空间进行通信,其中,内存地址空间最初用于访问DRAM。系统软件必须对CPU缓存进行配置,使得CPU缓存可以识别用于访问I/O设备的地址空间。设备通过中断通知CPU发生了某事件,这个操作将导致逻辑处理器停止处理当前线程,并唤醒一个特殊系统软件的处理句柄。

由于要支持不同的外设以及大量架构各异的操作系统,Intel系统初始化流程异常复杂。初始化流程对于Intel计算机的安全加固来说是个巨大的挑战,埋下了许多安全隐患。

Intel工程师们使用处理器微指令设备对Intel架构进行了更为复杂的实现。微指令对于软件开发者而言是完全不可见的,设计细节基本不公开。然而,为了评估这以结构上改进的可行性,我们必须要能够区分使用微指令实现和纯硬件实现方式之间的区别。

2.2 Computational Model

如图所示,本章拼凑除了一个高度简化的Intel架构的计算机模型。这个简化模型旨在帮助读者理解本文其他部分所使用的到的基本概念。下一章会逐步将简化模型细化为对Intel架构的详细描述。

在这里展示的所有模型组成部分都来源于文献[165],这篇文档对计算机系统进行了概述,并重点关注用于开发软件系统的关键技术。
内存是一存储单元集合,地址是从0开始的自然数,实现概述如图所示。内存的一个特性是,通过地址读取的某个内存单元结果必须与最近写入这个内存单元的内容一致。

逻辑处理器从计算机内存中反复读取指令并执行,具体流程如图所示。

处理器内置了内存,称为寄存器文件。这个寄存器文件由惊天随机访问内存(Static Random Access Memory)单元组成,通常记作寄存器。寄存器的速度明显快于DRAM,但也比后者贵得多。

一条指令根据输入计算并将结果存储到输出位置。处理器寄存器为大部分的指令的输入输出准备执行上下文。比如ADD、RDX、RAX、RBX用于运行整数加法运算,输入放在RAX和RBX中,结果存储放在输出寄存器RDX中。

这里(图6)提到的寄存器是指令指针(RIP),它保存了下一条处理器执行的指令的地址,堆指针(RSP)则存放的是用于支持寄存器外设运行的call堆结构最顶端元素的内存地址。其他执行上下文寄存器将会在2.4和2.6节中进行介绍。

一般情况下,处理器反复从RIP中存储的内地址中读取指令并执行,随后将RIP更新为下一条指令的地址。与RISC结构不同,Intel架构使用大小可变的指令编码方法,所以内存知道读入指令时才知道这条指令的实际长度。

在执行一条指令时,如果未满足指令执行的前提条件,处理器将发生错误。错误发生时,指令的执行结果将会被认为是错误的而不会被存储到输出位置中。例如,执行整数除法时如果被除数为0,则引发除法错误。

当指令结果出现错误,处理器将停止当前执行流,并将错误句柄记录在2.8.2中。简而言之,处理器首先会基于错误原因查找处理这个错误的代码,并将处理环境设置为处理错误的句柄。
处理器和内存以及处理器之间通过系统总线连接。系统总线是一个广播网络结构(如图7所示)。

每个时钟周期中至多只有一个设备连接到地址总线并向所有连接在总线上的设备发送消息。每个连接到系统总线上的设备会将操作码和发送消息的地址进行解码,并忽略不需要它参与的消息。

例如,当一个处理器想要读取内存位置的时候,它将会发送特殊的操作码和想要访问的内存位置对应的总线地址。内存在总线中看到这条消息后将会执行一个读指令。随后,内存会向相同的地址响应一条标记了READ-RESPONSE操作码的消息,并将数据设为读操作的结果。

计算机与外界通过I/O设备进行通信,比如键盘、显示器、网卡等。这些都将连接到系统总线上。设备主要响应来自处理器的请求,同时也具有向处理器发起中断请求来通知外部世界发生事件的能力。比如用户敲击键盘将引发中断。

中断的引发将在2.12节详细讨论。在现代计算机系统中,设备通过向一个特殊的总线地址发送消息来引发中断。中断被视作与错误类似的硬件异常并以相似的手段进行处理。

2.3 Software Privilege Levels

如图8所示,在IaaS类型的云环境中,如Amazon EC2,CPU集群将软件运行在四个不同的特权等级中。高特权等级的能力总大于第特权等级,所以高特权等级的软件可以任意读写低特权等级的软件。因此,软件模块将会被任一运行在高特权等级的软件攻击。软件模块默认无条件信任下层高特权等级软件,而系统安全分析必须将运行在各个特权等级中的软件的安全。

主板生产商使用系统管理模式(SMM模式)实现风扇管理、深度睡眠,或对缺失硬件进行模拟。因而电脑固件中的引导软件负责设置DRAM中的一段连续的空间,以及将所有需要运行在SMM模式中的代码加载到SMRAM中。SMRAM受到特殊的硬件保护,可以防止更低特权等级的软件以SMM模式对其进行访问。

IaaS云服务提供商允许用户在虚拟化环境中运行他们自己的操作系统。Intel硬件虚拟化技术,或称作虚拟机扩展(VMX)增加了对系统管理软件的支持(或者如Intel文档中称为虚拟机监控)系统管理软件运行在一个比操作系统更高的特权等级中(VMX root模式),负责跨操作系统分配硬件资源。系统管理软件用CPU硬件虚拟化特性令每个操作系统相信自己独占一台计算机(也就是一台虚拟机)。系统管理软件代码都运行在VMX root模式下的ring 0级别中。

运行在VMX root模式下并利用硬件虚拟化技术的系统管理软件性能更佳,代码库也比基于二进制转换的系统管理系统的更小。

系统研究文献建议将操作系统分解为一个小内核,这个内核运行在更高的特权等级(称作内核模式或管理员模式)中,在Intel架构中则是运行在ring 0层。内核分配计算机资源给各个系统组件,如各种设备驱动和服务。这些系统组件将运行在更低的特权等级中。然而,考虑到性能(在不同ring层中运行一个程序会比调用处于同一特权等级的代码慢),主流操作系统有大量运行在ring 0层的代码。这个庞大的内核包括了设备驱动、文件系统代码、网络栈以及视频渲染功能等。

应用程序代码,如浏览器或者游戏客户端,将会运行在最低特权等级中,也就是常说的用户模式(对应Intel 架构中的ring 3层)。在IaaS云环境中,由用户提供的虚拟机镜像将运行在非VMX root模式中,所以内核将运行在非VMX root模式的ring 0层,应用程序代码运行在非VMX root 模式的ring 3层。

2.4 地址空间

遵循Intel架构规则的软件使用四种不同的物理地址空间访问计算机资源。这些地址空间在内容和功能上会有部分重合,可能会引起误解。本节从高度抽象的角度介绍Intel 架构中的物理地址空间,着重介绍它们各自的功能以及管理方法。

寄存器空间由访问CPU寄存器文件的寄存器组成,是唯一以CPU时钟频率工作的内存,不会造成任何延迟。寄存器空间由CPU架构定义,并记录在SDM文档中。

一些寄存器,如控制寄存器,在配置CPU操作中起到特殊的作用。比如,CR3在地址转换中扮演着核心角色。这些寄存器只能由系统软件访问。其他寄存器为应用程序的运行准备好上下文结构,这个上下文结构本质上是一个高速暂存空间。这些寄存器可以访问所有特权等级空间,具体的分配由软件编译器管理。许多CPU指令只能操作寄存器中的数据,并且只能将结果存储在寄存器中。

内存空间,一般称为地址空间或者物理地址空间,包含了64GB到1TB不等的地址。内存空间起初用于访问DRAM,但也用于内存映射的设备之间的通信,设备从系统总线中读取内存访问请求并将给CPU的应答写入内存。一些CPU指令将从内存空间中读取它们的输入,或者将结果存储在内存空间中。

一个更为人熟知的内存映射的例子是,一台计算机启动时,4GB标记之下的64KB内存地址将会被映射到一个闪存设备中,用于支撑引导计算机第一阶段的代码。

在引导过程中,由计算机固件分割设备与DRAM之间的内存空间。包括主板专用代码在内的系统软件有时候将修改内存空间划分。如第2.5节所介绍的,OS内核依赖于地址转换来控制应用程序对内存空间的访问。系统管理软件也依赖相同的机制控制客户操作系统。
I/O空间由2^16个被称为接口的I/O地址组成。I/O接口专用于设备通信。CPU为读写I/O地址提供特殊的指令。I/O接口遵循规范或实际应用标准进行分配。例如,接口0xCF8和0xCFC总是用于访问PCI express配置空间。

CPU为系统软件提供了细粒度的I/O 访问权限机制。然而,现代内核直接进制应用程序访问I/O空间以防止应用软件bug带来的安全隐患。

模型专用寄存器(Model-Specific register,简称MSR)空间包含了2^32个用于执行CPU操作的MSR,使其语义成为Intel架构的一部分。例如,架构MSR 0x10支撑了一个高分辨率单调递增的时间戳计数器。

CPU为读写MSR空间提供了指令。这些指令只能由系统软件使用。应用程序通过一些指令也可以访问到一些MSR。例如,应用程序可以通过RDTSC和RDTSCP指令读时间戳计数器,这对度量和优化软件大有裨益。

2.5 地址转换

系统软件依赖CPU地址转换机制来实现对特权等级更低的软件的隔离。几乎所有的安全的体系结构设计都会修改地址转换机制。在这里我们总结Intel架构中与系统安全属性建立相关的地址转换特性,如果读者有兴趣可以自行阅读[108]以获取更多关于地址转换的内容。

2.5.1 地址转换概念

虚拟地址是程序用于加载和存储指令的内存空间,物理地址则是真正的物理地址空间。从系统角度出发,地址转换是物理地址与虚拟地址之间的一层。物理地址与虚拟地址之间的映射由页表定义并由系统软件管理。

操作系统利用地址转换实现虚拟地址抽象,如图11所示。虚拟内存抽象的接口与2.2节所述的内存抽象的接口一致,但每个进程使用一个分离的虚拟地址空间访问到分配给它的内存。对于应用程序开发者而言,虚拟内存可以认为是假装每个进程在独立计算机上运行并拥有自己的DRAM的模型。

操作系统用地址转换来实现DRAM的多程序复用,并将各自操作都隔离开来,防止应用程序直接访问内存映射的设备。后两个保护手段能够防止某一个应用程序bug对其他应用程序以及系统内核本身造成影响。系统管理软禁也运用地址转换方式将DRAM分割给不同的操作系统,并将内存映射的设备进行虚拟化。

地址转换模式用在64位操作系统中,在Intel文档中被称为IA-32e,将48位虚拟地址映射为至多52位物理地址。如图12所示,地址转换过程由CPU中的专用硬件完成,这些硬件一般被称为地址转换单元或者内存管理单元(MMU)。

低12位虚拟地址在转换过程中保持不变,高36位将被分为4个9比特长的索引,分别用于不同页表中进一步索引。尽管叫做“表”,页表的数据结构非常类似于一个完整的512叉搜索树,每个节点都有固定的键值。每个点都代表着DRAM中一组512个8字节大小的入口,每个入口包含下一层孩子节点的物理地址以及一些标记值。根节点的物理地址存放在CR3寄存器中。最底层的节点集合包含地址转换后的物理地址结果。

地址转换函数并不改变地址的低位,只是将内存地址空间分割到不同的页中。一页就是不受地址转换影响的不同地址低位的集合,所以所有在同一个虚拟页中所有虚拟地址都量被转换为同一个物理页。如此看来,地址转换函数可以看做是虚拟页标和物理页标之间的映射(如图13所示)。

除了隔离应用程序的进程,操作系统也会用地址转换机制来运行整体内存消耗超过计算机DRAM大小的程序。OS时不时地会将使用过的内存页从DRAM中驱逐到更大(但更慢)的存储空间中,如硬盘或固态硬盘。历史原因,我们说更慢的存储空间统一指代硬盘。
OS被赋予过度提交DRAM,或常常被称为页面交换,的能力主要是出于以下几点考虑。当应用程序进程向访问被驱逐的页时,OS必须介入并将缺失的页读入DRAM。为了做到这一点,OS也许会将其他的页驱逐出DRAM,和硬盘页做交换。背后实现的细节将在后续章节中展开。

CPU地址转换也是和页相似的原理,即页面交换。

2.5.2 地址转换和虚拟化

利用硬件虚拟化技术的计算机使用系统管理软件同时运行多个操作系统。这会带来一些资源紧张,因为每个操作系统都认为自己被写进一个专属的计算机DRAM中。这种资源紧张将会在第二层地址转换中得到缓解,如图14所示。

当系统管理软件保持活跃时,由操作系统设置的页表将虚拟地址和物理客户机物理地址映射到客户机物理地址空间中。系统管理软件通过第二层地址转换结构复用不同操作系统上客户机地址空间,在这里将使用到扩展页表(EPT)结构将客户机物理地址映射到真正的物理地址上。

EPT使用与页表相同的数据结构,所以转换的操作过程也和IA-32e地址转换是一样的。主要的不同在于,数据结构根节点的物理地址将存储在客户操作系统上虚拟机控制结构(VMCS)中的EPTP域里。图15展示了硬件虚拟化中的地址转换过程。

若将present(P)这个标志位被设定为0, 表示未用的地址空间部分,也就是暂无与之相关联的物理内存。系统软件也会在页被驱逐出DRAM的时候将其P标志位设置为0。当地址转换单元遇到一个为0的P标志位时,会停止转换操作并提交一个硬件异常,如2.8.2所述。这个硬件异常使得系统软件有机会介入并从RAM中重新载入一个被驱逐的页。
支持软件隔离的主要attribute有:writable(W)标志位,将它置0可以达到禁止写任何页内的内存的效果;execution(XD)标志位,将它置1可以达到防止从本页取指令的效果;supervisor(S)标志位,将它置1可以达到禁止任何来自ring3级别的应用程序的访问。

2.6 运行上下文

64位Intel架构下的应用程序利用各种CPU寄存器实现与处理器的交互,如图16和表1所示。这些寄存器中的值组成了应用程序的线程状态,或称运行上下文(execution context)。
操作系统内核通过上下文切换(context switching)实现对多应用程序专属逻辑处理器的复用。也就是说,将所有构成线程运行上下文的寄存器的值进行保存,随后将其替换成之前保存过的其他线程的上下文。上下文替换也是用安全容器运行代码的重要组成环节,所以这一设计有着安全含义。
整数和内存地址都存储在16个通用寄存器(general-purpose registers)中。前8个GPRs的名字是从之前32位Intel架构中的寄存器名扩展而来:RAX、RBX、RCX、RDX、RSI、RDI、RSP和RBP。另8个寄存器简单记为R9-R16。RSP是用来存放指向程序调用栈顶的指针的寄存器。程序调用发生时,CPU指令会自动读取和修改RSP和其指向的栈。程序调用操作有CALL和RET,以及包括PUSH和POP在内的其他特定的栈操作指令。
所有应用层序也使用RIP寄存器,该寄存器存放当前执行语句的地址。应用程序还会使用RFLAGs寄存器,其比特位分别用于存储比较结果和控制各种指令。
软件可能使用其他寄存器与特定的处理器功能进行交互,如表1所示。
Intel架构为操作系统内核提供一种功能(此处原文可能有误,应为feature)证明方法,用以保存应用使用的特定功能寄存器内的值。XSAVE指令将request-feature bitmap(RFBM)作为输入,并将被调用的特定功能寄存器对应内存空间中的RFBM位置1。之后可以用XRSTOR指令将暂存在XSAVE写过的内存区域中的值加载回寄存器。这部分内存区域已包含输入到XSAVE的RFBM,所以XRSROR无需任何RFBM输入。
应用程序向内核声明它计划使用的功能,所以内核知道执行上下文切换时的XSAVE bitmap。当收到系统调用,内核会依照应用程序的声明将XCR0寄存器设为相应功能bitmap。如果程序想使用一个没有被XCR0启动的功能,则CPU产生一个默认设置,那么发生上下文切换的时候,应用将无法改变这些不在内核考虑范围内的特定功能寄存器的值。内核可以使用CPUID指令获知功能bitmap对应的XSAVE内存区域的大小,并计算出它需要给每个应用线程分配多大的内存空间。

2.7段寄存器


(施工中)


http://chatgpt.dhexx.cn/article/poNPFq79.shtml

相关文章

Intel SGX入门(一)——背景篇

为什么要Intel SGX? 以云环境为例子,云租户会将自己的产品部署在云平台中,但是云平台现在普遍认为是一个不可信的地方,因为可能会有云平台管理者、同一云主机其他租户的恶意攻击,也可能云平台本身存在漏洞&#xff0c…

windows下使用SGX

前言: 这个是简单对于毫无经验的人的入门博客,杠精勿扰,大神离开。 我觉得每当下载一个新的工具的时候要先看一看他自己带的文档。 何谓SGX?不解释,您可以去看其介绍,百度搜搜即可。 win10如何下载SGX&a…

Intel SGX学习笔记(1):虚拟机Ubuntu20.04配置Intel SGX环境

写在前面 本教程仅仅适用虚拟机下的Ubuntu20.04配置Intel SGX环境,若是双系统下的Ubuntu系统,请看最后的参考连接。若是window10自带的ubuntu,也就是从微软商店下载的ubuntu系统,这个我到make preparation指令就开始疯狂报错&…

Windows10下使用Intel SGX功能(四):SGX技术分析

参考文献 Overview of Intel SGX - Part 1, SGX InternalsDeveloper Guide: Intel Software Guard Extensions (Intel SGX)(最新版)Overview of Intel SGX - Part 2, SGX Externals SGX 介绍 SGX 发展情况 SGX技术目前已经发展到SGX2。比如安全证明功…

可信启动、安全启动:SGX、TrustZone、SecureEnclave

最近在公众号上看到了一篇文章,算是又丰富了自己的安全方面的眼界。 最近看公众号取代了小视频、知乎这些东西。以前是真的不喜欢碎片化的东西,看什么学什么总是要找到书籍。但是这样的做法太过的极端,因为有时候有些事是两面性的。比如像安全…

Intel SGX 技术初探

最近公司需要开发一款使用intel 的移动终端,需要用到SGX技术,特此将调研和整理的相关资料放置于下,欢迎交流。 一、SGX技术背景 1.1 SGX技术定义 SGX全称Intel Software Guard Extensions,顾名思义,其是对因特尔体系…

Intel SGX入门(二)——SGX应用篇

大概了解SGX以后,SGX应用有哪些? 第一种,SGX应用于服务器端,云端 这一类个人觉得很需要结合代码、它们所描述的行业需求和以前的行业产品去考虑问题,毕竟是应用,不然可能体会不到精髓。 我对SGX应用的理解…

Intel SGX Explained

文章目录 SGX新增Abstract第一章 概括1.1 SGX简介1.2 大纲和问题发现 第二章 Intel体系架构背景知识2.1 Overview2.2 计算模型2.3 软件权限级别2.4 地址空间2.5 地址转换2.5.1 地址转换概念2.5.2 地址转换和虚拟化2.5.3 页表属性 2.6 执行上下文2.7 段寄存器2.8 特权级别转换2.…

sgx使用记录(Windows开发环境搭建以及sgx的简单介绍)1

sgx使用记录 相关代码仓库 ##sgx-sdk https://github.com/apache/incubator-teaclave-sgx-sdk.git##Teaclave:通用安全计算平台 https://github.com/apache/incubator-teaclave检测sgx运行环境是否支持 ##或使用cpuid命令 cpuid |grep -i sgx##或使用脚本测试 下…

Windows10下使用Intel SGX功能(一):环境搭建

文章目录 参考文献系统要求一、安装Open Enclave SDK 环境(一)什么是Open Enclave SDK(二)启动SGX功能方法一: BIOS启动方法二:软件方式启动 (三)安装必要环境(1&#xf…

Intel SGX 功能如何开启

Intel SGX 功能如何开启 我本身是 Windows10 系统, BIOS 是 ASUS 的,在想装 Ubuntu 双系统的时候,在启动 Ubuntu 安装 ISO 的时候提示说电脑的 SGX 没有开启,安装失败,安装界面都没有进去。 之后搜了下如何开启 SGX&a…

SGX的内部组件概述

导语:SGX是Intel开发的新的处理器技术,可以在计算平台上提供一个可信的空间,保障用户关键代码和数据的机密性和完整性。SGX全称Intel Software Guard Extensions,顾名思义,其是对因特尔体系(IA)…

SGX入门

如何设计SGX程序: SGX分为可信部分和不可信部分,可信部分由enclave组成(一个应用程序可以拥有一个或多个enclave),enclave存储在加密的内存中,受SGX保护,enclave一旦被建立就不能更改,所以通常…

SGX Enable

根据INTEl的官方建议, 目前的电脑主板在BIOS设置上只保留了Disabled和Software Controlled来开启和关闭SGX扩展 使用Software Controlled开关的原因官方文档有阐述,如下: 开启SGX扩展,首先需要满足以下要求: CPU具有…

Intel SGX技术详细解释(非常棒)

http://www.jos.org.cn/html/2018/9/5594.htm#b18 随着信息技术的迅速发展与广泛应用, 人类社会已经进入了一个崭新的互联网时代.一方面, 人们享受着互联网科技带来的便利; 另一方面, 由网络和信息系统构成的网络空间也面临着日益严峻的安全问题.信任是网络空间中安全交互的基…

SGX问答

0 前言 有些问题比较常见,在这里直接将问答内容贴出来,方便大家搜索。有空再重新组织文字。 (我会避免泄露私人信息) 1 内存地址翻译全部交给os,那中间经过cache也是全部交给os是嘛?这个cache这部分&…

小谈Intel SGX

目录 Intel SGX简介 背景 为什么要Intel SGX? Intel SGX尚处于学术讨论 Intel SGX和可信启动什么关系? 开发者眼中SGX长什么样子? SGX访问控制是什么? MEE与SGX EPC内存加密 CPU里面SGX长什么样子? 有Enclav…

SGX技术与SGX攻击

2013年, Intel推出SGX(software guard extensions)指令集扩展, 旨在以硬件安全为强制性保障, 不依赖于固件和软件的安全状态, 提供用户空间的可信执行环境, 通过一组新的指令集扩展与访问控制机制, 实现不同程序间的隔离运行, 保障用户关键代码和数据的机密性与完整性不受恶意软…

Intel SGX初步学习理解笔记(持续更新)

一些概念 SGX(Software Guard eXtensions)软件保护扩展:是一组CPU指令扩展,能够创造出一个可信执行环境来保护代码和数据,即使使用root 权限也无法访问。通过这个硬件设施,应用程序可以隔离代码和数据来达…

Intel 的 SGX 技术小知识

1.SGX 概述 Intel SGX (Software Guard Extensions) 是一种针对特定应用程序的安全增强技术。它允许应用程序在处理机上创建受保护的执行环境,这个执行环境被称为“enclave”。这个 enclave 是一个被硬件隔离的内存区域,只有在安全条件下才可以访问。这…