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, 侧信道攻击, 密码学, 手动系统调用, 架构模拟器, 缓存时序攻击