我正在尝试在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/

    10-11 17:58