gpt4 book ai didi

c++ - 在 cmake 中启用 Qspectre 和 Control Flow Guard 开关

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:37 26 4
gpt4 key购买 nike

我正在尝试在 cmake 中启用 Qspectre 和 Control Flow Guard(安全设置)。如何使用 cmakefile 在 cmake 中启用这些设置?

QspectreControl Flow Guard选项都是 Visual Studio 2017 的安全开关。QSpectre“指定编译器生成指令以缓解某些 Spectre 变体 1 安全漏洞”和 Control Flow Guard“使编译器在编译时分析间接调用目标的控制流”。

本质上,两者都是针对安全漏洞的编译器选项。

目前,我正在尝试在主 cmakefile 中使用这两个选项来实现:

if (MSVC AND  NOT MSVC_VERSION LESS 1900)
if (${use_control_flow_guard})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /guard:cf")
SET(CMAKE_EXE_LINKER_FLAGS "/guard:cf /DYNAMICBASE")
endif()
if (${use_qspectre})
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qspectre")
endif()
endif()

此代码无法完成工作。从 BinSkim(Microsoft Binary Skimmer)检查安全漏洞:

  • 控制流防护:

    错误 BA2008:“***.dll”未启用控制流保护 (CFG) 缓解措施。要解决此问题,请在编译器和链接器命令行上传递/GUARD:CF。二进制文件还需要/DYNAMICBASE 链接器选项才能启用 CFG。

  • Qspectre:

    以下模块是使用支持/Qspectre 的工具集编译的,但未在命令行上启用该开关

最佳答案

对于启用Control Flow Guard和Qspectre,上述方法在项目中大部分是正确的。

if (MSVC AND (MSVC_VERSION GREATER 1900))
if (${use_control_flow_guard})
message("Setting CONTROL FLOW GUARD")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /guard:cf")
SET(CMAKE_EXE_LINKER_FLAGS "/guard:cf /DYNAMICBASE")
endif()
if (${use_qspectre})
message("Setting QSPECTRE")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /Qspectre")
endif()
endif()

因为 BinSkim 正在分析 *.dll 文件,它还会检查 .dll 中的链接模块。因此,CFG 和 Qspectre 标志可能是用您的动态库设置和编译的,但是为可能未使用 Control Flow Guard 或 Qspectre 编译的项目链接的库会产生问题并引发错误。

在这种情况下,如果链接模块来自外部存储库,那么除了承认链接库中的漏洞并继续前进之外,您无能为力。

关于c++ - 在 cmake 中启用 Qspectre 和 Control Flow Guard 开关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53160599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com