幽灵漏洞:Visual Studio团队释出更全面的修复方案
蝎子
在之前的一篇文章中,我们官宣了可以通过[/Qspectre]编译开关来缓解幽灵(Spectre)漏洞。这些缓解措施不会显著地影响应用程序的性能,但是我们发现,它并不能抵御所有利用幽灵漏洞的攻击。
为了解决这个问题,我们最近添加了两个新的编译开关[/Qspectre-load]和[/Qspectre-load-cf]来提供更加完整的幽灵漏洞防护。这两个开关仅在x86和x64上可用。
这两个开关在底层会做什么?
[/Qspectre-load]编译开关指示编译器对每一条load指令生成序列化的指令。对于大多数load指令来说,这个开关会在每一条load指令后面添加一条[LFENCE]指令。然而,对于控制流类的指令,这种方法将不能预期的起作用。在大多数情况下,一条指令可以被分割为load指令和控制流指令,因此一条[LFENCE]指令可以插入到load指令之后。对于一些不适用的情况,例如jmp [rax]这类的指令,编译器将会尝试采取另外一种修复策略,具体就是:在插入[LFENCE]指令之前就以非析构式(non-destructively)的方式来加载目标。如下图所示:
[/Qspectre-load-cf]开关则提供了以上行为的一个子集,即仅提供控制流指令的保护,例如JMP, RET和CALL指令。
对于一些性能攸关的代码片段,可能它们不需要添加上述的保护,对于这种情况,你可以通过语句[__declspec(spectre(nomitigation))]来禁用编译器添加的额外指令。因为这两个编译开关能阻断所有对于load指令的幽灵漏洞攻击,它带来了显著的性能降级,所以,这个修复措施并不是在所有情况下都适合。
什么版本的MSVC支持这两个开关?
自Visual Studio v16.5 Preview 3版本开始支持这两个编译开关。在将来的所有Visual Studio发布版本中,这两个开关将会在MSVC工具集中可用。
应该如何启用这两个开关?
可以在Visual Studio的工程属性中设置此开关。具体路径为,工程属性页面的[Code Generation]页面的[Spectre Mitigation]设置项。如下图所示:
总结
熔断和幽灵这两个漏洞告诉我们:
没有十全十美的事物,包括CPU也是。
但是,我们可以日臻完善,就如同Visual Studio团队所做的一样。
还是,加油吧,骚年!
相关推荐
- 官宣:Visual Studio对Codespaces的支持
- Posted on 08月04日
- VS2019编译器后端更新汇总
- Posted on 04月19日
- 快速解答:我的程序从哪里开始运行?
- Posted on 03月16日
- 在运行时创建一个对话框模板
- Posted on 10月08日
评论已关闭。