
在现代计算中,尤其是在云环境中,一个基本的假设始终是对底层系统软件的信任。我们信任虚拟机监控器和操作系统能够诚实地管理我们的数据和应用程序。但如果这份信任被打破了怎么办?如果云服务提供商,或是一个已经攻破提供商基础设施的攻击者,变成了恶意的对手呢?这就产生了一个巨大的安全缺口,因为控制虚拟环境的实体可以访问其中的所有秘密。我们面临的挑战是,不仅要在数据靜態存储或传输时保护它,还要在数据被主动处理时保护它——这就是所谓的机密计算。
本文探讨了 AMD 的安全加密虚拟化 (Secure Encrypted Virtualization, SEV) 技术,这是一种旨在解决这一问题的开创性硬件技术。它通过展示我们如何从根本上縮小“可信计算基”,将虚拟机监控器排除在外,从而为整个虚拟机创建一个硬件强制的堡垒,填补了相关的知识空白。在接下来的章节中,你将深入理解这种变革性的方法。首先,“原理与机制”一章将揭示 SEV 如何利用即时内存加密和完整性检查来保护虚拟机的内存和执行状态。随后,“应用与跨学科联系”一章将展示这些能力如何被应用于解决云计算安全和信息物理系统中的实际问题,以及这一安全特性如何与计算机体系结构和密码学等其他领域相互作用。
想象你有一个需要保护的秘密。你可能会把它锁在保险箱里。但如果你要提防的人是房子的主人,他拥有所有钥匙,还掌握着房屋的平面图,那该怎么办?在计算世界里,操作系统 (OS)——或者在虚拟化环境中,虚拟机监控器 (hypervisor)——就是房子的主人。它管理内存,调度任务,并且可以说,对机器上运行的每个应用程序都拥有上帝般的权力。那么,一个简单的应用程序怎么可能向控制其生存的实体保守秘密呢?
这是计算机安全领域最深刻的挑战之一。几十年来,答案都是“你不能”。你必须信任操作系统和虚拟机监控器。如果它们被攻破,一切都完了。但如果我们能改变游戏规则呢?如果我们能在计算机的主处理器内部建造一个堡垒,一个应用程序可以在其中运行,并屏蔽掉即便是最高权限软件的全视之眼,那又如何?
这就是可信执行环境 (TEE) 的承诺。它是一个将传统安全模型彻底颠覆的概念。要 appreciation 它的独创性,我们必须首先理解可信计算基 (TCB) 的概念。TCB 是对系统安全至关重要的所有硬件、固件和软件组件的集合。如果 TCB 内部的任何组件失效或懷有恶意,安全就会被破坏。安全工程的一个基本原则是让 TCB 尽可能小。你需要信任的东西越少,出错的可能性就越小。
TEE 的主要目标是大幅缩减 TCB。与可信平台模块 (TPM) 不同——TPM 是一个专为存储密钥和测量系统状态等特定加密任务设计的小型独立芯片——TEE 被设计用来安全地运行通用代码。与庞大的外部硬件安全模块 (HSM) 不同——HSM 本质上是一台专用于密码学的强化计算机——TEE 直接内置于主 CPU 中。TEE 的 genius 之处在于,它划分出一个受保护的执行和内存区域,将强大的操作系统和虚拟机监控器置于 TCB 之外。它旨在击败的攻击者,正是那个已经接管了整个系统、但现在却被锁在 TEE 内部圣殿之外的特权软件对手。堡垒已经建成,而房子的主人已不再被信任。
所以,我们有了一座堡垒。但它究竟是如何运作的呢?当不可信的操作系统控制着代码所在的内存时,代码如何能以受保护的方式执行?这让我们回到了计算中最基本的思想之一:存储程序概念。指令和数据都只是存储在内存中的比特模式。为了运行一个程序,CPU 的指令获取 (IF) 单元在程序计数器 (PC) 的指引下,从内存中读取这些比特。
如果操作系统控制了内存,它就可以轻易地改变这些比特,从而篡改程序的指令。解决方案既优雅又强大:密码学。所有属于受保护应用程序的代码和数据都以密文的形式存储在主系统内存 (DRAM) 中。对于操作系统来说,它们是无法理解的乱码。
让我们跟随一条指令的旅程。当 CPU 在其特殊的受保护模式下运行时,需要为我们的安全应用程序获取下一条指令,这时一场迷人的舞蹈开始了。IF 单元从受保护区域内的一个内存地址请求指令。这个请求被发送到内存控制器。内存控制器从 DRAM 中获取的不是明文,而是加密的数据块。但就在这个密文被送往 CPU核心之前,它会被一个內建于 CPU 封装中的特殊解密引擎拦截。这个引擎持有一个操作系统永远无法访问的、固化在硅片中的密钥。它瞬间解密数据,揭示出真正的明文明指令。这条明文指令随后被送入 CPU 的解码器并执行。为了提高速度,CPU 的内部缓存可以存储明文数据,但一旦这些数据需要被写回主内存,它在出去的途中会再次被加密。
CPU 封装的边界成为了一道坚固的密码学边界。明文存在于内部;密文存在于外部。
当然,如果攻击者可以轻易地空降到堡垒的中心,那么这个堡壘就毫无用处。硬件强制执行一套严格的协议来进入和离开这种受保护状态。你不能简单地跳转到受保护区域内的某个内存地址。相反,程序必须执行一条特殊的架构指令来正式进入 enclave。这条指令就像一个守门人,验证状态转换,将 CPU 切换到受保护模式,并将程序计数器设置到一个唯一的、指定的入口点。同样,要退出时,也必须使用另一条特殊指令。这可以防止攻击者欺骗安全应用程序跳转到恶意位置,或从一个不受控制的点进入它。
小型的、进程级别的 enclave (如 Intel SGX 等技术所示) 的概念是强大的。但如果我们想要保护的不仅仅是一个应用程序的一小部分,而是一个完整的遗留应用程序,甚至是整个操作系统呢?这就是 AMD 安全加密虚拟化 (SEV) 的宏伟目标。其目标是将整个虚拟机 (VM) 提升到一个受硬件保护的堡垒中。
这带来了一个新的、艰巨的挑战。VM 由虚拟机监控器 (hypervisor) 管理,它负责分配和管理 VM 的内存。虚拟机监控器通过一种称为嵌套分页(在 Intel 上称为 EPT,在 AMD 上称为 NPT)的机制来完成这项工作。本质上,虚拟机监控器维护一组页表,将 VM 认为自己正在使用的“客户机物理地址”转换为机器上实际的“主机物理地址”。如果 VM 的内存全是加密的乱码,虚拟机监控器又如何能管理它呢?
答案在于 CPU 硬件和虚拟机监控器之间的紧密协作。虚拟机监控器仍然被允许管理内存的容器(即页面),但它被拒绝访问内容。当客户机 VM 在其加密堡壘内运行时,试图访问其内存,CPU 的内存管理单元便会立即行动起来。它首先执行客户机自己的地址转换,然后,在访问主内存之前,它会自动遍历虚拟机监控器的嵌套页表以找到最终的主机物理地址。这整个二维页表遍历过程都在硬件的监督下进行。如果一个客户机页表本身就在加密内存中(事实正是如此!),硬件会确保它被透明地即时解密,以便页表遍历能够继续进行。
虚拟机监控器这边,它看到来自 VM 的内存访问请求,到处移动加密的页面,但永远看不到明文。如果虚拟机监控器试图直接读取 VM 的一个私有页面,内存控制器知道虚拟机监控器没有正确的密钥,将只会返回原始的、加密的密文。
这种能力是革命性的,它允许整个未经修改的操作系统和应用程序在一个机密的云环境中运行。但它也带来了一个关键的权衡。在一个受 SEV 保护的 VM 中运行的应用程序,其 TCB 现在包括了整个客户机操作系统。堡垒已经扩展到了一个王国的规模,你必须信任国王和他所有的臣子(客户机 OS 内核、驱动程序等)。这比一个小型的 enclave 的 TCB 要大,但它提供了巨大的灵活性。硬件保护 VM 免受恶意云提供商的侵害,但不能保护应用程序免受其自身操作系统的侵害。
我们已经实现了机密性。虚拟机监控器无法读取 VM 的秘密。但还有一种更 subtle 且同样危险的威胁:如果虚拟机监控器在不读取秘密的情况下篡改它们怎么办?如果它攻击 VM 的完整性呢?
想象一个简单但毁灭性的攻击。一个恶意的虚拟机监控器在上午 9:00 安静地记录了一个内存页面的加密内容。这个页面可能包含一个关键金融交易的状态。到了上午 9:05,在该交易更新之后,虚拟机监控器简单地用它在 9:00 记录的旧版本覆盖当前的加密页面。这就是重放攻击。当 VM 的 CPU下一次读取该页面时,它将尽职地使用其密钥解密。解密将是完美的,CPU 将看到有效的、但现在已是危险的过时数据——来自上午 9:00 的数据。VM 在完全不知情的情况下被骗回到了过去。专注于加密的基础版 SEV 容易受到此类攻击。
为了解决这个问题,我们需要超越单纯的加密。我们需要一种方法让硬件能够验证数据没有被篡改或重放。这就是带安全嵌套分页的 SEV (SEV-SNP) 提供的巨大飞跃。
SEV-SNP 引入了一种既美妙又有效的机制:一个硬件强制执行的内存“真理账本”,称为反向映射表 (RMP)。你可以把 RMP 想象成一个巨大的、防篡改的财产分类账,存储在受保护的内存区域中,由 CPU 独家管理。对于机器上的每一个物理内存页面,RMP 中都有一个条目,就像一张所有权契约,记录着关键信息:“这个页面属于 VM #5”,“这个页面是私有的”,以及最重要的一点,“这个页面的内容已经被 VM #5 验证过。”。
客户机 VM 被赋予了一条特殊指令 (PVALIDATE),允许它在 RMP 中将自己的页面标记为“已验证”。硬件禁止虚拟机监控器更改这个已验证状态。
现在,让我们重演一下我们的攻击场景。恶意的虚拟机监控器试图换入一个旧的、过时的页面。当 VM 的 CPU 试图访问该内存位置时,硬件不再只是盲目地获取和解密。它首先查阅 RMP 账本。它会问:“这个物理位置上的页面真的属于这个 VM 吗?VM 是否已将其标记为已验证?” 如果虚拟机监控器将内存重新映射到了一个不属于该客户机或尚未被验证的页面,RMP 检查就会失败。硬件会立即抛出一个故障,在欺诈性数据被 VM 消耗之前就将攻击扼殺在萌芽状态。这个检查在每一次对私有页面的内存访问中都会发生,从而在 VM 的数据与其物理位置和状态之间创建了一个不可破坏的链接。
随着这最后一块拼图的就位,堡垒得以 hoàn thiện。内存加密提供了机密性,将秘密隐藏起来,使其免受窥探。RMP 提供了完整性,确保堡垒的墙壁不能被移动、替换或回滾。它们共同代表着朝着实现真正安全可验证计算的梦想迈出的 monumental 一步,即使在最 hostile 的环境中也是如此。
在深入了解了 AMD 安全加密虚拟化 (SEV) 复杂的原理和机制之后,我们可能会感到一种满足感,就像一位刚刚证明了一个定理的数学家。我们理解了它如何工作——内存加密、完整性保护、密钥与证明之舞。但物理学,或者说任何科学的真正乐趣,不僅在于理解游戏规则,更在于看到可以玩出的游戏的惊人多样性和美感。这项技术在何处离开绘图板,进入我们的世界?它如何与那些乍看之下似乎遥不可及的领域产生联系?现在,让我们来探讨这个强大思想的应用和令人惊讶的跨学科联系。
我们这个时代最深刻的变革之一是计算向云的迁移。我们把从家庭照片到国家经济关键基础设施的一切都托付给了庞大的远程数据中心。但这种信任一直是基于合同和声誉的“软”信任。如果我们能拥有一种“硬”的、密码学的信任呢?
考虑一家医院,它希望使用托管在公共云上的强大 AI 模型来分析敏感的患者健康信息 (PHI) 并预测疾病风险。在 HIPAA 等法规的约束下,这其中涉及的伦理和法律风险是巨大的。医院不能简单地“希望”云提供商是诚实的。云提供商的管理员,由于其工作的性质,拥有对服务器的特权访问。这就是典型的“内部威胁”——不一定是恶意的,但却是风险的来源。
这就是像 SEV 这样的可信执行环境 (TEE) 建立起名副其实的数字堡垒的地方。医院的 AI 应用程序可以被放置在一个加密的虚拟机内。从云提供商的角度来看,这个 VM 是一个不透明的加密数据 blob。即使拥有对服务器的完全管理权限,他们也无法窥探 VM 的内存以查看 PHI 或专有的 AI 模型。但医院如何能确定这个堡垒是真实的,并且没有被篡改过呢?通过*远程证明*。在发送任何数据之前,医院可以要求处理器本身提供一个密码学“收据”,证明其应用程序的特定、未经篡改的版本正在一个真实的、受 SEV 保护的环境中运行。
然而,至关重要的是要理解,SEV 并非能消除所有威胁的灵丹妙药。它是一个强大的基础,但不是整栋建筑。如果一个有权访问 AI 服务的合法医院员工滥用其权限,过度查询模型以试图推断有关训练数据的信息,该怎么办?如果医院的一名开发人員,无论是出于恶意还是无意,在应用程序代码中引入了缺陷,又该怎么办?TEE 将忠实地在其堡垒内执行这个有缺陷的代码。因此,安全需要“纵深防御”策略。TEE 提供了数据使用中的核心机密性,但这必须被其他控制措施所包围:严格的访问策略(基于角色的访问控制,或 RBAC)、健全的审计以确保问责制,以及严格的变更管理程序,以在任何新代码部署到堡垒之前对其进行审查。通过这种方式,SEV 成为密码学、云计算和医学伦理交叉领域的一项基石技术,开启了一个安全数据协作的新时代。
让我们转向另一个前沿领域:信息物理系统和“数字孪生”的世界。想象一个喷气发动机的完美数字复制品,运行在模拟器中,使用来自物理发动机的实时数据来预测维护需求。这个数字孪生的价值完全取决于其数据的可信度。我们如何确定数据流确实源自真实发动机上的传感器 #74B,而没有被网络上甚至设备自身操作系统上的恶意行为者注入或篡t改?
SEV 提供了 forging 从物理世界到数字世界的牢不可破、可验证的信任链的工具。这条链的第一个环节是将物理传感器的身份与 TEE 绑定。想象一个传感器有一个不可变的序列号 ,以及由其制造商提供的特定校准数据 。这些信息就像传感器的出生证明,由制造商进行密码学签名。运行在边缘设备上的 TEE 可以获取这个“出生证明”,将其与自身的软件度量和一个 freshness nonce 结合起来,并将这一切包裹在一个由其硬件根密钥签名的证明报告中。远程验证者——即数字孪生——随后可以检查这整个数据包。它验证 TEE 的真实性、其软件的完整性以及传感器由制造商签名的“出生证明”,所有这些都在一个密码学捆绑包中紧密結合。这就像一个边境官员不仅检查你的护照,还会与你的祖国确认护照是否有效且属于你本人。
但是,在一个时间点上建立身份是不够的。我们需要保证传感器读数的整个历史的完整性——我们称之为数据溯源。TEE 可以运行一个协议来创建一个所有传入传感器数据的日志。每个新条目都被进行密码学哈希,并且该哈希被包含在下一个条目哈希的计算中,形成一条链。篡改任何过去的条目都会以可检测的方式破坏这条链。但如果控制存储的操作系统只是删除了日志的末尾,并在重启时向 TEE呈现一个旧版本——一种“回滚”攻击,该怎么办?为了 defeating this, TEE 必须查阅一个操作系统无法操纵的真理来源:一个可信的单调计数器。这就像一个只能向前走的钟。每个日志条目都盖上了这个计数器的当前值。如果 TEE 重启后看到的计数器值小于它上次记录的值,它就知道自己被欺骗了。通过在一个受 SEV 保护的环境中运行这整个日志记录协议,我们可以创建一个完整的、有序的、防篡改的物理世界历史记录,使其免受其运行所在的那个操作系统的影响。
现在来看一个 piękny、反直觉的转折。一个为创造机密性而设计的特性,如内存加密,能否 paradoxically 地创造出一种泄露信息的新方式?答案,奇妙地,是肯定的。这让我们来到了旁路攻击的微妙艺术,攻击者不是通过破解加密本身来学习秘密,而是通过观察计算的副作用——它的“回声”。
想象一个存储在内存中的方阵 。可以指示计算机将所有数字相加,它可能会以两种方式之一进行:逐行求和(操作 )或逐列求和(操作 )。现在,内存是顺序组织的,我们的矩阵是以“行主序”布局的,意味着第 1 行的所有元素后面跟着第 2 行的所有元素,依此类推。
当计算机执行行求和 时,它的内存访问是顺序的:。这是现代 CPU 喜欢的模式。当 CPU 请求第一个元素时,它不仅获取那个元素,还会将一整“缓存行”的相邻元素取入其超快的本地缓存中。接下来的几次访问就变成了闪电般的缓存命中。这被称为*空间局部性*。
相比之下,当执行列求和 时,访问会在内存中到处跳跃:。每个元素都与上一个元素相隔一整行的字节。每次访问都是到一个新的、遥远的内存位置,导致缓存未命中和一次缓慢的主内存之旅。
所以,即使没有加密, 也比 快得多。现在,让我们打开内存加密。处理器每次从主内存获取新的缓存行时都必须解密数据。这为每一次缓存未命中增加了一个小的、固定的时间惩罚 。这会带来什么影响?它放大了时序差异。快速的行求和操作,它导致的缓存未命中很少,只是偶尔会产生这个惩罚。而慢速的列求和操作,它导致一连串的缓存未命中,几乎每次访问都会产生这个惩罚。
一个完全看不到数据,但能简单地测量整个操作时间的攻击者,将会观察到巨大的执行时间差异。他们无法读取矩阵,但他们可以近乎肯定地告诉你,你是在对行求和还是列求和。为机密性而设计的内存加密,反而使得时序旁路信道更响亮、更清晰。这揭示了一个深刻的真理:你不能通过只看一个组件来保护一个系统。安全来自于算法、计算机体系结构和密码学之间复杂的相互作用。保护内存的内容并不能隐藏访问的模式,而这些模式可以向任何足够聪明去倾听的人讲述一个丰富的故事。
SEV 及其类似的技术不仅仅是工程上的奇迹;它们是新的透镜,通过它们我们可以重新审视我们关于信任、验证和信息本身的假设。它们为更安全的系统提供了基础,但也挑战我们更深入地思考计算的本质及其在世界上留下 subtle 印记的方式。