指令■幽灵漏洞:Visual Studio团队释出更全面的修复方案

北京联盟_原题是:幽灵漏洞: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)的方式来加载目标 。如下图所示:
指令■幽灵漏洞:Visual Studio团队释出更全面的修复方案
文章图片

文章图片

[/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]设置项 。如下图所示:
指令■幽灵漏洞:Visual Studio团队释出更全面的修复方案
文章图片

文章图片

总结
熔断和幽灵这两个漏洞告诉我们:
没有十全十美的事物 , 包括CPU也是 。
【指令■幽灵漏洞:Visual Studio团队释出更全面的修复方案】但是 , 我们可以日臻完善 , 就如同Visual Studio团队所做的一样 。
还是 , 加油吧 , 骚年!
指令■幽灵漏洞:Visual Studio团队释出更全面的修复方案
文章图片

文章图片


    推荐阅读