SGX-Step 是一个开源框架,旨在促进对 Intel x86 处理器(尤其是 Intel SGX 平台)的侧信道攻击研究。SGX-Step 由一个对抗性 Linux 内核驱动和一个小的用户空间操作系统库组成,允许完全从用户空间配置非信任页表项和/或 x86 APIC 定时器中断。SGX-Step 已被用于我们自己的研究以及独立研究人员的工作中,从而实现了几种新的和改进的飞地执行攻击,这些攻击能够以最大的时间分辨率收集侧信道观测数据(即通过在执行每条指令后中断受害者飞地)。
许可证。 SGX-Step 是自由软件,遵循 GPLv3 许可。SGX-Step 标志源自 Eadweard Muybridge 的标志性 公共领域 "Sallie Gardner at a Gallop" 照片系列,该系列(就像我们的飞地单步执行目标一样)将疾驰马的动态分解为一系列单独的照片帧,以揭示马的整体步态特征。
| SGX-Step 版本 | 更新日志特性 |
|---|---|
| v1.5.0 | 稳定性修复(KPTI、内核 ISR 映射);(实验性)Gramine 移植;IPI 支持。 |
| v1.4.0 | 特权中断/调用门(Plundervolt)。 |
| v1.3.0 | 瞬态执行支持(Foreshadow)。 |
| v1.2.0 | 用户空间中断处理和确定性零步过滤(Nemesis)。 |
| v1.1.0 | IA32 支持。 |
| v1.0.0 | 用户空间页表操作和 APIC 定时器单步执行。 |
出版物。 SGX-Step 已被多个独立研究小组使用,并催生了一系列新的高分辨率 SGX 攻击。已知使用 SGX-Step 的项目的完整最新列表包含在本 README 的底部 。原始论文的副本可在此处获取。``` @inproceedings{vanbulck2017sgxstep, title = {{SGX-Step}: A Practical Attack Framework for Precise Enclave Execution Control}, author = {Van Bulck, Jo and Piessens, Frank and Strackx, Raoul}, booktitle = {2nd Workshop on System Software for Trusted Execution {(SysTEX)}}, publisher = {{ACM}}, pages = {4:1--4:6}, month = Oct, year = 2017, }
**演示。** [app/memcmp](https://github.com/jovanbulck/sgx-step/blob/HEAD/app/memcmp) 目录包含一个小的演示应用程序,通过单步执行一个包含微妙且非常量时间 `memcmp` 密码比较逻辑的示例飞地,展示了 SGX-Step 攻击的强大功能。与传统的、众所周知的噪声定时攻击不同,SGX-Step 能够以 _线性_ 时间确定性逐字符暴力破解密码:

## 概述
与先前的飞地抢占方案相比,SGX-Step 设计的关键在于为物理内存位置(该位置持有页表条目)以及本地 APIC 内存映射 I/O 配置寄存器和 x86 中断描述符表 (IDT) 创建用户空间虚拟内存映射。这使得不受信任的、攻击者控制的主机进程可以轻松地:(i) 跟踪或修改飞地页表条目,(ii) 配置 APIC 定时器单次/周期性中断源,(iii) 触发处理器间中断,以及 (iv) 完全在 _用户空间_ 内注册自定义中断处理程序。

上图总结了通过我们的框架中断和恢复 SGX 飞地时硬件和软件步骤的序列。
1. 本地 APIC 定时器中断到达一条飞地指令内。
2. 处理器执行 AEX 过程,该过程安全地将执行上下文存储在飞地的 SSA 帧中,初始化 CPU 寄存器,并向量化到在 IDT 中注册的(用户空间)中断处理程序。
3. 此时,可以轻松插入任何攻击特定的间谍代码。
4. 库返回到用户空间 AEP 跳板。我们修改了官方 SGX SDK 的不可信运行时,以允许轻松注册自定义 AEP 存根。此外,为了能够在攻击者控制的基准调试飞地上精确评估我们的方法,SGX-Step 可以 _可选地_ 进行插桩,以从中断飞地的 SSA 帧中检索存储的指令指针(使用 Linux 的 `/proc/self/mem` 接口和 `EDBGRD` 指令)。
5. 之后,我们配置本地 APIC 定时器以准备下一次中断,通过写入初始计数值内存映射 I/O 寄存器,就在执行 (6) `ERESUME` 之前。
## 源代码概述
该仓库的组织结构如下:```
.
├── app -- Collection of sample client applications using SGX-Step to
│ attack different victim enclave scenarios.
├── doc -- Papers and reference material.
├── kernel -- Minimal dynamically loadable Linux kernel driver to export
│ physical memory to user space and bootstrap `libsgxstep`.
├── libsgxstep -- Small user-space operating system library that implements the
│ actual SGX-Step functionality, including x86 page-table and
│ APIC timer manipulations.
└── sdk -- Bindings to use SGX-Step with different SGX SDKs and libOSs.
SGX-Step 是一个通用执行控制框架,允许精确地将受害飞地指令与_任意_攻击者代码交错执行。 SGX-Step 框架的一些主要用例总结如下图所示(另请参阅本 README 的底部,获取使用 SGX-Step 的最新出版物列表)。

