找回密码
 立即注册
搜索
查看: 12744|回复: 63

[硬件] Spectre 攻击的漏洞演示的实验结果

[复制链接]
发表于 2018-1-4 20:28 | 显示全部楼层 |阅读模式
这几天爆出的和Intel CPU 分支预测有关的漏洞有Meltdown和Spectre两个,前者的Windows版PoC我没有跑成功。后者的我是跑成功了。
https://spectreattack.com/spectre.pdf最后的例子稍微改了一下改出来的。程序使用了SSE2的指令
i5 2520M:

i7 2720QM:

Atom Z3735F:


在其他CPU,Atom N270,N2600,赛扬 353 上程序全都崩溃。据他人测试,AMD A10-5757M下能够运行成功,但是读不出正确的结果。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 4战斗力 +5 收起 理由
电动犀牛 + 1 思路广
何尚生 + 2 欢乐多
andychen + 1 好评加鹅
爱夏 + 1 好评加鹅

查看全部评分

回复

使用道具 举报

     
发表于 2018-1-4 21:26 | 显示全部楼层
读不出正确结果就不慌了啊,你得加上这句

  -- 来自 能看大图的 Stage1官方 iOS客户端
回复

使用道具 举报

     
发表于 2018-1-4 21:32 | 显示全部楼层
可怕……AMD处理器可能由于缓存细节设计不同读取方法细节有差异所以读不出有效数据,但是真正的攻击者攻击完全可以用这个漏洞读取出整个内核内存的内容,AMD处理器一样不安全
回复

使用道具 举报

     
发表于 2018-1-4 22:05 | 显示全部楼层
本帖最后由 星空天神 于 2018-1-4 22:51 编辑

void victim_function(size_t x) {
    if (x < array1_size) {
         temp &= array2[array1[x] * 512];
   }
}

这段代码太神了。进入前先把array2和array1_size从缓存里面清掉。
然后进入后因为x已经在cache里面了,array1_size需要从内存中取,分支预测猜测if (x < array1_size) 是true 所以先执行了temp &= array2[array1[x] * 512];
发现array1[x]越界,本来应该程序直接垮掉,但是array1_size这时候从内存中取上来发现if是false,
分支预测的结果都要抛弃,导致程序没有垮掉。
然后array2[array1[x] * 512]这个地址的值因为被读入cache,所以当你遍历array2的时候这个会发现一个地址的读取速度异常快,根据这个地址就可以反推出array1[x]的值了。
回复

使用道具 举报

发表于 2018-1-4 22:46 来自手机 | 显示全部楼层
实测1700X跑Spectre有结果

—— 来自 Xiaomi MI 6, Android 7.1.1上的 S1Next-鹅版 v1.3.2.1-fix-play
回复

使用道具 举报

头像被屏蔽
     
发表于 2018-1-4 22:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2018-1-4 23:06 | 显示全部楼层
Radeon 发表于 2018-1-4 22:50
有什么结果?

上图看看

转总 amd自己都承认了
Variant One
Bounds Check Bypass
Resolved by software / OS updates to be made available by system vendors and manufacturers. Negligible performance impact expected.
这个程序用的就是这种攻击方式
回复

使用道具 举报

发表于 2018-1-4 23:14 来自手机 | 显示全部楼层
Radeon 发表于 2018-1-4 22:50
有什么结果?

上图看看

跟主楼的截图是一样的

—— 来自 Xiaomi MI 6, Android 7.1.1上的 S1Next-鹅版 v1.3.2.1-fix-play
回复

使用道具 举报

头像被屏蔽
     
发表于 2018-1-4 23:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2018-1-4 23:24 | 显示全部楼层
恩,所以大家忽然都发觉自己TM穿的是开裆裤么
回复

使用道具 举报

头像被屏蔽
     
发表于 2018-1-4 23:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2018-1-4 23:36 | 显示全部楼层
自旋 发表于 2018-1-4 23:25
非洲农业需要金坷拉……
如果硬件上进行修复,可能会怎么处理?应该不至于禁用整个分支预测功能吧?
...

不提前执行内存操作即可。
寄存器操作还是可以提前的。
回复

使用道具 举报

     
发表于 2018-1-5 00:03 | 显示全部楼层
Spectre这个应用程序会自己修复的吧
回复

使用道具 举报

     
发表于 2018-1-5 01:31 来自手机 | 显示全部楼层
so,arm处理器有这个bug吗?
回复

使用道具 举报

 楼主| 发表于 2018-1-5 02:01 | 显示全部楼层
在老CPU上跑不起的原因是没有rdtscp指令。把
  1.       time1 = __rdtscp( & junk); /* READ TIMER */
复制代码


  1.       time2 = __rdtscp( & junk) - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
复制代码

改为
  1.       _mm_mfence();
  2.       time1 = __rdtsc(); /* READ TIMER */
复制代码


  1.           _mm_mfence();
  2.       time2 = __rdtsc() - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
复制代码

之后,Dothan的赛扬也能跑出正确结果。但Atom N270一个字节都跑不正确。
Dothan:

N270:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

 楼主| 发表于 2018-1-5 02:05 | 显示全部楼层
另外。不要以为AMD平台就对这个免疫。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

头像被屏蔽
     
发表于 2018-1-5 04:21 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
发表于 2018-1-5 06:08 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2018-1-5 06:29 来自手机 | 显示全部楼层
Radeon 发表于 2018-1-5 06:08
AMD免疫的是Meltdown。。。

amd不是声称谷歌公布的三种方法对自家cpu都没多少影响么
回复

使用道具 举报

头像被屏蔽
     
发表于 2018-1-5 06:34 来自手机 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2018-1-5 06:52 | 显示全部楼层
这个逻辑上无解,看来要恢复安腾正统了。
回复

