我正在尝试在cmake中启用Qspectre和Control Flow Guard(安全设置)。如何使用cmakefile在cmake中启用这些设置?
Qspectre和Control 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的工具集进行了编译,但未在命令行
最佳答案
为了启用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/