SGX-Step 需要一个支持 SGX 的 Intel 处理器,以及一个现成的 Linux 内核。 我们最初的评估是在 i7-6500U/6700 CPU 上进行的,运行 Ubuntu 18.04 和标准 Linux 4.15.0 内核。 也支持更新的 Linux 内核和发行版。 下面我们总结了 Linux 内核参数。
将所需的启动参数传递给内核,如下所示:```bash
$ sudo vim /etc/default/grub
$ sudo update-grub && reboot
要检查当前运行的内核配置是否正确,请执行:```bash
$ sudo ./check_sys.sh
.. Checking recommended SGX-Step parameters [OK]
.. Checking unknown kernel parameters [OK]
.. Checking CPU features [OK]
.. Checking kernel page-table isolation [OK]
最后,为了进一步改善执行时间的稳定性,您也可以考虑在BIOS配置中额外禁用C状态(C-States)和SpeedStep技术。
/dev/sgx-stepSGX-Step 附带了一个可加载的内核模块,该模块向 libsgxstep 用户空间库导出了一个 IOCTL 接口。该驱动程序主要负责:(i) 钩挂 APIC 定时器中断处理程序,(ii) 收集不受信任的页表映射,以及 (iii) 可选地为基准飞地(benchmark enclaves)获取被中断的指令指针。
要构建并加载 /dev/sgx-step 驱动程序,请执行:```bash
$ cd kernel/
$ ./install_SGX_driver.sh # tested on Ubuntu 20.04/22.04
$ make clean load
**注意 (/dev/sgx_enclave).** SGX-Step 同时支持旧版 Intel 树外驱动 `/dev/isgx`(应在所有平台上工作),以及上游 `/dev/sgx_enclave` 驱动(适用于具有较新 Linux 内核 >5.11 且硬件支持灵活启动控制的平台)。`install_SGX_driver.sh` 脚本应自动检测树内 `/dev/sgx_enclave` 驱动是否可用,如果不可用,则通过指向未修改 v2.14 [linux-sgx-driver](https://github.com/intel/linux-sgx-driver) 的 git 子模块构建并加载树外 `/dev/isgx` 驱动。
**注意 (/dev/mem).** 我们依赖 Linux 的虚拟 `/dev/mem` 设备来构建用于 APIC 物理内存映射 I/O 寄存器和感兴趣页表条目的用户级虚拟内存映射。然而,最近的 Linux 发行版通常启用了 `CONFIG_STRICT_DEVMEM` 选项,这阻止了此类使用。因此,我们的 `/dev/sgx-step` 驱动包含一种 [方法](https://www.libcrack.so/index.php/2012/09/02/bypassing-devmem_is_allowed-with-kprobes/) 来绕过 `devmem_is_allowed` 检查,而无需重新编译内核。
### 2. Patch and install SGX SDK
为了便于注册自定义异步退出指针(AEP)存根,我们修改了官方 Intel SGX SDK 的不可信运行时。按以下步骤检出 [linux-sgx](https://github.com/01org/linux-sgx) v2.29 并应用我们的补丁。```bash
$ cd sdk/intel-sdk/
$ ./install_SGX_SDK.sh # tested on Ubuntu 20.04/22.04
$ source /opt/intel/sgxsdk/environment # add to ~/.bashrc to preserve across terminal sessions
$ sudo service aesmd status # stop/start aesmd service if needed
上述安装脚本已在 Ubuntu 22.04 LTS 上测试通过。 对于其他 GNU/Linux 发行版,请按照 linux-sgx 项目中的说明构建并安装 Intel SGX SDK 和 PSW 软件包。您还需要构建并加载(未修改的)linux-sgx-driver SGX 内核模块才能使用 SGX-Step。
注意(本地安装)。 修补后的 SGX SDK 和 PSW 软件包可以本地安装,而不会影响兼容的系统级 'linux-sgx' 安装。为此,示例 Makefile 支持一个指向本地 SDK 安装目录的 SGX_SDK 环境变量。当检测到非默认的 SDK 路径(即不是 /opt/intel/sgxsdk)时,"run" Makefile 目标还会动态链接到本地 linux-sgx 目录中构建的修补后的 libsgx_urts.so 不受信任运行时(使用 LD_LIBRARY_PATH 环境变量)。
注意(32位支持)。 构建 SGX SDK 和 SGX-Step 32位版本的说明(已过时且不再维护!)可在 README-m32.md 中找到。
用户空间应用程序可以链接到 libsgxstep 库,以利用 SGX-Step 的单步执行和页表操作功能。请查看 "app" 目录中的示例应用程序。

