我正在尝试在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:
以下模块是使用支持/ Qspectre的工具集编译的,但是未在命令行上启用该开关
答案 0 :(得分:1)
对于启用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编译的项目链接的库会产生问题并引发错误。
在这种情况下,如果它们链接的模块来自外部存储库,则除了确认链接库中的漏洞并继续前进外,您无能为力。