Spectre 漏洞PoC的移植测试

为了证实Spectre漏洞对于龙芯3A的影响,我对 https://github.com/Eugnis/spectre-attack 这个PoC进行了MIPS下的移植。
因为我并不完全理解这个漏洞的工作原理,我仅仅是把其中X86相关的指令用我认为类似的MIPS架构下的类似指令实现,大致的替代方案是 rdtsc(p)使用MIPS下的dmfc0将 Coprosser 0中的9号Count寄存器拷贝到通用寄存器来读取指令Count(dmfc0 %0, $9)(精确到两个时钟周期,相比rdtsc的一个周期还是有所不足,不过这已经是MIPS下精度最高的时钟寄存器了。)
而cflush缓存刷新指令,则通过SYSMIPS这个System Call(系统调用)下的 FLUSH_CACHE 指令来进行(syscall(sysmips, FLUSH_CACHE, NULL, NULL);),这个指令是用户态下唯二的可以刷新缓存的指令。但是相较cflush而言的不足是cflush可以清除指定线性地址的缓存,而这个syscall只能清除全局缓存。另一个cacheflush指令
看似可以刷新指定线性地址缓存,而仔细读了读内核代码发现虽然Linux-MIPS Wiki上有记载(https://www.linux-mips.org/wiki/Cacheflush_Syscall  ),但并没有在内核中实现。
我在龙芯云平台3A2000的Docker中编译运行,接近两个小时都没有利用成功。
 
关于失败的原因,可能是因为我这样粗暴的移植不行,也可能是是因为每次都刷新全局缓存效率太低,还有可能是龙芯CPU主频太低,或者其他因素。当然,我认为最好的情况就算龙芯处理器上根本不存在这个漏洞。如果我的移植可靠的话,那么即使存在,利用难度也会很大。
 

9 个评论

@xen0n @lemote1 这是我测试PoC的结果
@xen0n @lemote1 这是我测试PoC的结果
更新:感谢“龙芯用户与开发者”群中“知而无知”的启发,我重新理解了一下这个漏洞的原理。因为这是利用缓存回写本身不更新的特性,所以clflush的必须是指定线性地址的缓存。而目前为止MIPS用户空间还没有可以实现刷新单个线性地址缓存的指令。。。所以我的PoC无效,也要想一个更好的利用方法。
要不我先去手动实现以下cacheflush指令(逃
cacheflush 不是在 arch/mips/mm/cache.c 有一个实现么?虽然刷的是 icache。。
但是存进去的东西不能用icache。。。
先把 sysmips 的 flushcache 操作的范围实现吧,可以用 rdhwr reg, $2读取 count,3a2000及之后版本可以用 rdhwr reg,$30 读取外部时钟(好做是64位)。源代码中的时间阀值应该也要调整吧。
时间阀值×2了,这个实现docker我动不了内核。等我3A2000设备到了试试。
老兄,spectre的poc移植成功了么

要回复文章请先登录注册