首先,检查 APIC 和中断描述符表设置:```bash $ cd app/selftest/idt $ make run # fires interrupts in an infinite loop to stress-test stability; exit with CTRL-C
例如,要构建并运行一个基础示例应用,以测试页表操作功能和SDK补丁:```bash
$ cd app/aep-redirect
$ make run
要测试计时器单步执行功能,可以尝试构建并运行一个基准飞地(enclave),以单步执行一段包含100条连续nop指令的代码:```bash
$ cd app/bench
$ NUM=100 make parse # alternatively vary NUM and use STRLEN=1 or ZIGZAG=1
上述命令构建了 `libsgxstep`、基准受害者飞地(victim enclave)以及不可信的攻击者主机进程,其中攻击场景和实例大小通过相应的环境变量配置。同一命令还会非交互式地运行生成的可执行文件(以确保确定性的计时器间隔),并最终调用攻击特定的后处理 Python 脚本,以解析生成的飞地指令指针基准测试结果。
**注意(性能)。** 对飞地执行进行单步调试会导致显著的性能下降。对于论文中描述的实验,我们测量到的执行时间长达 15 分钟。SGX-Step 的页表操作功能允许仅为选定的函数启动单步调试,例如通过撤销感兴趣的特定代码页或数据页的访问权限。
**注意(计时器间隔)。** 确切的计时器间隔值取决于 CPU 频率,因此本质上是平台相关的(参见 [app/selftest/apic](https://github.com/jovanbulck/sgx-step/blob/HEAD/app/selftest/apic) 中评估各种 APIC 计时器模式精度的详细微基准测试)。在 `/app/bench/main.c` 中配置合适的值。我们通过调整并观察 NOP 微基准测试的飞地指令指针跟踪结果,为评估平台建立了精确的计时器间隔(见下表),下文将进一步说明。
**注意(稳定性)。** 为避免 Linux 内核卡死或崩溃,SGX-Step 应在退出 `libsgxstep` 进程后自动恢复中断描述符表和本地 APIC 计时器。你可以按以下方式检查 APIC 计时器是否仍在所有核心上触发:```bash
$ watch -n0.1 "cat /proc/interrupts | grep 'Local timer interrupts'"
下表列出了当前支持的 Intel CPU,以及它们的单步 APIC 定时器间隔(libsgxstep/config.h)。
请注意,精确的单步间隔可能取决于处理器的微码版本,尤其是当启用了最近的瞬态执行攻击缓解措施(在飞地入口/出口刷新微架构缓冲区)时。
下表中提供了一些不同微码版本作为参考。
注意(校准)。
目前,配置可靠定时器间隔的最简单方法是使用 app/bench 基准测试工具,配合一个长 NOP 滑梯,并逐渐增加/减少 SGX_STEP_TIMER_INTERVAL。你可以从大约 20 开始,然后执行 NUM=100 make parse 获取包含 100 条指令的 NOP 滑梯的单步、零步和多步摘要(一旦你有了一个比较稳定的间隔,就可以切换到更长的滑梯)。过多的零步表明你需要增加定时器间隔,而多步则需要降低定时器间隔。
注意(过滤零步)。 重要提示:如果还有一些零步残留,不必担心,只要你在进步,就可以通过检查飞地的代码 PTE 访问位(只有当指令实际退役并发生单步时才会被设置)来确定性地过滤掉零步。因此,在配置了一个始终排除多步的保守定时器间隔后,SGX-Step 可以实现无噪音的单步,达到_完美_的指令级精度。
注意(扩展中断“着陆窗口”)。
如下面的根因分析所阐明的,页表遍历解析 ERESUME 之后的第一个飞地指令的(代码)地址越慢,中断“着陆窗口”就越长,因此 SGX-Step 的单步成功率就越高。例如,我们发现,除了清除飞地的 PMD 访问位之外,还可以通过在执行 ERESUME 之前从 CPU 缓存中刷新一个或多个不受保护的页表项来进一步扩展着陆窗口,从而强制 CPU 在页表遍历期间等待慢速内存。因此,当你找不到可靠的定时器间隔配置时,请确保 (i) 清除飞地的代码 PTE/PMD“访问”位,以及 (ii) 在 AEP 处理程序中刷新(CLFLUSH)一个或多个飞地页表项。
注意(微码)。 另一个注意事项涉及最近的 Foreshadow/ZombieLoad/RIDL 等微码缓解措施,这些措施会在飞地入口/出口刷新有泄漏风险的微架构缓冲区。请注意,当这些缓解措施启用时,定时器间隔需要增加,因为飞地进入时间变长(例如,在我的 i7-8650U CPU 上,我发现单步定时器间隔从使用预 Foreshadow 微码时的 34 增加到使用最新微码时的 54)。额外的刷新操作可能还会略微增加飞地进入时间的方差,这意味着你可能需要更保守地配置定时器,允许更多的零步(这些零步可以按照上述方法确定性地过滤掉)。
关于 SGX-Step 如何成功可靠地中断紧跟在复杂程度有名的 ERESUME 指令之后的第一个(可能非常短!)飞地指令的详细根因分析,描述在 AEX-Notify 论文中。我们发现 SGX-Step 成功的关键在于其使用了“访问”(A)位。具体来说,SGX-Step 在武装 APIC 以触发一次性中断之前,总是清除目标飞地页中间目录(PMD)中的 A 位。只有当飞地至少执行了一条指令时,处理器才会设置 A 位,因此它可以用来确定性地区分零步和单步。