使用道具 举报

     
发表于 2018-1-5 08:54 来自手机 | 显示全部楼层
星空天神 发表于 2018-1-4 22:05
void victim_function(size_t x) {
    if (x < array1_size) {
         temp &= array2[array1[x] * 5 ...

问下为什么要乘512
array2怎么从缓存中清掉
回复

使用道具 举报

     
发表于 2018-1-5 09:32 来自手机 | 显示全部楼层
本帖最后由 星空天神 于 2018-1-5 10:00 编辑
五月之雨 发表于 2018-1-5 08:54
问下为什么要乘512
array2怎么从缓存中清掉

猜测是如果数组太小cpu回把整个数组读入cache,256x
512的数组太大 cpu只会读这个数组的一部分 很可能是从这个地址开始然后读入<256字节

清缓存用的是_mm_clflush
头文件在
#ifdef _MSC_VER
#include <intrin.h> /* for rdtscp and clflush */
#pragma optimize("gt",on)
#else
#include <x86intrin.h> /* for rdtscp and clflush */
#endif

—— 来自 OnePlus ONEPLUS A5000, Android 7.1.1上的 S1Next-鹅版 v1.3.2.1-fix-play

回复

使用道具 举报

 楼主| 发表于 2018-1-5 12:43 | 显示全部楼层
然后,又改了一个版本,用lfence保证rdtsc不受乱序干扰。
回复

使用道具 举报

发表于 2018-1-5 14:36 | 显示全部楼层
本帖最后由 ayaseyue 于 2018-1-5 16:38 编辑

有编译好的吗,发一份试试?
回复

使用道具 举报

     
发表于 2018-1-5 15:29 来自手机 | 显示全部楼层
大佬,微软的补丁对游戏性能影响大吗?

—— 来自 nubia NX595J, Android 7.1.1上的 S1Next-鹅版 v1.3.2.2
回复

使用道具 举报

     
发表于 2018-1-5 15:36 | 显示全部楼层
本帖最后由 星空天神 于 2018-1-5 16:34 编辑

编译的32位版本,试试附件

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

     
发表于 2018-1-5 15:37 | 显示全部楼层
ayaseyue 发表于 2018-1-5 14:36
有编译好的吗,发一份试试?

27楼我发了一份
回复

使用道具 举报

     
发表于 2018-1-5 15:39 | 显示全部楼层
所以说很明显的一个开裆裤当正常裤子穿了20多年?
回复

使用道具 举报

发表于 2018-1-5 15:50 | 显示全部楼层

电脑里只有ucrtbase.dll,没有ucrtbased.dll,不装VS有办法吗
回复

使用道具 举报

     
发表于 2018-1-5 16:21 | 显示全部楼层
albertfu 发表于 2018-1-5 15:50
电脑里只有ucrtbase.dll,没有ucrtbased.dll,不装VS有办法吗

试试这个应该吧dll也打包进去了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

发表于 2018-1-5 16:23 | 显示全部楼层
threadripper 1950x
能运行,出不来结果,全是问号零
大概是3楼说的情况?
还是说代码还不怼付,需要再改改?
回复

使用道具 举报

发表于 2018-1-5 16:24 | 显示全部楼层
星空天神 发表于 2018-1-5 16:21
试试这个应该吧dll也打包进去了

可以运行了,秒复现
回复

使用道具 举报

     
发表于 2018-1-5 16:25 | 显示全部楼层
ayaseyue 发表于 2018-1-5 16:23
threadripper 1950x
能运行,出不来结果,全是问号零
大概是3楼说的情况?

我ls新发的哪个也不行吗
回复

使用道具 举报

     
发表于 2018-1-5 16:32 | 显示全部楼层
ayaseyue 发表于 2018-1-5 16:23
threadripper 1950x
能运行,出不来结果,全是问号零
大概是3楼说的情况?

可能和cache的速度有关
#define CACHE_HIT_THRESHOLD (80)
也许要调调
回复

使用道具 举报

发表于 2018-1-5 16:34 | 显示全部楼层
本帖最后由 ayaseyue 于 2018-1-5 16:46 编辑

果然atom直接挂了surface 3
回复

使用道具 举报

发表于 2018-1-5 16:40 | 显示全部楼层
新版有结果了,不是很懂底层
spectre这个漏洞新设计硬件能修复吗?
回复

使用道具 举报

     
发表于 2018-1-5 16:49 | 显示全部楼层
本帖最后由 orecheng 于 2018-1-5 16:51 编辑

谁在ARM 处理器上跑一个看看?比如625 835 970 960 8895 P25
回复

使用道具 举报

     
发表于 2018-1-5 17:09 来自手机 | 显示全部楼层
ayaseyue 发表于 2018-1-5 16:40
新版有结果了,不是很懂底层
spectre这个漏洞新设计硬件能修复吗?

一旦某个进程触发cpu异常就强行清理这个进程的cache?

—— 来自 OnePlus ONEPLUS A5000, Android 7.1.1上的 S1Next-鹅版 v1.3.2.1-fix-play
回复

使用道具 举报

     
发表于 2018-1-5 17:30 | 显示全部楼层
creymorgan 发表于 2018-1-4 23:36
不提前执行内存操作即可。
寄存器操作还是可以提前的。

其实仔细分析下,还分两种情况
如果数据已经在缓存中,直接执行LOAD就可以了,一切照旧
如果没有命中,那就必须等到前面分支结果出来以后,才实际访问内存

因为数据的局域性,大部分数据已在缓存中的LOAD类指令都不会受影响

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2025-8-15 16:52 , Processed in 0.292334 second(s), 8 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表