论文《SVSM-KMS:Safeguarding Keys for Cloud Services with Encrypted Virtualization》总结
本文将介绍 2024 年发表在 arXiv 上的论文《SVSM-KMS:Safeguarding Keys for Cloud Services with Encrypted Virtualization》。
解决的问题密钥管理服务是云环境中最重要的服务之一。集中式密钥管理系统(centralized Key Management System, KMS)通常提供一个统一的平台来进行密钥生成、分发、管理等操作,然而,这会导致可信计算基(TCB)过大,带来单点故障的风险。非集中式的 KMS 是一个方向,但是这会带来为维护多结点一致性的高昂的开销。
云端的安全密钥管理存在许多问题:首先云服务提供商(CSP)拥有对平台的绝对控制权,需要将其视作可信。此外,网络延迟会影响集中式的 KMS 的效率。同时,如果宿主机系统被攻破,还可能导致密钥的泄露。
为了解决这些问题,本文基于 AMD SEV-SNP 所引入的 VMPL 机制和 SVSM 特权软件,设计了 SVSM-KMS,将 KMS 放在 CVM 内的最高 VMPL 特权级,与 host 和 guest 隔离开来。具体来说,本文的贡献如下:
...
RISC-V 架构下的裸金属程序
本文将介绍如何在 RISC-V 环境下,编写一个最简的裸金属(bare-metal)程序,该程序不依赖于操作系统的支持,计算机在启动后直接跳转到该程序开始执行。本文的目的主要是作为一个程序模板,可以对其进行扩展成为一个完整的操作系统或是常驻内存中的固件服务。
实现原理要实现计算机在启动后立马跳转到该程序执行,需要明确一点:计算机启动后执行的第一条指令是什么?或者说,PC 初始值是什么?答案根据平台的不同可能存在差异,我们的测试环境为 qemu-system-riscv64 模拟器的 virt 模型,其初始 PC 为 0x80000000。那么我们便要编写链接脚本,将需要程序的入口点链接到该地址处。
还有第二个问题:程序入口可以直接是 C 程序吗?答案是不行,至少绝大部分情况下不行。C 代码编译之后,局部作用域内变量的保存依赖于栈,因此我们必须准备好一片连续的内存区域(栈空间),并在进入 C 环境前将栈指针寄存器(SP)指向该内存区域的最高地址处(因为栈从高地址向低地址增长)。
至于栈空间的分配,通常有两种方式。首先可以编写链接脚本进行预留:
OUTPUT_ARCH("ris ...
论文《Cabin:Confining Untrusted Programs within Confidential VMs》总结
本文将介绍 2024 年发表在 arXiv 上的论文《Cabin: Confining Untrusted Programs within Confidential VMs》。
解决的问题特权级划分保证系统稳定运行的最基本机制,然而传统的特权级划分存在一些不足之处:首先,由于内核庞大的代码所带来的庞大的攻击面,用户态和内核态的接口——系统调用可能会被恶意用户程序利用以绕过内核的保护机制;其次,MMU 缺乏细粒度的页面保护,x86 架构下页表项的读写权限仅由一个 R/W 位来指示,只能被配置为只读或可读可写,限制了 XOM(eXecute-Only Memory)的高效实现。
具体来说,本文工作的威胁模型基本继承自 CVM 的威胁模型,在此基础上加入了对于部分应用程序的不信任,认为其可能包含内存安全错误。贡献如下:
设计并实现了一个 CVM 内的安全进程执行框架,借助 VPML 机制,保护 guest OS 免受不可信程序的威胁。
引入系统调用异步转发、自管理内存等机制降低框架带来的性能开销,根据在 Nbench、WolfSSL 等基准测试下的性能表现,表明本框架的性能开销较低。
...
xv6-riscv 上下文切换代码分析
由于最近的工作涉及到编写上下文切换跳板代码的需求,因此便想将 xv6 中与此相关的代码读一读,正好之前学习时对这一块也没有看得太仔细。
系统初始化xv6 的 qemu 启动参数为 -kernel kernel/kernel -bios none,qemu 模拟器在启动时,pc 将自动跳转到预先设定的地址 0x80000000 处,而链接脚本 kernel.ld 已经将下列代码 entry.S 链接到了该地址,因此下列代码即模拟器启动后 CPU 执行的初始代码。
这段代码的作用是为每个 CPU 核心开辟属于自己的栈空间,以便后续内核代码的执行。
.section .text
.global _entry
_entry:
# stack0 在 start.c 中定义
# 每个 CPU 固定为 4KB 的内核栈大小
# sp = stack0 + (hartid * 4096)
la sp, stack0
li a0, 1024*4
csrr a1, mhartid
a ...
论文《Ditto:Elastic Confidential VMs with Secure and Dynamic CPU Scaling》总结
本文将介绍 2024 年发表在 arXiv 上的论文《DITTO:Elastic Confidential VMs with Secure and Dynamic CPU Scaling》。
解决的问题机密虚拟机(CVM)在带来了强大的机密性和完整性保护的同时,也带来了很多限制,导致虚拟机的性能和灵活性的下降。例如:不支持 vCPU 的热插拔(即运行中动态调整 vCPU 的数量),该特性可以用于在虚拟机运行过程中灵活调整计算能力,应用于 Serverless 等计算环境下。
虽然的商用 CVM 方案还没有任何一家支持 vCPU 热插拔,但是内存的动态调整是可行的。例如 AMD SEV-SNP 下 hypervisor 可以使用 RMPUPDATE 指令将 CVM 的内存进行回收和动态分配。
由于缺少了 vCPU 数量的动态调整能力,现有的机密无服务器环境(OpenWhisk + Kubernetes + 机密容器)要想动态调整运算能力,只能借助于启动新的 CVM,这会带来很大的性能开销。本文提出了“弹性 CVM” 和 “Woker vCPU” 的概念,能够在 CVM 环境下动态调 ...
论文《SEV-Step:A Single-Stepping Framework for AMD-SEV》总结
本文将介绍发表在 arXiv 上的论文《SEV-Step: A Single-Stepping Framework for AMD-SEV》。
文章贡献
在 SEV 环境下引入了可靠(reliable)的单步执行方法。
将交互式单步执行、页面错误追踪和基于缓存组置换的缓存攻击(eviction set-based cache attacks)整合到一个可复用的框架中。
背景知识基于中断的单步执行基于中断的单步执行方法是一种通过控制处理器中断(如 APIC 时钟中断)来提升微架构攻击的时间分辨率(temporal resolution)的技术。核心思想是利用高频率的中断强制目标程序暂停执行,从而实现对微架构状态(如缓存等)的细粒度观测。
APIC 提供了高精度的定时功能,攻击者可以通过配置定时器周期性触发中断,强制目标程序在执行过程中频繁暂停。暂停后,攻击者可以利用侧信道攻击等方法,读取此时的微架构状态,再恢复下一条指令执行。这种方式将时间分辨率从页错误级别提升到了指令级。
缓存侧信道攻击
下列内容主要来自《操作系统:原理与实现》(银杏书)的在线章节:操作系统安全的 16.6.2 节 ...
论文《Remote attestation of confidential VMs using ephemeral vTPMs》总结
本文是对 ACSAC '23 论文《Remote attestation of confidential VMs using ephemeral vTPMs》的总结,以及个人的理解和思考。
解决的问题机密虚拟机(CVM)技术为虚拟机提供一个隔离环境,防止受到 hypervisor 等高特权软件的干扰。但是这样的隔离机制作用于虚拟机运行时,在虚拟机启动过程中,此时的完整性(intergrity)保护依赖于度量启动(measured boot)和运行时证明(runtime attestation)。运行时证明需要一个硬件信任根,在物理机上,TPM 芯片可以作为这样的信任根。然而在云计算环境中,云服务提供商通过设备模拟的方式给用户提供 vTPM,使用这样的模拟设备需要信任云服务提供商,这与 CVM 的威胁模型不符。
本文作者提出了一种方法,借助 AMD SEV-SNP 技术,在 CVM 内部模拟一个 vTPM,而无需信任 hypervisor。具备以下安全要求:
隔离性:既与 guest 隔离又与 host 隔离。
安全通信:与物理 TPM 的通信是硬件级隔离的,因此 vTPM ...
虚拟机自省技术
虚拟机自省技术(Virtual Machine Introspection)是一种通过外部监控虚拟机内部状态的技术,它能够在不依赖虚拟机内运行的软件的情况下,获取和分析虚拟机的内存、CPU 状态、磁盘活动、网络流量等数据。
以下是维基百科中对虚拟机自省技术的描述,我对其进行了中文翻译:
原文链接: Virtual machine introspection - Wikipedia
在计算机领域,虚拟机自省(Virtual Machine Introspection, VMI)是一种监控虚拟机运行状态的技术,这有助于调试和取证分析(forensic analysis)。
introspection 这个术语由 Garfinkel 和 Rosenblum 引入虚拟机领域。他们发明了一种“保护安全应用程序免受恶意软件攻击”的方法,并将其称为 VMI。如今 VMI 是不同的虚拟机取证和分析方法的通用术语。基于 VMI 的方法广泛用于安全应用程序、软件调试和系统管理。
VMI 工具可以位于虚拟机内部或外部,并通过跟踪事件(中断、内存写入等)或向虚拟机发送请求来工作。虚拟机监视器通常提供底层信 ...
MMIO和mmap文件映射的区别
MMIO 和 mmap 文件映射都涉及将外部资源(除 CPU 寄存器和内存以外)映射到进程的地址空间中,但它们并非等同。本文将对二者进行分别介绍,并对比它们之间的区别和联系。
MMIO计算机系统中的设备种类繁多,不同设备它们的物理结构、电气特性可能完全不同。因此为了屏蔽其中的差异,让 CPU 更好的与不同的设备进行交互,各种不同的设备都被抽象成了一系列的外部接口,也就是 设备寄存器 。CPU 与设备交互的方式,就是对这些寄存器进行读写。
那么问题自然应运而生,以什么样的方式,或者更具体地说,执行什么样的指令对设备寄存器进行读写?通常来说有两种:一种是 CPU 采用特殊的 I/O 指令(如 x86 架构下的 in/out 指令),指令中对应的设备寄存器地址位于一片专门的 I/O 地址空间中,这种方式成为端口映射 I/O(Port-Mapped I/O, PMIO);而另一种则是将设备寄存器的地址映射到进程的虚拟地址空间中,进而直接使用普通的内存读写指令(如 x86 架构下的 mov)对其进行读写,这种方式称为内存映射 I/O(Memory-Mapped I/O),也就是本文要介绍的 M ...
机密虚拟机的威胁模型
本文将介绍近年兴起的机密虚拟机(Confidential Virtual Machine)技术所旨在抵御的威胁模型,主要关注内存机密性(confidentiality)和内存完整性(integrity)两个方面。在解释该威胁可能造成的问题的同时,还将同时介绍现在最主流的机密虚拟机解决方案之一的 AMD SEV-SNP 如何如何应对该威胁。
在正式介绍之前,有必要先明确这样一个概念,在机密虚拟机的威胁模型中,Hypervisor 被认为是不可信的。恶意的 Hypervisor 可能读取虚拟机的内存数据,导致虚拟机用户隐私泄露;或是直接写入虚拟机内存,导致虚拟机运行产生预期之外的结果。
机密性虚拟机内存由于虚拟机的内存是通过第二阶段页表映射(GPA -> HPA)到宿主机内存中,且该页表由 Hypervisor 进行维护。因此在未引入机密虚拟机技术时,Hypervisor 能够直接借助该页表映射,手动进行地址转换并读取虚拟机内存数据。
对于虚拟机内存的机密性,AMD 在最早的 SEV 技术(2016 年)中已经解决。解决方法是为每个虚拟机引入一个 AES 加密密钥,虚拟机指定为私有 ...