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-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, 侧信道攻击, 实时处理, 底层安全研究, 瞬态执行攻击, 网站指纹识别, 逆向工具