cliu2025/pitfall

GitHub: cliu2025/pitfall

Pitfall 是一个学术安全研究工件,演示了针对 Intel CPU 存储转发预测器(SFP)的新型侧信道瞬态执行攻击及网站指纹攻击。

Stars: 0 | Forks: 0

# 陷阱 ## 简介 本研究发现了 Intel CPU 中存在 Store Forwarding Predictor (SFP),并提出了 Pitfall,一种基于该预测器的新型侧信道攻击。 SFP 用于预测具有未知数据依赖性的存储-加载(store-load)对是否访问相同的内存地址。如果预测为相同,CPU 会在数据依赖性解决之前,推测性地将存储数据旁路(bypass)到加载指令处,从而提高内存指令的并行性。我们的研究表明,Intel 的 SFP 可以在不同的存储-加载对之间共享预测表项(prediction table entries)。具体而言,当存储和加载的虚拟地址的最低 16 位相同时,就会发生表项冲突,从而实现跨地址的训练和利用。此外,我们发现 SFP 在上下文切换时会被刷新。虽然这确保了不同进程和特权级别之间的隔离,但也暴露了一个新的攻击面:利用 SFP 来检测中断的发生。 Pitfall 包含两种新型瞬态执行攻击(Pitfall-v1 和 Pitfall-v2)以及一种网站指纹攻击(Pitfall-v3)。这三种攻击的流程如下图所示(论文中的图 4)。 ![Pitfall 攻击概述](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/8e66e5d2cb003833.png) Pitfall-v1 利用 SFP 预测错误引起的瞬态执行,在单个进程内实现了一种就地(in-place)Spectre 攻击。Pitfall-v2 利用 SFP 可以在不同地址的存储-加载指令对之间共享预测表项的特性,在单个进程内实现了一种异位(out-of-place)Spectre 攻击。Pitfall-v3 利用了 SFP 在上下文切换时会被刷新的行为。 此工件(artifact)的整体架构如下: ``` . ├── config.json # Customized configuration file ├── environment.yml # Dependent python packages ├── fingerprinting-env-setup.sh # Pitfall-v3 browser environment setup ├── py-env-setup.sh # Python environment setup ├── LICENSE ├── README.md ├── main.py # Main entry for the testing program ├── fingerprinting # Codes related to Pitfall-v3 website fingerprinting ├── figure # Experimental result charts and sample images ├── lib # Entry for each experiment │ ├── fig2.py # SFP existence identification, corresponds to Fig. 2 │ ├── fig3.py # SFP cross-address collision, corresponds to Fig. 3 │ ├── fig6.py # Pitfall-v1 leakage accuracy evaluation, corresponds to Fig. 6 │ ├── poc.py # Attack PoC examples for Pitfall-v1 and Pitfall-v2 │ ├── v1.py # Pitfall-v1 evaluation, corresponds to Table 2 | ├── v2.py # Pitfall-v2 evaluation, corresponds to Table 2 │ └── v3.py # Pitfall-v3 evaluation, corresponds to Fig. 8 └── src # Implementation code for all experiments ├── existence # SFP existence identification, corresponds to Fig. 2 │ ├── fig-2.c │ ├── fig-2.make │ └── fig-2.S ├── org # SFP cross-address collision, corresponds to Fig. 3 │ ├── fig-3.c │ ├── fig-3.make │ └── fig-3.S ├── pitfall-v1 # Pitfall-v1 │ ├── eval.c │ ├── fig-6.make │ ├── poc.c │ ├── v1.make │ └── v1-poc.make ├── pitfall-v2 # Pitfall-v2 │ ├── eval.c │ ├── poc.c │ ├── v2.make │ └── v2-poc.make └── pitfall-v3 # Interrupt probing code for Pitfall-v3 ├── asm.S ├── eval.c └── main.c ``` ## 环境设置 此代码使用 `conda` 来创建 Python 环境。我们建议使用以下命令安装 Miniconda: ``` curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh ``` 接下来,按照 `Miniconda3-latest-Linux-x86_64.sh` 脚本中的说明完成 `conda` 的安装。然后,运行以下命令来设置 Python 环境: ``` ./py-env-setup.sh ``` 预期输出如下: ``` ... Solving environment: done # # 要激活此环境,请使用 # # $ conda activate pitfall-env # # 要停用一个处于激活状态的环境,请使用 # # $ conda deactivate ``` 接下来,运行以下命令来配置浏览器测试环境: ``` ./fingerprinting-env-setup.sh ``` 预期输出如下: ``` ... Creating executable shortcuts... Chrome version: Google Chrome for Testing 149.0.7827.55 ChromeDriver version: ChromeDriver 149.0.7827.55 (3188f8a607ae7e067593be8aab7f02d2451fec07-refs/branch-heads/7827@{#1982}) ``` ### (可选)VNC 设置 我们建议在配备了 GUI 的 Linux 操作系统(例如 Ubuntu 24.04.1 LTS)上运行 Pitfall-v3 实验,方法是登录到桌面环境并启动终端。 如果您需要通过远程连接进行实验,则需要在远程设备上配置 VNC 服务器,并在本地机器上配置 VNC 查看器。配置过程如下: #### 1. 在远程服务器上安装 VNC 服务器和桌面环境 ``` sudo apt update sudo apt install -y tigervnc-standalone-server tigervnc-common xfce4 xfce4-goodies xfce4-session xfwm4 xfdesktop4 xfce4-panel dbus-x11 x11-xserver-utils xterm ``` #### 2. 设置 VNC 密码 ``` vncpasswd ``` #### 3. 配置 VNC 启动脚本 ``` mkdir -p ~/.vnc cat > ~/.vnc/xstartup <<'EOF' #!/bin/sh unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS unset WAYLAND_DISPLAY unset XDG_SESSION_PATH unset XDG_RUNTIME_DIR export XKL_XMODMAP_DISABLE=1 export XDG_SESSION_TYPE=x11 export DESKTOP_SESSION=xfce export XDG_CURRENT_DESKTOP=XFCE xrdb "$HOME/.Xresources" 2>/dev/null || true exec dbus-launch --exit-with-session startxfce4 EOF chmod +x ~/.vnc/xstartup ``` #### 4. 启动 VNC 服务器 ``` vncserver :1 -localhost yes -geometry 1920x1080 -depth 24 -xstartup "$HOME/.vnc/xstartup" ``` VNC 显示器 `:1` 对应于端口 `5901`。 检查 VNC 服务器是否正在运行: ``` vncserver -list ss -lntp | grep 5901 ``` ## 构建与运行 激活创建的 Python 虚拟环境: ``` conda activate pitfall-env ``` 所有实验均通过 `main.py` 执行,并接受命令行参数: ``` main.py [-E ] [-C ] ``` 在这里,`` 指定要运行的实验,包括以下选项: - `fig2`:SFP 存在性识别实验,对应论文中的图 2 - `fig3`:SFP 跨地址冲突实验,对应论文中的图 3 - `fig6`:Pitfall-v1 泄漏不同长度数据的准确率评估,对应论文中的图 6 - `v1`:Pitfall-v1 评估,对应论文中的表 2 - `v2`:Pitfall-v2 评估,对应论文中的表 2 - `v3`:用于识别特定网站的 Pitfall-v3 PoC,对应论文中的图 8 - `v1-poc`:Pitfall-v1 字符串泄漏 PoC 示例 - `v2-poc`:Pitfall-v2 字符串泄漏 PoC 示例 - `default`:依次执行 fig2、fig3、fig6、v1 和 v2 实验(默认) 此外,`` 表示 SFP 实验/利用代码绑定到的处理器核心 ID。默认值为系统支持的最大处理器核心 ID。 ### 预期输出 根据实验的不同,结果将按如下方式生成: - `fig2`、`fig3`、`fig6` 和 `v3`:生成的图表将保存在 `figure` 目录中。请注意,此目录已经包含了几个在 Intel Xeon 6982P-C CPU 上生成的示例图表供参考。 - `v1` 和 `v2`:性能统计数据将直接打印到控制台。预期输出类似于以下内容: Evaluation on Pitfall-v1 Evaluation on Pitfall-v1: Accuracy: 1.0 Throughput: 2606.35 Number of Function calls: 82.3 ------------------ Evaluation on Pitfall-v2 Evaluation of Pitfall-v2: Accuracy: 1.0 Throughput: 2536.23 Number of Function calls: 3.21 ------------------ - `v1-poc` 和 `v2-poc`:泄漏的字符串将输出到控制台。 ### 自定义配置 可以修改配置文件 `config.json` 以自定义攻击配置。目前支持的属性包括: - `fig6_test_byte_range`:运行与图 6 相关的实验时(即 Pitfall-v1 泄漏不同长度数据的准确率评估)泄漏字节的最大长度 - `pitfall_v1_eval_byte_size`:运行 Pitfall-v1 评估实验时泄漏字节的长度 - `pitfall_v2_eval_byte_size`:运行 Pitfall-v2 评估实验时泄漏字节的长度 - `pitfall_v1_poc_string`:运行 Pitfall-v1 PoC 代码时,存储在受害者内存空间中的待泄漏目标字符串 - `pitfall_v2_poc_string`:运行 Pitfall-v2 PoC 代码时,存储在受害者内存空间中的待泄漏目标字符串 - `pitfall_v3_number_of_sites`:Pitfall-v3 中评估的网站数量 ## 研究论文 有关详细的方法和实验评估,请参阅论文 **Pitfall: Uncovering and Exploiting the Store Forwarding Predictor on Intel CPUs**,该论文已被 *第 17 届高级并行处理技术国际研讨会 (APPT 2026)* 收录。 ## 许可证 该项目采用 GPL-3.0 许可证。
标签:CPU安全, Spectre, 侧信道攻击, 实时处理, 底层安全研究, 瞬态执行攻击, 网站指纹识别, 逆向工具