1

我想看看幽灵缓解标志如何解决一个问题,以说服我的团队我们需要将此标志添加到我们即将进行的项目的大型代码库中。

我正在搜索具有幽灵漏洞的示例项目,并通过添加上周在 Visual Studio 2017 中引入的幽灵缓解标志来解决。

有人可以帮助我通过 POC 向我的更大团队演示,了解 Microsoft 最近在 Visual Studio 中添加的支持如何克服这个问题吗?

这是 Microsoft 为 VS 2017 提供的最新版本说明

编辑问题:2018 年 8 月 23 日

在寻求答案的过程中,我尝试了以下代码形式的 microsoft Spectre Mitigation 页面:

#include "stdafx.h"
int G, G1, G2;

__forceinline
int * bar(int **p, int i)
{
    return p[i];
}

__forceinline
void bar1(int ** p, int i)
{
    if (i < G1) {
        auto x = p[i]; // mitigation here
        G = *x;
    }
}

__forceinline
void foo(int * p)
{
    G = *p;
}

void baz(int ** p, int i)
{
    if (i < G1) {
        foo(bar(p, i + G2));
    }
    bar1(p, i);
}

int main()
{
    return 0;
}

当我在启用幽灵缓解标志的情况下编译代码时:

项目属性 > 配置属性 > C/C++ > Spectre 缓解 > 已启用

还需要进行三项额外的更改来合并此更改:

  1. 在优化中从 /Od 更改为 /O2

项目属性 > 配置属性 > C/C++ > 优化 > /O2

  1. 基本运行时检查为默认值

项目属性 > 配置属性 > C/C++ > 代码生成 > 基本运行时检查 > 默认

  1. 将 VC 库目录添加到链接器路径

项目属性 > 配置属性 > 链接器 > 常规 > 附加库目录 > C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\lib\x86

注意:而不是像这样硬编码路径

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\lib\x86

,您可以像这样使用 Visual Studio 变量:

$(VCToolsInstallDir)\lib\x86\

我得到以下输出:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Microsoft.CppBuild.targets(402,5): 警告 MSB8038: Spectre 缓解已启用但 Spectre 缓解库未找到. 验证 Visual Studio 工作负载是否包含 Spectre 缓解库。有关详细信息,请参阅https://aka.ms/Ofhn4c

我现在不知道该怎么办。我得到了一个输出可执行文件,但我希望 Spectre 缓解功能是可测试的。请帮我。

4

2 回答 2

2

我修改了 VS 2017 安装程序,并将我的安装与 Microsoft 页面中为Spectre Mitigation选择的默认项目进行了比较。

微软示例

之前安装 VS 2017 时遗漏的组件

我没有注意到单个组件选项卡。在选项卡中,我错过了一些重要的依赖项(感谢@Retired Ninja)。安装后,该消息停止出现在用于幽灵缓解示例的构建中。

但是,我仍在寻找更具体的用例。

于 2018-08-23T07:36:02.187 回答
1

以下文章围绕 Spectre 系列漏洞进行了有趣的讨论,并提供了示例代码来测试 Visual Studio 的缓解技术。也许您可以使用其中的一些代码来组合一个具体的示例(尽管利用起来可能相当困难)。

https://www.paulkocher.com/doc/MicrosoftCompilerSpectreMitigation.html

于 2019-06-03T15:59:49.793 回答