MSVC中的更多幽灵缓解措施

在之前的一篇博文中,微软 描述了幽灵的缓解措施 在以下条件下提供 /Qspectre . 这些缓解措施虽然不会显著影响性能,但并不能防止所有可能的推测性负载攻击,如行业研究中所述 负载值注入 . 我们现在正在添加两个新交换机 /Qspectre-load /Qspectre-load-cf 更全面地缓解 幽灵攻击 基于客户的负载。这些交换机仅在x86和x64平台上可用。

null

这个 /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开始,开发人员可以使用这些新的幽灵缓解选项。要启用任一新标志,请从项目属性页“代码生成”部分下的“幽灵缓解”中选择所需的标志:

Screencap of the Spectre Mitigation option in the project properties.

您的反馈是提供最佳体验的关键。如果您有任何问题,请随时问我们下面。你也可以把你的意见发送给我们 电子邮件 . 如果您在体验中遇到问题或有改进建议,请 报告问题 或者通过 开发者社区 . 你也可以在Twitter上找到我们 @视觉 .

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享