Share via


/GS (verificação de segurança de buffer)

Detectar algumas saturações de buffer que substituir o endereço do remetente, uma técnica comum para exploração de código não impõe restrições de dimensionar de buffer.Isso é conseguido injetando verificações de segurança no código compilado.

/GS[-]

Comentários

/GS é ativado por padrão. Use /GS-Se você espera que seu aplicativo para não que nenhuma exposição de segurança.

Para obter informações adicionais sobre como /GS Consulte Verificações de segurança do compilador em profundidade.

O compilador injeta verificações de funções com buffers de cadeia de caracteres local ou, em x86, funções de manipulação de exceção.Um buffer de cadeia de caracteres é definido sistema autônomo uma matriz cujo dimensionar do elemento é um ou dois bytes e onde o dimensionar da matriz inteira é pelo menos cinco bytes ou qualquer buffer alocado com _alloca.

Em todas as plataformas, o compilador injeta um cookie para proteger o endereço de retorno da função se a função possui buffers de cadeia de caracteres local.Esse cookie é verificado na sair da função e durante o desenrolar em sistemas operacionais de 64 bit ou em x86 para funções de alguma forma de tratamento de exceção do quadro.Em x86, o compilador injeta também um cookie para proteger o endereço do manipulador de exceção da função.Esse cookie é verificado durante o desenrolar do quadro.

/GS principalmente tenta detectar saturações de buffer direto para o endereço do remetente. Saturações de buffer são exploradas com mais com facilidade em máquinas com convenções de chamada que armazenam o endereço de retorno da função chama na pilha.Por exemplo, x86 usa convenções de chamada que armazenam o endereço de retorno de chamadas de função na pilha.

Nas funções que o compilador considera estão sujeitos a problemas de saturação de buffer, o compilador irá alocar espaço em pilha antes do endereço de retorno.Na entrada de função, o espaço alocado está carregado com um cookie de segurança é calculado de uma vez no carregamento de módulo.Em seguida, na sair da função, uma função auxiliar é chamada para Verifique se valor que o cookie do ainda é o mesmo.

Se o valor não for o mesmo, uma substituir da pilha potencialmente ocorreu e o processo simplesmente é encerrado.Antes para Visual C++ 2005 uma caixa de diálogo exibida a substituir de pilha de emissão de relatórios.

/GS também protege contra parâmetros vulneráveis passados em uma função. Um parâmetro vulnerável é um ponteiro, C++ referência ou uma C-estrutura (tipo de C++ POD) que contém um ponteiro, um buffer de cadeia de caracteres ou uma referência de C++.

Um parâmetro vulnerável é alocado antes do cookie e variáveis locais.Uma saturação do buffer pode substituir esses parâmetros.Código da função que usa esses parâmetros pode levar a um ataque antes que a função retorna, evitando assim a verificação de segurança.Para minimizar esse risco, o compilador irá fazer uma cópia de parâmetros vulneráveis durante o prólogo da função e coloque-os abaixo da área de armazenamento para os buffers.

O compilador não fornece proteção de segurança para os parâmetros vulneráveis nas seguintes situações:

  • Funções que não contêm um buffer.

  • Se otimizações (/O opções (otimizar código)) não estão ativados.

  • Funções com uma lista de argumento variável (...).

  • Funções marcadas com naked (C++).

  • Funções que contém o código de assembly embutido na primeira demonstrativo.

  • Se um parâmetro é usado somente em formas que tenham menos possibilidade de ser explorável em caso de uma saturação de buffer.

/GS requer inicialização do cookie de segurança. Esse cookie deve ser inicializado antes de executa qualquer função usando o cookie.O cookie de segurança deve ser inicializado durante a entrada a um EXE ou DLL.Isso é concluído automaticamente quando os usando a entrada de CRT padrão pontos (mainCRTStartup, wmainCRTStartup, WinMainCRTStartup, wWinMainCRTStartup ou _DllMainCRTStartup), mas deve ser concluído manualmente, por meio de uma telefonar para __security_init_cookie, se você usar um ponto de entrada alternativo.

/GS há suporte para gerenciado funciona durante a compilação com /CLR (Common linguagem tempo de execução compilação).

/GS não protege contra todos os ataques de segurança de saturação de buffer. Por exemplo, se você tiver um buffer e uma vtable em um objeto, a saturação do buffer pode corromper o vtable e permitir que um ataque ocorra.

Mesmo que você use /GS, você deve se esforçar para escrever código seguro. Ou seja, certifique-se de que seu código tenha saturações do buffer./GS pode proteger seu aplicativo contra saturações de buffer que permanecem em seu código.

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

  1. em aberto propriedade Páginas caixa de diálogo.Para obter detalhes, consulte:Como: Abrir o Projeto Propriedade Páginas.

  2. clicar no C/C++ pasta.

  3. clicar no Geração de código página de propriedades.

  4. Modificar o Verificação de segurança de bufferpropriedade .

Para conjunto esta opção do compilador por meio de programação

Exemplo

Este exemplo de saturações de um buffer, que faz com que o aplicativo falhar em tempo de execução.

// compile with: /c /W1
#include <cstring>
#include <stdlib.h>
#pragma warning(disable : 4996)   // for strcpy use

// Vulnerable function
void vulnerable(const char *str) {
   char buffer[10];
   strcpy(buffer, str); // overrun buffer !!!

   // use a secure CRT function to help prevent buffer overruns
   // truncate string to fit a 10 byte buffer
   // strncpy_s(buffer, _countof(buffer), str, _TRUNCATE);
}

int main() {
   // declare buffer that is bigger than expected
   char large_buffer[] = "This string is longer than 10 characters!!";
   vulnerable(large_buffer);
}

Consulte também

Referência

Opções do compilador

Opções de compilador configuração