Spectre 攻击的漏洞演示的实验结果
这几天爆出的和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下能够运行成功,但是读不出正确的结果。
读不出正确结果就不慌了啊,你得加上这句
-- 来自 能看大图的 Stage1官方 iOS客户端 可怕……AMD处理器可能由于缓存细节设计不同读取方法细节有差异所以读不出有效数据,但是真正的攻击者攻击完全可以用这个漏洞读取出整个内核内存的内容,AMD处理器一样不安全 本帖最后由 星空天神 于 2018-1-4 22:51 编辑
void victim_function(size_t x) {
if (x < array1_size) {
temp &= array2 * 512];
}
}
这段代码太神了。进入前先把array2和array1_size从缓存里面清掉。
然后进入后因为x已经在cache里面了,array1_size需要从内存中取,分支预测猜测if (x < array1_size) 是true 所以先执行了temp &= array2 * 512];
发现array1越界,本来应该程序直接垮掉,但是array1_size这时候从内存中取上来发现if是false,分支预测的结果都要抛弃,导致程序没有垮掉。
然后array2 * 512]这个地址的值因为被读入cache,所以当你遍历array2的时候这个会发现一个地址的读取速度异常快,根据这个地址就可以反推出array1的值了。
实测1700X跑Spectre有结果
—— 来自 Xiaomi MI 6, Android 7.1.1上的 S1Next-鹅版 v1.3.2.1-fix-play 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.
这个程序用的就是这种攻击方式 Radeon 发表于 2018-1-4 22:50
有什么结果?
上图看看
跟主楼的截图是一样的
—— 来自 Xiaomi MI 6, Android 7.1.1上的 S1Next-鹅版 v1.3.2.1-fix-play 恩,所以大家忽然都发觉自己TM穿的是开裆裤么 自旋 发表于 2018-1-4 23:25
非洲农业需要金坷拉……
如果硬件上进行修复,可能会怎么处理?应该不至于禁用整个分支预测功能吧?
...
不提前执行内存操作即可。
寄存器操作还是可以提前的。 Spectre这个应用程序会自己修复的吧 so,arm处理器有这个bug吗? 在老CPU上跑不起的原因是没有rdtscp指令。把
time1 = __rdtscp( & junk); /* READ TIMER */
和
time2 = __rdtscp( & junk) - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
改为
_mm_mfence();
time1 = __rdtsc(); /* READ TIMER */
和
_mm_mfence();
time2 = __rdtsc() - time1; /* READ TIMER & COMPUTE ELAPSED TIME */
之后,Dothan的赛扬也能跑出正确结果。但Atom N270一个字节都跑不正确。
Dothan:
N270:
另外。不要以为AMD平台就对这个免疫。
Radeon 发表于 2018-1-5 06:08
AMD免疫的是Meltdown。。。
amd不是声称谷歌公布的三种方法对自家cpu都没多少影响么 这个逻辑上无解,看来要恢复安腾正统了。 星空天神 发表于 2018-1-4 22:05
void victim_function(size_t x) {
if (x < array1_size) {
temp &= array2 * 5 ...
问下为什么要乘512
array2怎么从缓存中清掉 本帖最后由 星空天神 于 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
然后,又改了一个版本,用lfence保证rdtsc不受乱序干扰。 本帖最后由 ayaseyue 于 2018-1-5 16:38 编辑
有编译好的吗,发一份试试?
大佬,微软的补丁对游戏性能影响大吗?
—— 来自 nubia NX595J, Android 7.1.1上的 S1Next-鹅版 v1.3.2.2 本帖最后由 星空天神 于 2018-1-5 16:34 编辑
编译的32位版本,试试附件
ayaseyue 发表于 2018-1-5 14:36
有编译好的吗,发一份试试?
27楼我发了一份 所以说很明显的一个开裆裤当正常裤子穿了20多年? 星空天神 发表于 2018-1-5 15:37
27楼我发了一份
电脑里只有ucrtbase.dll,没有ucrtbased.dll,不装VS有办法吗 albertfu 发表于 2018-1-5 15:50
电脑里只有ucrtbase.dll,没有ucrtbased.dll,不装VS有办法吗
试试这个应该吧dll也打包进去了
threadripper 1950x
能运行,出不来结果,全是问号零
大概是3楼说的情况?
还是说代码还不怼付,需要再改改? 星空天神 发表于 2018-1-5 16:21
试试这个应该吧dll也打包进去了
可以运行了,秒复现 ayaseyue 发表于 2018-1-5 16:23
threadripper 1950x
能运行,出不来结果,全是问号零
大概是3楼说的情况?
我ls新发的哪个也不行吗 ayaseyue 发表于 2018-1-5 16:23
threadripper 1950x
能运行,出不来结果,全是问号零
大概是3楼说的情况?
可能和cache的速度有关
#define CACHE_HIT_THRESHOLD (80)
也许要调调 本帖最后由 ayaseyue 于 2018-1-5 16:46 编辑
果然atom直接挂了surface 3
新版有结果了,不是很懂底层
spectre这个漏洞新设计硬件能修复吗? 本帖最后由 orecheng 于 2018-1-5 16:51 编辑
谁在ARM 处理器上跑一个看看?比如625 835 970 960 8895 P25 ayaseyue 发表于 2018-1-5 16:40
新版有结果了,不是很懂底层
spectre这个漏洞新设计硬件能修复吗?
一旦某个进程触发cpu异常就强行清理这个进程的cache?
—— 来自 OnePlus ONEPLUS A5000, Android 7.1.1上的 S1Next-鹅版 v1.3.2.1-fix-play creymorgan 发表于 2018-1-4 23:36
不提前执行内存操作即可。
寄存器操作还是可以提前的。
其实仔细分析下,还分两种情况
如果数据已经在缓存中,直接执行LOAD就可以了,一切照旧
如果没有命中,那就必须等到前面分支结果出来以后,才实际访问内存
因为数据的局域性,大部分数据已在缓存中的LOAD类指令都不会受影响
页:
[1]
2