首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cmake中启用Q谱和控制流保护开关

在cmake中启用Q谱和控制流保护开关
EN

Stack Overflow用户
提问于 2018-11-05 19:05:16
回答 1查看 1.7K关注 0票数 1

I试图在cmake中启用Q谱和控制流保护(安全设置)。如何使用cmakefile在cmake中启用这些设置?

Q谱控制流保护选项都是Visual 2017的安全开关。QSpectre“指定编译器生成指令以减轻某些谱变体1安全漏洞”,控制流保护“使编译器在编译时分析间接调用目标的控制流”。

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

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

代码语言:javascript
复制
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 )检查安全漏洞:

  • 控制流保护: 错误BA2008:“***.dll”不启用控制流保护(CFG)缓解。若要解决此问题,请在编译器和链接器命令行上传递/GUARD:CF。二进制文件还需要/DYNAMICBASE链接器选项来启用CFG。
  • Q谱: 下面的模块是用支持/Qspectre的工具集编译的,但是在命令行上没有启用开关。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-26 21:32:37

为了启用控制流保护和Qspectre,上述方法在项目中基本上是正确的。

代码语言:javascript
复制
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标志可能是用动态库设置和编译的,但是为项目链接的库可能不会使用控制流保护或Qspectre进行编译,这将产生问题并抛出错误。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53160599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档