Red Hat Training

A Red Hat training course is available for RHEL 8

6.2. Melhorias de segurança no GCC em RHEL 8

This section decribes in detail the changes in GCC related to security and added since the release of Red Hat Enterprise Linux 7.0.

Novos avisos

Estas opções de advertência foram acrescentadas:

OpçãoExibe avisos para

-Wstringop-truncation

Chamadas para funções de manipulação de cordas delimitadas tais como strncat, strncpy e stpncpy que podem truncar a corda copiada ou deixar o destino inalterado.

-Wclass-memaccess

Objetos de classes não triviais manipulados de maneiras potencialmente inseguras por funções de memória bruta, como memcpy ou realloc.

O aviso ajuda a detectar chamadas que contornam construtores ou operadores de atribuição de cópia definidos pelo usuário, indicadores de tabela virtual corruptos, membros de dados de tipos ou referências constantes-qualificados, ou indicadores de membros. O aviso também detecta chamadas que contornariam os controles de acesso aos membros dos dados.

-Wmisleading-indentation

Lugares onde a recuo do código dá uma idéia enganosa da estrutura do bloco do código para um leitor humano.

-Walloc-size-larger-than=size

Chamadas para funções de alocação de memória onde a quantidade de memória a ser alocada ultrapassa size. Funciona também com funções onde a alocação é especificada multiplicando dois parâmetros e com qualquer função decorada com atributo alloc_size.

-Walloc-zero

Chamadas para funções de alocação de memória que tentam alocar uma quantidade zero de memória. Funciona também com funções onde a alocação é especificada multiplicando dois parâmetros e com qualquer função decorada com atributo alloc_size.

-Walloca

Todas as chamadas para a função alloca.

-Walloca-larger-than=size

Chamadas para a função alloca onde a memória solicitada é superior a size.

-Wvla-larger-than=size

Definições de matrizes de comprimento variável (VLA) que podem ou exceder o tamanho especificado ou cujo limite não é conhecido para ser suficientemente limitado.

-Wformat-overflow=level

Tanto certo e provável excesso de buffer em chamadas para a família sprintf de funções de saída formatadas. Para mais detalhes e explicação do valor level, consulte a página do manual gcc(1).

-Wformat-truncation=level

Truncagem de saída certa e provável nas chamadas para a família snprintf de funções de saída formatadas. Para mais detalhes e explicação do valor level, consulte a página do manual gcc(1).

-Wstringop-overflow=type

O excesso de buffer em chamadas para funções de manuseio de strings, como memcpy e strcpy. Para mais detalhes e explicação do valor level, consulte a página do manual gcc(1).

Melhorias de advertência

Estas advertências do GCC foram melhoradas:

  • A opção -Warray-bounds foi melhorada para detectar mais instâncias de índices de matriz fora dos limites e offsets de ponteiro. Por exemplo, índices negativos ou excessivos em membros de matriz flexível e literais de cordas são detectados.
  • A opção -Wrestrict introduzida no GCC 7 foi aprimorada para detectar muito mais casos de sobreposição de acessos a objetos através de argumentos restritos e qualificados para funções de memória padrão e manipulação de cordas, tais como memcpy e strcpy.
  • A opção -Wnonnull foi aperfeiçoada para detectar um conjunto mais amplo de casos de passagem de indicações nulas para funções que esperam um argumento não-nulo (decorado com atributo nonnull).

Novo Anti-Comportamento Não Definido

Foi adicionado um novo higienizador de tempo de execução para detectar comportamento indefinido chamado UndefinedBehaviorSanitizer. As seguintes opções são dignas de nota:

OpçãoVerifique

-fsanitize=float-divide-by-zero

Detectar divisão de ponto flutuante por zero.

-fsanitize=float-cast-overflow

Verifique se o resultado das conversões de ponto flutuante para inteiro não transborda.

-fsanitize=bounds

Permitir a instrumentação de limites de matriz e detectar acessos fora dos limites.

-fsanitize=alignment

Permitir a verificação do alinhamento e detectar vários objetos desalinhados.

-fsanitize=object-size

Permitir a verificação do tamanho do objeto e detectar vários acessos fora dos limites.

-fsanitize=vptr

Permitir a verificação das chamadas de funções de membros C, acessos de membros e algumas conversões entre apontadores para classes base e derivadas. Além disso, detectar quando os objetos referenciados não têm o tipo dinâmico correto.

-fsanitize=bounds-strict

Permitir uma verificação rigorosa dos limites da matriz. Isto permite -fsanitize=bounds e a instrumentação de matrizes flexíveis como matrizes de membros.

-fsanitize=signed-integer-overflow

Diagnosticar transbordos aritméticos mesmo em operações aritméticas com vetores genéricos.

-fsanitize=builtin

Diagnosticar em tempo de execução argumentos inválidos para __builtin_clz ou __builtin_ctz prefixados construídos. Inclui cheques de -fsanitize=undefined.

-fsanitize=pointer-overflow

Realizar testes de tempo de execução baratos para embrulho de ponteiro. Inclui cheques do site -fsanitize=undefined.

Novas opções para o AddressSanitizer

Estas opções foram adicionadas ao AddressSanitizer:

OpçãoVerifique

-fsanitize=pointer-compare

Advertir sobre a comparação de ponteiros que apontam para um objeto de memória diferente.

-fsanitize=pointer-subtract

Advertir sobre a subtração de ponteiros que apontam para um objeto de memória diferente.

-fsanitize-address-use-after-scope

Sanitizar variáveis cujo endereço é tomado e utilizado após um escopo onde a variável é definida.

Outros higienizadores e instrumentação

  • A opção -fstack-clash-protection foi adicionada para inserir sondas quando o espaço da pilha é alocado de forma estática ou dinâmica para detectar de forma confiável os transbordamentos da pilha e assim mitigar o vetor de ataque que depende de saltar sobre uma página de proteção da pilha fornecida pelo sistema operacional.
  • Uma nova opção -fcf-protection=[full|branch|return|none] foi adicionada para executar a instrumentação de código e aumentar a segurança do programa, verificando se os endereços-alvo das instruções de transferência de fluxo de controle (tais como chamada de função indireta, retorno de função, salto indireto) são válidos.

Recursos adicionais

  • Para mais detalhes e explicação dos valores fornecidos a algumas das opções acima, consulte a página do manual gcc(1):

    $ homem gcc