Spectre 攻击的那个 PoC 有人复现了吗

2018-01-04 20:06:42 +08:00
 yksoft1

漏洞论文: https://spectreattack.com/spectre.pdf 。 我试了一下最后附录贴出的 Windows 下 C 语言 PoC,用 mingw-w64 32 位版编译出来了。 因为用了 clflush 和 rdtscp 两个指令,理论上应该只有支持 SSE2 还是 SSE3 的 CPU 可以运行这个。跑了自己的一些机器, Core i7-2720QM Win8.1:

Core i5-2520M WinXP SP3 WEPOS:

在支持 SSE3 但没有分支预测的 Atom N270、N2600 上都崩溃,错误 0xc000001d

Atom Z3735F 执行成功了。。

在 Dothan 核心的赛扬 900 ( eeepc 701 )上崩溃

另外,Meltdown 的 Windows x64 下的 poc 找到了,但是好几个人都复现不成功。

7512 次点击
所在节点    分享发现
26 条回复
zts1993
2018-01-04 20:22:04 +08:00
好像两个最基本都是需要乱序执行。老 U 和老 ATOM 都不行的
am241
2018-01-04 20:25:19 +08:00
正在试…也许和 cache 大小 and 分支预测器的深度有关
yksoft1
2018-01-04 20:28:36 +08:00
@zts1993 Dothan 有 SSE2,有乱序执行。
yksoft1
2018-01-04 21:10:46 +08:00
Core i5 U 560,WinXP SP3,运行成功。


AMD A4-1200,运行没有报错,但是结果只有部分正确。
est
2018-01-04 23:24:43 +08:00
wwqgtxx
2018-01-04 23:49:29 +08:00
试了一下 i7 4790, i7 3632qm, i5 520m, z3735f 上都能复现
lrxiao
2018-01-04 23:50:30 +08:00
在找 Meltdown 的 PoC..看到一个 win 的 可能已经更新到修复版本了?
yksoft1
2018-01-05 00:22:37 +08:00
@lrxiao 不是系统问题,2003 x64 下都不能正确 guess
redsonic
2018-01-05 00:33:11 +08:00
linux 上面测试过了,结果贴在隔壁帖里了。老 cpu 可以用 rdtsc 代替 rdtscp,但几乎猜不中了。既然计时是侧信道泄漏的关键那 intel 只要弄个开关把计时模糊一下应该可以防止这类攻击。
另外 windows 的我编译了,运行时卡在 reading at malicious_x=FFFFF0E0 ......
Quaintjade
2018-01-05 00:41:05 +08:00
非洲农业不发达,必须要有金克拉!!!!
yksoft1
2018-01-05 01:17:59 +08:00
@redsonic 已经解决 rdtscp 的问题,用 mfence+rdtsc 可以替代。
yksoft1
2018-01-05 01:26:41 +08:00
@redsonic 我在 Windows 下使用 32 位 mingw-w64 编译的,参数很简单,
gcc -msse2 -std=c99 spectre.c -ospectre
redsonic
2018-01-05 01:43:52 +08:00
@yksoft1 我是在 vs2013 里面编译的,64、32 位都卡在那,我在调调 readMemoryByte()。
还有你那个 rdtscp 定义成这样吗? 我试了一下老 core2 还是几乎猜不到。
unsigned long rdtscp()
{
unsigned int lo,hi;

__asm__ __volatile__
(
"mfence;rdtsc":"=a"(lo),"=d"(hi)
);
return (unsigned long)hi<<32|lo;
}
yksoft1
2018-01-05 01:45:37 +08:00
@redsonic VC 的 intristic 还不如 mingw 的。
我根本没用内联汇编,全部用的 intristic 调用的 mfence 和 rdtsc。
不能加入任何非内联的新函数,因为都会涉及到上下文的切换,使得无法正确获得结果。
yksoft1
2018-01-05 12:17:53 +08:00
Stackoverflow 上说,Linux 内核里实现不受乱序影响的高精度计时,AMD 平台是 mfence+rdtsc,Intel 平台则是 lfence+rdtsc.
redsonic
2018-01-05 14:27:52 +08:00
@yksoft1 我用 mingw-w64 编译又跑了一遍,老 core duo2 e6300 e6400 e6600 l7500 都猜不到,如果这个 PoC 没问题说明没有 invariant TSC 的 cpu 似乎很难通过侧信道攻击。
yksoft1
2018-01-05 18:53:01 +08:00
@redsonic 说了你 rdtsc 还有问题。你试试看 lfence+rdtsc ?不要用单独函数。直接写在 readMemoryByte 里面即可
问题是为啥 dothan 的赛扬能通过?
yksoft1
2018-01-05 18:53:55 +08:00
@redsonic 另外,试试看老移动平台。这个还有可能和 Speedstep 有点关系
redsonic
2018-01-05 20:51:42 +08:00
@yksoft1 我只启用一个核心,设置成实时优先级,mfence 和 lfence 都不起作用。dothan 我没有 没办法测试,不过手里的 core i 1 代 、2 代、4 代、5 代都中招。另外发现 core duo2 跑这个 PoC 要比中招的那几个慢非常多,trace 了一下几乎每个引用都慢很多,从这个角度看 core i 的访存设计可能真的和老 core duo2 差异蛮大的。dothan 应该就是 core duo1,不知道是不是这两代也有访存设计上的巨大差异。
xqdoo00o
2018-01-05 21:08:06 +08:00
https://github.com/gkaindl/meltdown-poc 有试过这个 poc 吗,我现在没编译环境测试不了。
@yksoft1

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/420141

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX