工具概述
类似 Intel SGX 这样的可信执行环境能够保证目标计算机在受到网络攻击或入侵的时候, 仍然能够保证敏感计算不受影响. 而本文所介绍的 SGX-Step 是一款针对 Intel SGX 平台的开源测信道攻击研究框架, SGX-Step 由一个 Linux 内核驱动器和用户空间库组成, 它将允许我们配置不受信任的页表条目并完全从用户空间环境 (Enclave) 中断 x86 APIC 计时器. 我们提出并评估了一种改进的从指令级粒度上出发的单步 Enclave 执行技术, 并演示了 SGX-Step 如何来执行多种高级攻击.
与以前的 Enclave 抢占方案不同, SGX-Step 设计的关键是为了保存页表项的物理内存位置以及本地 APIC 内存映射 I/O 配置寄存器和 x86 中断描述符表 (IDT). 这将允许不受信任的主机进程(攻击者控制) 轻松 (i) 跟踪或修改 Enclave 页表条目,(ii)配置 APIC 计时器的一次性 / 定期中断源,(iii)触发内部处理器中断,(iv)以及完全在用户空间中注册自定义的中断处理程序.
下图中显示的是我们的框架中断和恢复 SGX Enclave 时的硬件和软件操作步骤:
, 本地 APIC 计时器中断抵达一个加密指令内.
, 处理器执行 AEX 过程, 该过程安全地将执行上下文存储在 enclave 的 SSA 帧中, 初始化 CPU 寄存器, 并将向量存储到 IDT 中注册的 (用户空间) 中断处理程序.
, 此时, 任何特定于攻击的间谍代码都可以轻松插入.
, 代码库会返回至用户空间 AEP. 我们修改了官方 SGX SDK 的不受信运行时环境, 以便轻松注册自定义 AEP stub.
, 接下来, 我们在执行(6)ERESUME 之前, 通过写入初始计数 MMIO 寄存器, 为下一个中断配置本地 APIC 计时器.
项目构建 & 运行
SGX-Step 需要使用到一个 SGX-capabel https://github.com/ayeks/SGX-hardware Intel 处理器以及一个 Linux 内核. 我们将其升级为了 i7-6500U/6700 CPU, 并且能够在 Ubuntu 16.04(内核版本 4.15.0)平台上运行. 相关的 Linux 内核参数如下:
Linux 内核参数
| 功能
|
---|---|
nox2apic
| 在内存映射 I/O 模式下配置本地 APIC 设备(以利用 SGX-Step 的精确单步执行功能)。
|
iomem=relaxed, no_timer_check
| 过滤内核日志中不需要的警告消息。
|
isolcpus=1
| 将目标进程与一个独立的 CPU 核心关联起来。
|
dis_ucode_ldr
| 禁用 CPU 微码更新。
|
我们可以通过下列方式来将相应启动参数传递至内核执行:
- $ sudo VIM /etc/default/grub
- # GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nox2apic iomem=relaxed no_timer_check isolcpus=1"
- $ sudo update-grub && sudo reboot
最后, 为了复现我们的研究成果, 请确保在 BIOS 中禁用了了 C-States 和 SpeedStep 技术. 下表中列出的是该工具目前所支持的 Intel CPU 以及相应的单步 APIC 计时器间隔(libsgxstep/config.h):
模块名称
| CPU
| 频率
| APIC 计时器间隔
|
---|---|---|---|
Skylake | i7-6700 https://ark.intel.com/products/88196
| 3.4 GHz | 19 |
Skylake | i7-6500U https://ark.intel.com/products/88194
| 2.5 GHz | 25 |
Skylake | i5-6200U https://ark.intel.com/products/88193
| 2.3 GHz | 28 |
Kaby Lake R | i7-8650U https://ark.intel.com/products/124968
| 1.9 GHz | 34 |
Coffee Lake R | i9-9900K https://ark.intel.com/products/186605
| 3.6 GHz | 21 |
1, 修复和安装 SGX SDK
为了启用和注册自定义的 AEP stub, 我们修改了官方 Intel SGX SDK 的不受信运行时环境:
- $ Git submodule init
- $ Git submodule update
- $ ./install_SGX_driver.sh # tested on Ubuntu 16.04
- $ ./patch_sdk.sh
- $ ./install_SGX_SDK.sh # tested on Ubuntu 16.04
2, 构建和加载 / dev/sgx-step
SGX-Step 自带了可加载的内核模块, 支持导出 IOCTL 接口. 运行下列命令即可构建和加载 / dev/sgx-step 驱动器:
- $ cd kernel
- $ make clean load
3, 构建并运行测试应用
- $ cd App/bench
- $ NUM=100 STRLEN=1 make parse # alternatively vary NUM and use BENCH=1 or ZIGZAG=1
- $ # (above command defaults to the Dell Inspiron 13 7359 evaluation laptop machine;
- $ # use DESKTOP=1 to build for a Dell Optiplex 7040 machine)
- $ # use SGX_SDK=/home/jo/sgxsdk/ for a local SDK installation
- $ # use M32=1 To produce a 32-bit executable
在项目中使用 SGX-Step
如果你想在自己的项目中使用 SGX-Step 的话, 最简单的方法就是通过 Git 子模块 来使用:
- $ cd my/Git/project
- $ Git submodule add [email protected]:jovanbulck/sgx-step.Git
- $ cd sgx-step # Now build `/dev/sgx-step` and `libsgxstep` as described above
接下来, 进入 App 目录并查看 Makefiles, 我们将会看到一个客户端应用程序与 libsgxstep 以及其他本地 SGX SDK/PSW 包建立了连接.
项目地址
SGX-Step:[ GitHub 传送门 https://github.com/jovanbulck/sgx-step ]
来源: http://www.tuicool.com/articles/eIFFnav