为何Flush+Reload在c906 CPU上失效,Evict+Reload却可成功执行?
问题解答:RISC-V哈佛架构下Evict+Reload与Flush+Reload的差异
核心前提先明确:RISC-V的哈佛架构里,I-Cache(指令缓存)和D-Cache(数据缓存)是物理独立、无共享缓存行的,这是两种攻击表现天差地别的根本原因。
为什么Flush+Reload的Reload步骤行不通?
Flush+Reload的常规流程是:
- 攻击者用
flush类指令把目标指令所在的缓存行从I-Cache清掉 - 等待目标执行(或不执行)该指令
- 攻击者从数据侧读取该指令的内存地址,试图通过读取时间判断缓存是否命中——理论上如果目标执行过,I-Cache会缓存它,读取应该更快?
但在哈佛架构下这步完全失效:
- 攻击者从数据侧读取时,只会操作D-Cache,和I-Cache的状态半毛钱关系都没有。不管目标有没有执行过该指令,攻击者数据侧的Reload都只会加载到D-Cache,根本感知不到I-Cache的命中情况,自然拿不到有效侧信道信号。
为什么Evict+Reload的Reload步骤能成功?
Evict+Reload的核心是绕开了数据侧和指令侧的缓存隔离,流程逻辑是:
- 利用缓存的组相联映射特性:很多RISC-V核的I-Cache和D-Cache用的是相同的索引计算规则,攻击者可以在数据侧访问一组和目标指令缓存行同组的内存地址,把目标指令的I-Cache行给挤出去(也就是Evict操作)
- 等待目标执行(或不执行)该指令
- 攻击者直接触发对目标指令地址的取指操作(比如跳转到该地址执行,或者用特殊指令触发取指),通过测量取指的时间差判断:
- 如果目标执行过该指令,I-Cache已经重新缓存了它,攻击者取指速度快
- 如果目标没执行过,攻击者取指需要从内存加载,速度慢
这里的Reload是直接操作指令侧的I-Cache,完全对应目标指令的缓存状态,所以能有效拿到侧信道信息。
内容的提问来源于stack exchange,提问作者pinpox
相关产品推荐
相关产品推荐

