Partilhar via


Práticas recomendadas de segurança para C++

Este artigo contém informações sobre ferramentas e práticas de segurança. Usá-los não torna os aplicativos imunes a ataques, mas torna os ataques bem-sucedidos menos prováveis.

Recursos de segurança do Microsoft C++

Esses recursos de segurança são incorporados ao compilador e vinculador do Microsoft C++:

/guard (Ativar o protetor de fluxo de controle)
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.

/GS (Verificação de segurança do buffer)
Instrui o compilador a inserir código de deteção de saturação em funções que correm o risco de serem exploradas. Quando uma saturação é detetada, a execução é interrompida. Esta opção está ativada, por predefinição.

/SAFESEH (A imagem tem manipuladores de exceção seguros)
Instrui o vinculador a incluir na imagem de saída uma tabela que contém o endereço de cada manipulador de exceção. Em tempo de execução, o sistema operacional usa essa tabela para garantir que apenas manipuladores de exceção legítimos sejam executados. Isso ajuda a impedir a execução de manipuladores de exceção que são introduzidos por um ataque mal-intencionado em tempo de execução. Por padrão, essa opção está desativada.

/NXCOMPAT, /NXCOMPAT (Compatível com a Prevenção de Execução de Dados)
Essas opções de compilador e vinculador permitem a compatibilidade de DEP (Prevenção de Execução de Dados). DEP protege a CPU contra a execução de páginas não-código.

/analyze (Análise de Código)
Essa opção de compilador ativa a análise de código que relata possíveis problemas de segurança, como saturação de buffer, memória não inicializada, desreferenciação de ponteiro nulo e vazamentos de memória. Por padrão, essa opção está desativada. Para obter mais informações, consulte Visão geral da análise de código para C/C++.

/DYNAMICBASE (Usar randomização do layout de espaço de endereços)
Esta opção de vinculador permite a construção de uma imagem executável que pode ser carregada em diferentes locais na memória no início da execução. Esta opção também torna a localização da pilha na memória muito menos previsível.

CRT Melhorado para Segurança

A Biblioteca de Tempo de Execução C (CRT) foi ampliada para incluir versões seguras de funções que representam riscos de segurança, como a função de cópia de cadeia de caracteres não verificada strcpy. Como as versões mais antigas e não seguras dessas funções são preteridas, elas causam avisos em tempo de compilação. Recomendamos que você use as versões seguras dessas funções CRT em vez de suprimir os avisos de compilação. Para obter mais informações, consulte Recursos de segurança na CRT.

Biblioteca SafeInt

A Biblioteca SafeInt ajuda a evitar estouros de inteiros e outros erros exploráveis que podem ocorrer quando o aplicativo executa operações matemáticas. A SafeInt biblioteca inclui a classe SafeInt, a classe SafeIntException e várias funções SafeInt.

A SafeInt classe protege contra estouro de número inteiro e exploits divididos por zero. Você pode usá-lo para lidar com comparações entre valores de diferentes tipos. Ele fornece duas políticas de tratamento de erros. A política padrão é que a SafeInt classe lance uma SafeIntException exceção de classe para relatar por que uma operação matemática não pode ser concluída. A segunda política é para a SafeInt classe parar a sua própria execução. Você também pode definir uma política personalizada.

Cada SafeInt função protege uma operação matemática de um erro explorável. Você pode usar dois tipos diferentes de parâmetros sem convertê-los para o mesmo tipo. Para proteger várias operações matemáticas, use a SafeInt classe.

Iteradores verificados

Um iterador verificado impõe limites de contêiner. Por padrão, quando um iterador verificado está fora dos limites, ele gera uma exceção e encerra a execução do programa. Um iterador verificado fornece outros níveis de resposta que dependem de valores atribuídos às definições do pré-processador, como _SECURE_SCL_THROWS e _ITERATOR_DEBUG_LEVEL. Por exemplo, no _ITERATOR_DEBUG_LEVEL=2, um iterador verificado fornece verificações de correção abrangentes no modo de depuração, que são disponibilizadas usando asserções. Para obter mais informações, consulte Iteradores verificados e _ITERATOR_DEBUG_LEVEL.

Análise de código para código gerenciado

A Análise de Código para Código Gerenciado, também conhecida como FxCop, verifica a conformidade dos assemblies com as diretrizes de design do .NET Framework. A FxCop analisa o código e os metadados em cada montagem para verificar defeitos nas seguintes áreas:

  • Design da biblioteca

  • Localização

  • Convenções de nomenclatura

  • Desempenho

  • Segurança

Verificador de aplicativos do Windows

O Application Verifier (AppVerifier) pode ajudá-lo a identificar possíveis problemas de compatibilidade, estabilidade e segurança do aplicativo.

O AppVerifier monitora como um aplicativo usa o sistema operacional. Ele observa o sistema de arquivos, o registro, a memória e as APIs enquanto o aplicativo está em execução e recomenda correções de código-fonte para problemas descobertos.

Você pode usar o AppVerifier para:

  • Teste possíveis erros de compatibilidade de aplicativos causados por erros comuns de programação.

  • Examine um aplicativo para problemas relacionados à memória.

  • Identifique possíveis problemas de segurança em um aplicativo.

Contas de usuário do Windows

O uso de contas de usuário do Windows que pertencem ao grupo Administradores expõe os desenvolvedores e, por extensão, os clientes a riscos de segurança. Para obter mais informações, consulte Executando como membro do grupo Usuários e Como o Controle de Conta de Usuário (UAC) afeta seu aplicativo.

Orientações para Canais Laterais de Execução Especulativa

Para obter informações sobre como identificar e mitigar vulnerabilidades de hardware de canal lateral de execução especulativa no software C++, consulte Orientação do desenvolvedor C++ para canais laterais de execução especulativa.

Ver também

System.Security
Segurança no .NET
Como o controle de conta de usuário (UAC) afeta seu aplicativo