Partilhar via


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

Este artigo contém informações sobre ferramentas e práticas de segurança. Elas não tornam os aplicativos imunes a ataques, mas diminuem a probabilidade de ataques bem-sucedidos.

Recursos de segurança do Visual C++

Estes recursos de segurança foram incorporados ao vinculador e ao compilador do Microsoft C++:

/guard (Habilitar proteção do fluxo de controle)
Faz com que o compilador analise o fluxo de controle para destinos indiretos de chamadas em tempo de compilação e insira código para verificar os destinos em runtime.

/GS (Verificação de segurança do buffer)
Instrui o compilador a inserir o código de detecção de saturação em funções que estão em risco de serem exploradas. Quando uma saturação é detectada, a execução é interrompida. Por padrão, esta opção está ativada.

/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 os manipuladores de exceção legítimos sejam executados. Isso ajuda a impedir a execução de manipuladores de exceção introduzidos por um ataque mal-intencionado em tempo de execução. Por padrão, essa opção é desativada.

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

/analyze (Code Analysis)
Essa opção do compilador ativa a análise de código que relata problemas potenciais de segurança, como excesso de buffer, memória não inicializada, remoção de referência do ponteiro nulo e vazamentos de memória. Por padrão, essa opção é desativada. Para obter mais informações, confira Visão geral do Code Analysis do C/C++.

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

CRT de segurança aprimorada

A biblioteca em runtime C (CRT) foi aumentada para incluir versões seguras das funções que oferecem risco de segurança — por exemplo, a função de cópia de cadeia de caracteres de strcpy não verificada. Como as versões anteriores e não seguras dessas funções estão preteridas, elas causam avisos de tempo de compilação. É recomendável usar as versões seguras dessas funções de CRT em vez de suprimir os avisos de compilação. Para obter mais informações, consulte Recursos de segurança no CRT.

Biblioteca SafeInt

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

A classe de SafeInt protege contra explorações de estouro de inteiro e de divisão por zero. Você pode usá-la para tratar comparações entre valores de tipos diferentes. Ela fornece duas políticas de tratamento de erro. A política padrão é que a classe SafeInt lance uma exceção da classe SafeIntException para relatar por que uma operação matemática não pode ser concluída. A segunda política é que a classe SafeInt interrompa a execução do programa. Você também pode definir uma política personalizada.

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

Iteradores verificados

Um iterador verificado impõe limites do contêiner. Por padrão, quando um iterador verificado está fora dos limites, ele gera uma exceção e finaliza a execução do programa. Um iterador verificado fornece outros níveis de resposta que dependem dos valores atribuídos às definições do pré-processador, como _SECURE_SCL_THROWS e _ITERATOR_DEBUG_LEVEL. Por exemplo, em _ITERATOR_DEBUG_LEVEL=2, um iterador verificado fornece verificações da correção abrangente no modo de depuração, que são disponibilizadas com o uso de declaraçõ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 de acordo com as diretrizes de design do .NET Framework. O FxCop analisa o código e os metadados de cada assembly para verificar se há falhas nestas áreas:

  • Design de biblioteca

  • Localização

  • Convenções de nomenclatura

  • Desempenho

  • Segurança

Verificador de aplicativo 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 inspeciona o sistema de arquivos, o Registro, a memória e as APIs enquanto o aplicativo está em execução, e recomenda correções do código-fonte dos problemas que ele descobre.

Também é possível usar o AppVerifier para:

  • Testar possíveis erros de compatibilidade do aplicativo causados por erros comuns de programação.

  • Examinar um aplicativo por problemas relacionados à memória.

  • Identificar 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 Executar como membro do grupo de usuários e Como o UAC (Controle de Conta de Usuário) afeta seu aplicativo.

Diretrizes para canais laterais de execução especulativa

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

Confira também

System.Security
Segurança
Como o UAC (Controle de Conta de Usuário) afeta o aplicativo