Partilhar via


/guard (Ativar o protetor de fluxo de controle)

Habilite a geração do compilador de verificações de segurança do Control Flow Guard.

Sintaxe

/guard:cf
/guard:cf-

Observações

A /guard:cf opção faz com que o compilador analise o fluxo de controle para destinos de chamada indireta em tempo de compilação e insere código em tempo de execução para verificar os destinos. Por padrão, /guard:cf está desativado e deve ser explicitamente habilitado. Para desativar explicitamente essa opção, use /guard:cf-.

Visual Studio 2017 e posterior: esta opção adiciona proteções para switch instruções que geram tabelas de saltos.

Quando a /guard:cf opção Control Flow Guard (CFG) é especificada, o compilador e o vinculador inserem verificações de segurança de tempo de execução extras para detetar tentativas de comprometer seu código. Durante a compilação e vinculação, todas as chamadas indiretas em seu código são analisadas para encontrar todos os locais que o código pode alcançar quando é executado corretamente. Essas informações são armazenadas em estruturas extras nos cabeçalhos dos binários. O compilador também injeta uma verificação antes de cada chamada indireta em seu código que garante que o destino seja um dos locais verificados. Se a verificação falhar em tempo de execução em um sistema operacional com reconhecimento de CFG, o sistema operacional fechará o programa.

Um ataque comum ao software tira proveito de bugs no tratamento de entradas extremas ou inesperadas. A entrada cuidadosamente criada para o aplicativo pode substituir um local que contém um ponteiro para o código executável. Essa técnica pode ser usada para redirecionar o fluxo de controle para o código controlado pelo invasor. As verificações de tempo de execução do CFG não corrigem os bugs de corrupção de dados em seu executável. Em vez disso, tornam mais difícil para um invasor usá-los para executar código arbitrário. CFG é uma ferramenta de mitigação que impede chamadas para locais diferentes de pontos de entrada de função em seu código. É semelhante à forma como a Prevenção de Execução de Dados (DEP), as verificações de pilha /GS e /DYNAMICBASE a aleatorização do layout do espaço de endereçamento /HIGHENTROPYVA (ASLR) diminuem as chances de que seu código se torne um vetor de exploração.

Para usar a técnica de mitigação de exploração CFG, passe /guard:cf para o compilador e /GUARD:CF para o vinculador.

Para desativar a técnica de mitigação de exploração CFG, passe /guard:cf- para o compilador /GUARD:NO para o vinculador.

Se você compilar usando um único cl comando, o compilador passa a opção para o vinculador. Se você compilar e vincular separadamente, defina a opção para os comandos compilador e vinculador. A /DYNAMICBASE opção de vinculador também é necessária.

Para verificar se o binário tem dados CFG, use o dumpbin /headers /loadconfig comando. Os binários habilitados para CFG têm Guard na lista de características EXE ou DLL, e os Guard Flags incluem CF Instrumented e FID table present.

A /guard:cf opção é incompatível com /ZI (Editar e continuar informações de depuração) ou /clr (Common Language Runtime Compilation).

O código compilado usando /guard:cf pode ser vinculado a bibliotecas e arquivos de objeto que não são compilados usando a opção. Somente este código, quando também vinculado usando a /guard:cf opção e executado em um sistema operacional com reconhecimento de CFG, tem proteção CFG. Como o código compilado sem a opção não impedirá um ataque, recomendamos que você use a opção em todo o código compilado. Há um pequeno custo de tempo de execução para verificações CFG, mas a análise do compilador tenta otimizar as verificações em saltos indiretos que podem ser comprovadamente seguros.

Para definir essa opção de compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de propriedades do projeto. Para obter mais informações, consulte Definir propriedades do compilador e da compilação.
  2. Selecione a página de propriedades Configuration Properties>C/C++>Code Generation .
  3. Selecione a propriedade Control Flow Guard .
  4. No controle suspenso, escolha Sim para ativar o Control Flow Guard ou Não para desativá-lo.

Consulte também

Opções do compilador MSVC
Sintaxe da linha de comando do compilador MSVC