Compartilhar via


/guard (Ativar proteção de fluxo de controle)

Habilite a geração de verificações de proteção do fluxo de controle do compilador.

Sintaxe

/guard:cf
/guard:cf-

Comentários

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, em seguida, insira código para verificar os destinos em tempo de execução. Por padrão, /guard:cf está desativado e deve ser habilitado explicitamente. Para desabilitar explicitamente essa opção, use /guard:cf-.

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

Quando a /guard:cf opção CFG (Proteção de Fluxo de Controle) é especificada, o compilador e o vinculador inserem verificações de segurança de runtime extras para detectar 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 localizar cada local que o código poderá alcançar se ele for 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 runtime em um sistema operacional com reconhecimento de CFG, o sistema operacional fechará o programa.

Um ataque comum em softwares tira proveito de bugs no tratamento de entradas extremas ou inesperadas. Uma entrada cuidadosamente criada no aplicativo pode substituir um local que contenha 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, elas tornam mais difícil para um invasor usá-los para executar código arbitrário. O CFG é uma ferramenta de mitigação que impede chamadas para locais diferentes dos pontos de entrada de função em seu código. É semelhante a como a DEP (Prevenção de Execução de Dados), as verificações de pilha /GS e /DYNAMICBASE a ASLR (randomização de layout de espaço de endereço) /HIGHENTROPYVA reduzem as chances de seu código se tornar um vetor de exploração.

A /guard:cf opção deve ser passada para o compilador e o vinculador para compilar o código que usa a técnica de mitigação de exploração CFG. Se o binário for criado usando um único comandocl, o compilador passará a opção para o vinculador. Se você compilar e vincular separadamente, a opção deverá ser definida nos comandos do compilador e do vinculador. A opção do vinculador /DYNAMICBASE também é necessária. Para verificar se o binário tem dados do CFG, use o comando dumpbin /headers /loadconfig. Os binários habilitados para o CFG têm Guard na lista de características EXE ou DLL, e os Sinalizadores de Proteção 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 (Compilação do Common Language Runtime).

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 esse 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 interromperá um ataque, recomendamos que você use a opção em todo o código compilado. Há um pequeno custo de runtime para verificações de CFG, mas a análise do compilador tenta otimizar as verificações em saltos indiretos que podem ser comprovadamente seguros.

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

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para mais informações, consulte Definir propriedades de build e do compilador.

  2. Selecione a página de propriedades Propriedades da Configuração>C/C++>Geração de Código.

  3. Selecione a propriedade Proteção do Fluxo de Controle.

  4. No controle suspenso, escolha Sim para habilitar a Proteção do Fluxo de Controle ou Não para desabilitá-la.

Confira também

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