关键在于,处理器的页面缺失处理程序针对常见快速路径进行了优化,并使用较慢的“微码辅助”来处理不太频繁且更复杂的情况(需要修改 PMD 或 PTE),这种辅助会延长 ERESUME 之后第一个飞地指令的执行时间,长达数百个周期。因此,这个“辅助窗口”有效地为粗粒度、呈正态分布的 APIC 定时器中断提供了一个宽敞的着陆空间,使其能够高精度地到达。
在自己的项目中使用 SGX-Step 框架的最简单方法是通过 git 子模块:```bash
$ cd my/git/project
$ git submodule add https://github.com/jovanbulck/sgx-step.git
$ cd sgx-step # Now build /dev/sgx-step and libsgxstep as described above
查看 `app` 目录中的 Makefile,了解客户端应用程序如何链接 `libsgxstep` 以及任何本地的 SGX SDK/PSW 包。
<a name="bottom"></a>
以下是已知使用 SGX-Step 的项目列表。如果你的项目使用了 SGX-Step 但未包含在下方,欢迎提交拉取请求。
| 标题 | 出版详情 | 源代码 | 使用的 SGX-Step 功能 |
| ---------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- | ------------------------------------------------------- |
| AEX-NStep: Probabilistic Interrupt Counting Attacks on Intel SGX | [S&P'26](https://arxiv.org/pdf/2510.14675) | [Zenodo](https://zenodo.org/records/17338383) | 页错误、IPI、WRMSR 中断门 |
| MDPeek: Breaking Balanced Branches in SGX with Memory Disambiguation Unit Side Channels | [ASPLOS'25](https://www.comp.nus.edu.sg/~tcarlson/pdfs/liu2025mbbbiswmdusc.pdf) | [GitHub (Artifact Evaluated & Functional)](https://github.com/CPU-THU/MDPeek) | 页错误 |
| Activation Functions Considered Harmful: Recovering Neural Network Weights through Controlled Channels | [RAID'25](https://ieeexplore.ieee.org/document/11352487) | [Github Artifact](https://github.com/heavyimage/afch_paper) | 单步执行、PTE A/D |
| TLBlur: Compiler-Assisted Automated Hardening against Controlled Channels on Off-the-Shelf Intel SGX Platforms | [USEC'25](https://vanbulck.net/files/usenix25-tlblur.pdf) | [GitHub (full)](https://github.com/TLBlur-SGX) | 单步执行、PTE A/D、页错误 |
| POSTER: On the Feasibility of Inferring SGX Execution through PMU | [AsiaCCS'24](https://dl.acm.org/doi/pdf/10.1145/3634737.3659434) | - | 单步执行、零步执行|
| SIGY: Breaking Intel SGX Enclaves with Malicious Exceptions & Signals | [ArXiv'24](https://arxiv.org/abs/2404.13998) | - | 定时器中断、页错误 |
| On (the Lack of) Code Confidentiality in Trusted Execution Environments | [S&P24](https://ivanpuddu.com/files/papers/TEE_WASM_code_Leakage.pdf) | [GitHub (empty)](https://github.com/dn0sar/TEE-WASM-Code-Extraction) | 单步执行 |
| TeeJam: Sub-Cache-Line Leakages Strike Back | [CHES24](https://doi.org/10.46586/tches.v2024.i1.457-500) | [Github (full)](https://github.com/UzL-ITS/teejam) | 单步执行中断延迟、PTE A/D |
| AEX-Notify: Thwarting Precise Single-Stepping Attacks through Interrupt Awareness for Intel SGX Enclaves | [USEC23](https://jovanbulck.github.io/files/usenix23-aexnotify.pdf) | [GitHub (SGX SDK mitigation)](https://github.com/intel/linux-sgx/blob/master/sdk/trts/linux/trts_mitigation.S) | 单步执行、PTE A/D
| Controlled Data Races in Enclaves: Attacks and Detection | [USEC23](https://www.usenix.org/system/files/usenixsecurity23-chen-sanchuan.pdf) | [GitHub (non-attack)](https://github.com/OSUSecLab/SGXRacer) | 单步执行、APIC |
| BunnyHop: Exploiting the Instruction Prefetcher | [USEC23](https://www.usenix.org/system/files/usenixsecurity23-zhang-zhiyuan-bunnyhop.pdf) | [GitHub (non-SGX PoC)](https://github.com/0xADE1A1DE/BunnyHop) | 单步执行、PTE A/D |
| Downfall: Exploiting Speculative Data Gathering | [USEC23](https://www.usenix.org/system/files/usenixsecurity23-moghimi.pdf) | [GitHub (non-SGX PoC)](https://github.com/flowyroll/downfall/tree/main/POC) | 单步执行、零步执行 |
| All Your PC Are Belong to Us: Exploiting Non-control-Transfer Instruction BTB Updates for Dynamic PC Extraction | [ISCA23](https://dl.acm.org/doi/pdf/10.1145/3579371.3589100?casa_token=Q5jf5nOgiLIAAAAA:cT0ltJh7vk943buODuR4oMFKmuhg2Tp-djFm2kUu6DzlxtBhNhEw2WteRggn0k99D7ft-P6pluVrFA) | - | 单步执行 |
| Cache-timing attack against HQC | [CHES23](https://eprint.iacr.org/2023/102.pdf) | - | 单步执行、PTE A/D |
| FaultMorse: An automated controlled-channel attack via longest recurring sequence | [ComSec23](https://www.sciencedirect.com/science/article/pii/S0167404822003959) | [GitHub (post processing)](https://github.com/Ezekiel-1998/FaultMorse) | 页错误 |
| AEPIC Leak: Architecturally Leaking Uninitialized Data from the Microarchitecture | [USEC22](https://www.usenix.org/system/files/sec22-borrello.pdf) | [GitHub (full)](https://github.com/IAIK/AEPIC) | 单步执行、PTE A/D |
| MoLE: Mitigation of Side-channel Attacks against SGX via Dynamic Data Location Escape | [ACSAC22](https://dl.acm.org/doi/fullHtml/10.1145/3564625.3568002) | - | 单步执行、页错误、瞬态执行 |
| WIP: Interrupt Attack on TEE-Protected Robotic Vehicles | [AutoSec22](https://www.ndss-symposium.org/wp-content/uploads/autosec2022_23001_paper.pdf) | - | 单步执行、多步执行 |
| Towards Self-monitoring Enclaves: Side-Channel Detection Using Performance Counters | [NordSec22](https://link.springer.com/chapter/10.1007/978-3-031-22295-5_7) | - | 页错误、LVI。 |
| ENCLYZER: Automated Analysis of Transient Data Leaks on Intel SGX | [SEED22](https://ieeexplore.ieee.org/document/9935016) | [GitHub (full)](https://github.com/bloaryth/enclyser) | 页表操作 |
| Side-Channeling the Kalyna Key Expansion | [CT-RSA22](https://cs.adelaide.edu.au/~yval/pdfs/ChuengsatiansupGYZ22.pdf) | - | 单步执行、PTE A/D |
| Rapid Prototyping for Microarchitectural Attacks | [USENIX22](https://www.usenix.org/system/files/sec22summer_easdon.pdf) | [GitHub (full)](https://github.com/libtea/frameworks) | 单步执行、页错误、PTE A/D 等 |
| Util::Lookup: Exploiting Key Decoding in Cryptographic Libraries | [CCS21](https://dl.acm.org/doi/abs/10.1145/3460120.3484783) | [GitHub (full)](https://github.com/UzL-ITS/util-lookup) | 单步执行、PTE A/D |
| SmashEx: Smashing SGX Enclaves Using Exceptions | [CCS21](https://dl.acm.org/doi/pdf/10.1145/3460120.3484821) | - | 单步执行 |
| Online Template Attacks: Revisited | [CHES21](https://tches.iacr.org/index.php/TCHES/article/view/8967/8545) | [Zenodo (simulation)](https://zenodo.org/record/4680071) | 单步执行、页错误、PTE A/D |
| Aion Attacks: Manipulating Software Timers in Trusted Execution Environment | [DIMVA21](http://individual.utoronto.ca/shengjiexu/publication/whuang-dimva2021-aion_v2.pdf) | - | 单步执行、中断(?) |
| Platypus: Software-based Power Side-Channel Attacks on x86 | [S&P21](https://platypusattack.com/platypus.pdf) | [GitHub (simulated PoC)](https://github.com/0xhilbert/Platypus) | 单步执行、零步执行 |
| CrossTalk: Speculative Data Leaks Across Cores Are Real | [S&P21](https://download.vusec.net/papers/crosstalk_sp21.pdf) | - | 单步执行、页错误 |
| Frontal Attack: Leaking Control-Flow in SGX via the CPU Frontend | [USEC21](https://www.usenix.org/system/files/sec21-puddu.pdf) | [GitHub (full, artifact evaluated)](https://github.com/dn0sar/frontal_poc) | 单步执行中断延迟、PTE A/D |
| PThammer: Cross-User-Kernel-Boundary Rowhammer through Implicit Accesses | - | [MICRO20](https://arxiv.org/pdf/2007.08707v2.pdf) | 页表遍历 |
| SpeechMiner: A Framework for Investigating and Measuring Speculative Execution Vulnerabilities | [NDSS20](https://www.ndss-symposium.org/wp-content/uploads/2020/02/23105-paper.pdf) | [GitHub (full)](https://github.com/teecert/SpeechMiner) | 页表操作 |
| Déjà Vu: Side-Channel Analysis of Mozilla's NSS | [CCS20](https://dl.acm.org/doi/pdf/10.1145/3372297.3421761) | - | 页错误 |
| From A to Z: Projective coordinates leakage in the wild | [CHES20](https://eprint.iacr.org/2020/432.pdf) | - | 页错误 |
| LVI: Hijacking Transient Execution through Microarchitectural Load Value Injection | [S&P20](https://lviattack.eu/lvi.pdf) | [GitHub (PoC)](https://github.com/jovanbulck/sgx-step-lvi/tree/master/app/lvi) | 单步执行、页表操作 |
| CopyCat: Controlled Instruction-Level Attacks on Enclaves | [USEC20](https://arxiv.org/pdf/2002.08437.pdf) | - | 单步执行、页错误、PTE A/D |
| When one vulnerable primitive turns viral: Novel single-trace attacks on ECDSA and RSA | [CHES20](https://eprint.iacr.org/2020/055.pdf) | - | 单步执行、页错误、PTE A/D |
| Big Numbers - Big Troubles: Systematically Analyzing Nonce Leakage in (EC)DSA Implementations | [USEC20](https://www.usenix.org/system/files/sec20summer_weiser_prepub_0.pdf) | - | 页错误 |
| Plundervolt: Software-based Fault Injection Attacks against Intel SGX | [S&P20](https://plundervolt.com/doc/plundervolt.pdf) | [GitHub (full)](https://github.com/KitMurdock/plundervolt) | 特权中断/调用门、MSR |
| Bluethunder: A 2-level Directional Predictor Based Side-Channel Attack against SGX | [CHES20](https://heartever.github.io/files/bluethunder_sgx_ches.pdf) | - | 单步执行 |
| Fallout: Leaking Data on Meltdown-resistant CPUs | [CCS19](https://mdsattacks.com/files/fallout.pdf) | - | PTE A/D |
| A Tale of Two Worlds: Assessing the Vulnerability of Enclave Shielding Runtimes | [CCS19](https://people.cs.kuleuven.be/~jo.vanbulck/ccs19-tale.pdf) | [GitHub (full)](https://github.com/jovanbulck/0xbadc0de) | 单步执行、页错误、PTE A/D |
| ZombieLoad: Cross-Privilege-Boundary Data Sampling | [CCS19](https://zombieloadattack.com/zombieload.pdf) | [GitHub (PoC)](https://github.com/IAIK/ZombieLoad/) | 单步执行、零步执行、页表操作 |
| SPOILER: Speculative Load Hazards Boost Rowhammer and Cache Attacks | [USEC19](https://arxiv.org/pdf/1903.00446.pdf) | - | 单步执行中断延迟 |
| Nemesis: Studying Microarchitectural Timing Leaks in Rudimentary CPU Interrupt Logic | [CCS18](https://people.cs.kuleuven.be/~jo.vanbulck/ccs18.pdf) | [GitHub (full)](https://github.com/jovanbulck/nemesis) | 单步执行中断延迟、页错误、PTE A/D |
| Foreshadow: Extracting the Keys to the Intel SGX Kingdom with Transient Out-of-Order Execution | [USEC18](https://foreshadowattack.eu/foreshadow.pdf) | [GitHub (PoC)](https://github.com/jovanbulck/sgx-step/tree/master/app/foreshadow) | 单步执行、零步执行、页表操作 |
| Single Trace Attack Against RSA Key Generation in Intel SGX SSL | [AsiaCCS18](https://rspreitzer.github.io/publications/proc/asiaccs-2018-paper-1.pdf) | - | 页错误 |
| Off-Limits: Abusing Legacy x86 Memory Segmentation to Spy on Enclaved Execution | [ESSoS18](https://people.cs.kuleuven.be/~jo.vanbulck/essos18.pdf) | [link (full, artifact evaluated)](https://distrinet.cs.kuleuven.be/software/off-limits/) | 单步执行、IA32 分段、页错误 |
| SGX-Step: A Practical Attack Framework for Precise Enclave Execution Control | [SysTEX17](https://people.cs.kuleuven.be/~jo.vanbulck/systex17.pdf) | [GitHub (full)](https://github.com/jovanbulck/sgx-step/tree/master/app/bench) | 单步执行、页错误、PTE A/D |
| Linux 内核参数 | 动机 |
|---|
nox2apic | 可选地将本地 APIC 设备配置为内存映射 I/O 模式(以利用 SGX-Step 的精确单步执行功能)。如果设置,请确保在 libsgxstep/config.h 中将 X2APIC 设置为 0。或者,您可以将 CPU 保留在 x2APIC 模式,最新的 SGX-Step 发行版也应兼容。 |
iomem=relaxed no_timer_check | 抑制内核日志中不必要的警告消息。 |
nmi_watchdog=0 | 抑制内核 NMI 看门狗。 |
isolcpus=1 | 将受害进程关联到隔离的 CPU 核心。 |
clearcpuid=308,295,514 | 禁用管理程序模式访问预防(SMAP,位 295)、管理程序模式执行预防(SMEP,位 308)和用户模式指令预防(UMIP,位 514)特性。 |
pti=off | 禁用内核页表隔离(以避免用户 IRQ 处理程序导致内核 panic)。 |
rcupdate.rcu_cpu_stall_suppress=1 | 禁用内核的读取-复制更新(RCU)CPU 停滞检测器(以避免长时间单步执行而不调用内核定时器中断处理程序时出现警告。) |
msr.allow_writes=on | 抑制 SGX-Step 对模型特定寄存器(MSR)写入的内核警告消息。 |
vdso=0 | 仅适用于最近的 Linux 内核:禁用 vdso_sgx_enter_enclave 库(与 AEP 拦截补丁不兼容)。 |
dis_ucode_ldr | 可选地禁用 CPU 微码更新(最近的瞬态执行攻击缓解措施可能需要重新校准单步执行间隔)。 |
| 型号名称 | CPU | 基础频率 | 微码(日期) | APIC 定时器间隔 |
|---|
| Skylake | i7-6700 | 3.4 GHz | ? | 19 |
| Skylake | i7-6500U | 2.5 GHz | ? | 25 |
| Skylake | i5-6200U | 2.3 GHz | ? | 28 |
| Kaby Lake R | i7-8650U | 1.9 GHz | ? | 34 |
| Kaby Lake R | i7-8650U | 1.9 GHz | 0xca (2019-10-03) | 54 |
| Coffee Lake R | i7-9700 | 3 GHz | 0xf4 (2022-07-31) | 26 |
| Coffee Lake R | i9-9900K | 3.6 GHz | ? | 21 |
| Coffee Lake HR | i7-9750H | 2.6 GHz | 0xf4 (2023-02-23) | 37 |
| Ice Lake | i5-1035G1 | 1.00 GHz | 0x32 (2019-07-05) | 135 |
| Ice Lake | i5-1035G1 | 1.00 GHz | 0xb0 (2022-03-09) | 255 |
| Comet Lake | i9-10900K | 3.70 GHz | 0xfc (2024-02-01) | 24 |
| Emerald Rapids | Xeon Gold 5515+ | 3.2 GHz | 0x21000230 (2024-02-05) | 32 |