论文《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 加密密钥,虚拟机指定为私有 ...
《General overview of AMD SEV-SNP and Intel TDX》中文翻译
本文为论文《General overview of AMD SEV-SNP and Intel TDX》的中文翻译,翻译工具使用大模型 DeepSeek v3 和通义千问 2.5,经过了本人的核对与校正。由于本人在机密计算领域还处在初学阶段,因此一些专有名词的翻译可能存在问题,欢迎指出。
AMD SEV-SNP 和 Intel TDX 的总体概述
作者:Kevin Kollenda
摘要
可信执行环境(TEEs)在安全关键代码的执行上应用越来越普遍。AMD SEV-SNP 和 Intel TDX 是新开发的硬件扩展,旨在为虚拟机提供可信执行的环境。通过提供额外的完整性保证并基于之前的安全扩展,它们使得在云环境中实现不会危及敏感用户数据的机密计算成为可能。本文介绍了用于实现这些重大安全增益的额外组件和流程。
关键词
可信计算,AMD SEV-SNP,Intel TDX,安全嵌套分页
介绍如今,软件公司正越来越多地将其应用程序迁移到云环境中,而不是在本地托管。这可能会对机密用户数据构成风险,因为云服务提供商(CSP)可以直接访问运行潜在安全关键应用程序的硬件。可信执 ...
将D盘空间划分给C盘
前段时间换了刚刚换了新的机械革命的笔记本,发现拿到手时磁盘已经预先分好了区,但是 C 盘(系统盘)只分了 200 GB。在装了 WSL 等一些必备的环境后,就只剩下不到 100 GB,感觉很没有安全感(😩),于是就想办法给 C 盘划分更多的空间,以下是一些经验分享。
尝试使用系统自带工具首先,我尝试着使用 Windows 自带的磁盘管理工具(Windows 11 下右键底部的“开始”键)。
开始的设想是:首先对 D 盘进行“压缩卷”将一部分空闲的存储空间转为“未分配”状态,然后对 C 盘执行”扩展卷“将刚腾出来的”未分配“空间给合并。但是发现 C 盘的”扩展卷“选项是灰色的,不可选。查阅资料得知一个磁盘在进行扩展卷时只能合并与之相邻的磁盘分区,而”压缩卷“腾出的空闲空间是位于磁盘右侧的,该空间无法与 C 盘进行合并,只能重新合入 D 盘中。
借助第三方工具要想使得 C 盘能够合并 D 盘的空闲空间,就必须使得 D 盘划分出的空闲空间位于 D 盘的左侧,而这必然涉及到磁盘数据的移动,存在数据丢失的风险,Windows 也并没有提供这样的功能。
于是转而寻求第三方工具的帮助,最终发现 ...
《最终幻想7:重生》体验分享
《最终幻想7:重生》是我 2024 年最期待的游戏之一。由于发售时还没有 PS5,加上考研复试等事务缠身,没能第一时间体验。后来,后面为了剧情体验的连贯性,我又重温了一遍四年前的《最终幻想7:重制版》,直到最近两个月才正式开坑。
历经 87 小时通关一周目后,内心感慨万千,不吐不快,于是便有了这篇体验分享。整体而言,《最终幻想7:重生》无愧于我 2024 年的年度游戏,甚至在 jrpg 品类中几乎稳坐我心中的头把交椅。但它并非完美,其中仍有一些让我不太满意或感到遗憾的地方,接下来便一一细说。
提示:本文存在剧透内容。
广阔,未必自由相较于重制版第一作,《重生》最大的进化便是引入了一个可供探索的大地图。但请注意,尽管游戏的地图很大,我却很难称之为“开放世界”。实际上,游戏并未表现出什么构建一个生动、真实的奇幻世界的意图,而是通过一个个清单项来构成世界。而这势必会导致游戏体验上的重复,制作组为了缓解这种枯燥感,尽可能地在这些重复的清单项中引入了差异化设计。例如,同样是捕获陆行鸟,不同地区有不同的解决方式,这些在一定程度上确实减轻了重复感。
支线任务方面,相比上一作,《重生》有了显著的变 ...
CSAPP Malloc Lab
本 Lab 需要实现一个内存分配器,技巧性较强,对应知识点为书中的第 9 章的第 9.9 节。个人认为是所有 Lab 中难度最高的一个,我这里也是时间所迫,只参照教材实现了隐式空闲链表,显式空闲链表的实现尚存在一些 bug,在本文暂不介绍。
思路实验要求实现 mm_init, mm_malloc, mm_free, mm_realloc。
mm_malloc 需要返回 8 字节对齐的指针。
mm_realloc: 返回一个指向至少 size 字节的内存区域指针。
如果 ptr 为空,作用等同于 mm_malloc(size)。
如果 size 等于 0,作用等用于 mm_free(ptr)。
如果 ptr 非空,将 ptr 指向区域的大小更改为 size 字节,并返回新区域的内存地址。
隐式空闲链表首先介绍一下书中介绍的隐式空闲链表的设计,主要分为两个方面:空闲块的设计和空闲链表的组织。
空闲块的设计
一个空闲块由三部分组成:首部、载荷(可能包含填充)和尾部。头部和尾部的内容完全一致,之所以要引入这样的冗余信息,是为了实现常数时间复杂度的反向访问。因为内存载荷大小的不确定性,因此 ...
CSAPP Shell Lab
本 Lab 需要实现一个简易的 shell,主要考察对进程和信号的理解,以及对与其相关的 POSIX API 的使用,对应知识点为书中的第 8 章内容。
思路实验要求实现一个简单的 shell,要求支持如下特性:
输入 ctrl-c 触发 SIGINT 信号,输入 ctrl-z 触发 SIGTSTP 信号,发送给给前台运行的任务和依赖于这些任务的子任务(子进程)。
如果命令行以 & 结尾,那么本次作业将被置于后台运行,否则置于前台运行。
每个作业可以通过 PID(process id)或 JID(job id)来指定,其中 JID 需要加上前缀 %。
支持下列内建命令:
quit:终止 shell 的运行。
jobs:列出所有的后台作业。
bg <job>:重启 <job>(PID 或者 JID),通过发出 SIGCONT 信号,然后将其运行在后台。
fg <job>:重启 <job>(PID 或者 JID),通过发出 SIGCONT 信号,然后将其运行在前台。
回收所有的僵尸进程。
命令行解释执行eval 函数的作用是 ...