/guard
(Включить функцию управления Flow Guard)
Включение создания компилятором проверок безопасности для защиты потока управления.
Синтаксис
/guard:cf
/guard:cf-
Замечания
Этот /guard:cf
параметр приводит к тому, что компилятор анализирует поток управления для целевых объектов косвенного вызова во время компиляции, а затем вставляет код для проверки целевых объектов во время выполнения. По умолчанию /guard:cf
отключен и должен быть явно включен. Чтобы явно отключить этот параметр, используйте /guard:cf-
.
Visual Studio 2017 и более поздних версий: этот параметр добавляет охранники для switch
инструкций, создающих таблицы переходов.
/guard:cf
Если указан параметр Control Flow Guard (CFG), компилятор и компоновщик вставляют дополнительные проверки безопасности среды выполнения, чтобы обнаружить попытки компрометации кода. Во время компиляции и компоновки анализируются все косвенные вызовы в коде, чтобы найти любое расположение, доступное коду, когда он работает правильно. Эти сведения хранятся в дополнительных структурах в заголовках двоичных файлов. Компилятор также вставляет проверку перед каждым косвенным вызовом в коде, позволяющую убедиться, что целевой объект — одно из проверенных расположений. Если проверка завершается сбоем во время выполнения в операционной системе, которая поддерживает CFG, то операционная система закрывает программу.
Типичная атака на программное обеспечение использует ошибки при обработке экстремальных или непредвиденных входных данных. Аккуратно созданные входные данные для приложения могут перезаписать расположение, которое содержит указатель на исполняемый код. Этот метод можно использовать для перенаправления потока управления в код, контролируемый злоумышленником. Проверки среды выполнения CFG не исправляют ошибки повреждения данных в исполняемом файле. Вместо этого они усложняют злоумышленнику возможность их применения для выполнения произвольного кода. CFG представляет собой средство уменьшения угроз, предотвращающее вызовы в расположения, отличные от точек входа функций в коде. Это похоже на то, как предотвращение выполнения данных (DEP), проверки стека /GS и /DYNAMICBASE
/HIGHENTROPYVA адресного пространства случайным образом (ASLR) снижают вероятность того, что код становится вектором эксплойтов.
Параметр /guard:cf
необходимо передать компилятору и компоновщику для сборки кода, использующего метод устранения эксплойтов CFG. Если двоичный файл создается с помощью одиночной команды cl
, компилятор передает параметр в компоновщик. Если компиляция и компоновка выполняются отдельно, параметр должен быть указан в командах компилятора и компоновщика. Также требуется параметр компоновщика /DYNAMICBASE. Чтобы убедиться, что двоичный файл имеет данные CFG, используйте команду dumpbin /headers /loadconfig
. Двоичные файлы с включенной функцией CFG имеют функцию Guard
в списке характеристик EXE или DLL, а флаги защиты включают в себя CF Instrumented
и FID table present
.
Параметр /guard:cf
несовместим с /ZI
(изменение и продолжение отладки) или /clr
(компиляция среды CLR).
Код, скомпилированный с помощью, /guard:cf
можно связать с библиотеками и файлами объектов, которые не компилируются с помощью параметра. Только этот код, если он также связан с помощью /guard:cf
параметра и работает в операционной системе с поддержкой CFG, имеет защиту CFG. Так как код, скомпилированный без параметра, не остановит атаку, рекомендуется использовать этот параметр во всех компилируемых кодах. Существует небольшая стоимость среды выполнения для проверок CFG, но анализ компилятора пытается оптимизировать проверки на косвенные скачки, которые могут быть проверены как безопасные.
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Дополнительные сведения см. в разделе Set компилятора и свойств сборки.
Перейдите на страницу свойств Свойства конфигурации>C/C++>Создание кода.
Выберите свойство Защита потока управления .
В раскрывающемся списке нажмите Да , чтобы включить защиту потока управления, или Нет , чтобы отключить ее.
См. также
Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC