Abhinavmadake/aes-cache-side-channel-attack
GitHub: Abhinavmadake/aes-cache-side-channel-attack
该项目利用 gem5 架构模拟器周期精确地复现了 Flush+Reload 缓存侧信道攻击,通过观测 AES 查找表的缓存时序差异完整恢复 128 位密钥。
Stars: 0 | Forks: 0
# AES 缓存侧信道攻击模拟
这是一个基于 [gem5](https://www.gem5.org/) 架构模拟器构建的、针对 AES 加密的** Flush+Reload **缓存时序侧信道攻击的周期精确模拟。该攻击利用 T-table 查找模式,通过观察缓存命中/未命中延迟差异,恢复完整的 **128 位 AES 密钥**。
## 概述
使用**查找表(T-table)**的 AES 实现容易受到基于缓存的侧信道攻击。当 CPU 在加密过程中访问 T-table 条目时,它会在缓存中留下足迹。能够刷新缓存并测量重载时间的攻击者可以确定访问了*哪些*表条目——并由此恢复密钥。
本项目完整演示了该攻击的端到端过程:
1. **Flush(刷新)** — 使用 `clflush` 将整个 T-table 从缓存中驱逐
2. **Victim Encrypt(受害者加密)** — 受害者加密单个字节,将一个 T-table 条目加载到缓存中
3. **Reload & Time(重载与计时)** — 使用 `rdtscp` 测量访问时间,以识别哪个条目被缓存了(命中 vs. 未命中)
4. **Recover Key Byte(恢复密钥字节)** — 将缓存索引与已知明文进行 XOR 运算以恢复密钥字节
5. **Repeat(重复)** — 遍历所有 16 个字节以恢复完整的 128 位密钥
```
┌─────────────────────────────────────────────────────────┐
│ Attack Flow │
│ │
│ Flush T-table ──▶ Victim Encrypts ──▶ Reload & Time │
│ │ │
│ Cache Hit? ──▶ Yes│
│ │ Key = i│ ⊕ plaintext
│ Cache Miss?──▶ No │
│ (skip) │
└─────────────────────────────────────────────────────────┘
```
## 架构
模拟运行在 **gem5** 的 **系统调用模拟(SE)** 模式下,具有以下微架构配置:
| 组件 | 配置 |
|---|---|
| **ISA** | X86 |
| **CPU 模型** | TimingSimpleCPU @ 1 GHz |
| **L1 指令缓存** | 16 KiB,2 路组相联 |
| **L1 数据缓存** | 64 KiB,2 路组相联 |
| **L2 缓存** | 256 KiB,8 路组相联 |
| **内存** | DDR3-1600 (8×8) |
| **缓存行大小** | 64 bytes |
| **模式** | 系统调用模拟(SE) |
## 项目结构
```
aes-cache-side-channel-attack/
├── src/
│ └── aes_attack.c # Flush+Reload attack implementation
├── configs/
│ ├── two_level.py # gem5 simulation config (CPU + 2-level cache)
│ └── caches.py # L1/L2 cache class definitions
├── results/
│ ├── stats.txt # gem5 simulation statistics
│ └── config.json # Full gem5 configuration dump
└── README.md
```
## 快速开始
### 前置条件
- 为 X86 ISA 构建的 **gem5** 模拟器([构建说明](https://www.gem5.org/documentation/general_docs/building))
- 支持 x86 intrinsics 的 **GCC**
### 1. 构建 gem5(如果尚未构建)
```
cd /path/to/gem5
scons build/X86/gem5.opt -j$(nproc)
```
### 2. 编译攻击二进制文件
```
gcc -O0 -static -o aes_attack src/aes_attack.c
```
### 3. 运行模拟
```
./build/X86/gem5.opt configs/two_level.py aes_attack --key 00112233445566778899AABBCCDDEEFF
```
### 4. 分析结果
模拟统计数据将写入 `m5out/stats.txt`。需要关注的关键指标:
```
grep -E "dcache.demand(Hits|Misses|MissRate)" m5out/stats.txt
```
## 结果
攻击成功恢复了 128 位 AES 密钥的全部 **16 个字节**:
```
====================================================
AES CACHE SIDE-CHANNEL ATTACK (MULTI-ROUND)
====================================================
Byte # | Plaintext | Hit Index | Time (cyc) | Stolen Key
---------|--------------|------------|--------------|-----------
#00 | 0x00 | 0x00 | ... | 0x00
#01 | 0x11 | 0x22 | ... | 0x33
...
#15 | 0xFF | 0xEE | ... | 0xFF
[STATUS] SUCCESS: Full 128-bit key recovered!
====================================================
```
### 关键模拟指标
| 指标 | 值 |
|---|---|
| 总指令数 | 991,528 |
| CPI | 4.55 |
| 数据缓存命中率 | 98.67% |
| 数据缓存未命中数 | 6,214 |
| 平均未命中延迟 | ~103,220 ticks |
| 模拟时间 | ~4.5 ms(模拟时间) |
缓存**命中**(约几个周期)与**未命中**(约 103K ticks)之间的时序差异使得攻击成为可能——攻击者可以清楚地区分受害者加载了哪个 T-table 条目。
## 工作原理(技术细节)
### T-table 漏洞
AES 的 SubBytes + MixColumns 通常被优化为一组**查找表**(`Te0`, `Te1`, `Te2`, `Te3`),每个表有 256 个条目。表索引取决于:
```
index = plaintext[i] ⊕ key[i]
```
由于攻击者控制着 `plaintext[i]` 并且可以通过缓存时序确定 `index`,因此他们可以计算出:
```
key[i] = index ⊕ plaintext[i]
```
### Flush+Reload 技术
```
// 1. FLUSH — evict T-table from cache
for (int i = 0; i < 256; i++)
_mm_clflush(&Te0[i * CACHE_LINE_SIZE]);
// 2. VICTIM — encrypts, loading Te0[index] into cache
victim_encrypt_single_byte(plaintext[b], secret_key[b]);
// 3. RELOAD — time each entry; cache hit = victim accessed it
uint64_t t1 = __rdtscp(&junk);
volatile uint8_t temp = Te0[i * CACHE_LINE_SIZE];
uint64_t t2 = __rdtscp(&junk);
if ((t2 - t1) < threshold) // Cache hit detected!
recovered_key[b] = i ^ plaintext[b];
```
## 缓解措施
本项目演示了*为什么*需要以下防御措施:
| 缓解措施 | 如何提供帮助 |
|---|---|
| **AES-NI**(硬件指令) | 彻底消除 T-table 查找 |
| **常量时间实现** | 没有依赖于数据的内存访问 |
| **缓存分区** | 隔离受害者和攻击者的缓存行 |
| **ORAM / 混淆访问** | 以牺牲性能为代价隐藏访问模式 |
## 参考文献
- Bernstein, D.J. (2005). *Cache-timing attacks on AES* — [论文](https://cr.yp.to/antiforgery/cachetiming-20050414.pdf)
- Yarom, Y. & Falkner, K. (2014). *FLUSH+RELOAD: A High Resolution, Low Noise, L3 Cache Side-Channel Attack* — [论文](https://eprint.iacr.org/2013/448.pdf)
- gem5 Simulator — [gem5.org](https://www.gem5.org/)
## 许可证
本项目仅供**教育和研究目的**使用。此攻击代码是一个概念验证,旨在演示微架构漏洞,不得用于恶意目的。
标签:AES, Flush+Reload, 侧信道攻击, 密码学, 手动系统调用, 架构模拟器, 缓存时序攻击