在之前的一篇博文中,微软 描述了幽灵的缓解措施 在以下条件下提供 /Qspectre
. 这些缓解措施虽然不会显著影响性能,但并不能防止所有可能的推测性负载攻击,如行业研究中所述 负载值注入 . 我们现在正在添加两个新交换机 /Qspectre-load
和 /Qspectre-load-cf
更全面地缓解 幽灵攻击 基于客户的负载。这些交换机仅在x86和x64平台上可用。
这个 /Qspectre-load
旗帜 指定编译器为每个加载指令生成序列化指令。对于大多数负载,这需要添加 LFENCE
加载指令之后的指令。但是,对于控制流指令,这种方法不起作用。在大多数情况下,指令可以分为加载流和控制流,因此 LFENCE
可在加载后插入。当这是不可能的,例如 jmp [rax]
编译器使用另一种缓解策略,在插入 LFENCE
具体如下:
xor rbx, [rax] xor rbx, [rax] lfence jmp [rax]
这个 /Qspectre-load-cf
旗帜 提供此行为的子集,仅保护控制流指令: JMP
, RET
,和 CALL
.
如果存在不需要保护的性能关键代码块,则可以使用禁用这些缓解 __declspec(spectre(nomitigation))
. 由于这些开关停止了对所有负载的推测,因此对性能的影响非常大,因此这种缓解措施并不适用于任何地方。
这些开关从VisualStudio16.5Preview3开始提供,并且将在VisualStudio的所有未来版本(包括预览)中包含的MSVC工具集中提供。它们也已在Visual Studio 2017和2019的所有当前支持版本中发布,如下所示:
从VisualStudio2019版本16.5预览版3开始,开发人员可以使用这些新的幽灵缓解选项。要启用任一新标志,请从项目属性页“代码生成”部分下的“幽灵缓解”中选择所需的标志:
您的反馈是提供最佳体验的关键。如果您有任何问题,请随时问我们下面。你也可以把你的意见发送给我们 电子邮件 . 如果您在体验中遇到问题或有改进建议,请 报告问题 或者通过 开发者社区 . 你也可以在Twitter上找到我们 @视觉 .