Включить Qspectre и Control Flow Guard в cmake - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь включить Qspectre и Control Flow Guard (настройки безопасности) в cmake. Как эти настройки включены в cmake с помощью cmakefile?

Опции Qspectre и Control Flow Guard представляют собой оба переключателя безопасности для Visual Studio 2017. QSpectre "задает генерацию инструкций компилятором для устранения определенных уязвимостей безопасности в Варианте варианта 1" и потока управления 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, но переключатель не был включен в командной строке

1 Ответ

0 голосов
/ 27 ноября 2018

Для включения 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, будут создавать проблемы и выдавать ошибки.

В этом случае, если связанные модули взяты из внешних репозиториев, вы ничего не можете сделать, кроме как признать уязвимости в связанных библиотеках и двигаться дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...