tailsmails/ramoops
GitHub: tailsmails/ramoops
一个演示 AArch64 架构下 Flush+Reload 缓存侧信道攻击原理的教育性概念验证工具。
Stars: 0 | Forks: 0
# ramoops (AArch64 Flush+Reload Cache 侧信道)
这是一个演示 AArch64 (ARM64) 架构下 **Flush+Reload** 缓存侧信道分析的教育性概念验证工具。
该工具演示了如何在用户空间级别 (EL0) 测量 CPU Cache 与 DRAM 访问之间的时间差异,从而推断出内存访问模式。它具备**动态阈值校准**功能,并引入了 **Fisher-Yates 洗牌算法**,以减轻激进的硬件预取器带来的影响。
## 功能特性
- **AArch64 内联汇编**:利用原生的 ARM64 汇编指令(使用 `cntvct_el0` 读取高分辨率系统虚拟计数器,使用 `dc civac` 进行由硬件强制执行的缓存行刷新)。
- **动态校准**:在当前系统负载下,自动测量并计算出区分 L1/L2 Cache 命中与 DRAM 访问的时间阈值。
- **预取器绕过**:使用 Galois LFSR 伪随机数生成器实现了非线性 Fisher-Yates 索引洗牌技术,防止硬件步长预取器过早加载相邻的缓存行。
- **V 语言与 C 语言混合实现**:使用 V 编程语言编写,并将性能关键的原语卸载到内联 C 函数中执行。
## 工作原理
分析过程分为四个不同的阶段运行:
1. **校准**:该工具反复刷新一个测试内存地址并测量 DRAM 延迟,随后再次访问该地址以测量 Cache 延迟。它将这两个值的平均值作为动态决策阈值。
2. **Flush 阶段**:使用 `dc civac` 指令将受监控的缓冲区完全从缓存层级中驱逐出去。
3. **Victim 访问(模拟)**:“受害者”访问与 `secret_byte`(例如 `85 * page_size`)相对应的特定内存偏移量,将该特定的缓存行重新带入缓存中。
4. **Reload 阶段**:该工具探测所有 256 个可能的偏移量。为了绕过硬件预取器,探测顺序通过洗牌后的索引数组进行了完全随机化处理。如果某个偏移量的访问延迟低于校准阈值,则将其记录为一次 Cache 命中。
5. **统计分析**:将记录到 Cache 命中次数最多的字节索引确定为恢复出的秘密数据。
## 前置条件
- **AArch64** 硬件平台(例如 Raspberry Pi 4/5、Pine64、ARM64 Android 设备或 Apple Silicon/ARM64 服务器)。
- 具备对虚拟计数器(`cntvct_el0`)和缓存维护指令(`dc civac`)的用户空间访问权限。*注意:在某些 Linux 内核配置中,EL0 级别对这些指令的访问可能会受到限制。*
- 已安装 **V 编译器** (Vlang)。
- 配置好用于 AArch64 编译的 **GCC** 或 **Clang**。
## 编译与执行
使用 V 编译器并以 GCC 作为后端来编译程序:
```
v -cc gcc ramoops.v
```
运行编译后的可执行文件:
```
./ramoops
```
## 技术细节
### 缓存计时原语 (`helper.c`)
高分辨率计时是通过使用指令屏障 (`isb`) 指令隔离内存读取来实现的,以防止乱序执行对结果造成偏差:
```
__asm__ volatile(
"isb\n\t"
"mrs %0, cntvct_el0\n\t"
"isb"
: "=r" (t0)
:
: "memory"
);
```
### 驱逐原语 (`helper.c`)
缓存行驱逐使用了按照虚拟地址执行数据缓存清理和失效至一致性点 (`dc civac`) 的指令,随后执行数据同步屏障 (`dsb sy`) 和指令同步屏障 (`isb`):
```
__asm__ volatile("dc civac, %0\n\tdsb sy\n\tisb" : : "r" (ptr) : "memory");
```
## 许可证

标签:AArch64, Cache侧信道, Flush+Reload, V语言, 侧信道分析, 硬件安全