Red Hat Training

A Red Hat training course is available for RHEL 8

6.2. Mejoras de seguridad en GCC en 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.

Nuevas advertencias

Se han añadido estas opciones de advertencia:

OpciónMuestra avisos para

-Wstringop-truncation

Llamadas a funciones de manipulación de cadenas acotadas como strncat, strncpy, y stpncpy que pueden truncar la cadena copiada o dejar el destino sin cambios.

-Wclass-memaccess

Objetos de tipos de clase no triviales manipulados de forma potencialmente insegura por funciones de memoria bruta como memcpy o realloc.

La advertencia ayuda a detectar las llamadas que evitan los constructores definidos por el usuario o los operadores de asignación de copias, los punteros de tablas virtuales corruptas, los miembros de datos de tipos o referencias calificados como const, o los punteros de miembros. La advertencia también detecta las llamadas que podrían eludir los controles de acceso a los miembros de datos.

-Wmisleading-indentation

Lugares donde la sangría del código da una idea errónea de la estructura de bloques del código a un lector humano.

-Walloc-size-larger-than=size

Llamadas a funciones de asignación de memoria en las que la cantidad de memoria a asignar supera size. También funciona con funciones en las que la asignación se especifica multiplicando dos parámetros y con cualquier función decorada con el atributo alloc_size.

-Walloc-zero

Llamadas a funciones de asignación de memoria que intentan asignar una cantidad cero de memoria. También funciona con funciones en las que la asignación se especifica multiplicando dos parámetros y con cualquier función decorada con el atributo alloc_size.

-Walloca

Todas las llamadas a la función alloca.

-Walloca-larger-than=size

Llamadas a la función alloca cuando la memoria solicitada es superior a size.

-Wvla-larger-than=size

Definiciones de matrices de longitud variable (VLA) que pueden superar el tamaño especificado o cuyo límite no se sabe si está suficientemente restringido.

-Wformat-overflow=level

Desbordamiento de búfer seguro y probable en las llamadas a la familia de funciones de salida formateada sprintf. Para más detalles y explicación del valor level, consulte la página del manual gcc(1).

-Wformat-truncation=level

Truncamiento de la salida, tanto seguro como probable, en las llamadas a la familia de funciones de salida formateada snprintf. Para más detalles y explicación del valor level, consulte la página del manual gcc(1).

-Wstringop-overflow=type

Desbordamiento del búfer en las llamadas a funciones de manejo de cadenas como memcpy y strcpy. Para más detalles y explicación del valor level, consulte la página del manual gcc(1).

Advertencia de mejoras

Estas advertencias de GCC han sido mejoradas:

  • La opción -Warray-bounds se ha mejorado para detectar más casos de índices de matrices y desplazamientos de punteros fuera de los límites. Por ejemplo, se detectan los índices negativos o excesivos en miembros de matrices flexibles y literales de cadena.
  • La opción -Wrestrict introducida en GCC 7 ha sido mejorada para detectar muchos más casos de accesos solapados a objetos a través de argumentos restringidos a funciones estándar de manipulación de memoria y cadenas como memcpy y strcpy.
  • La opción -Wnonnull se ha mejorado para detectar un conjunto más amplio de casos de paso de punteros nulos a funciones que esperan un argumento no nulo (decorado con el atributo nonnull).

Nuevo UndefinedBehaviorSanitizer

Se ha añadido un nuevo sanitizador en tiempo de ejecución para detectar comportamientos indefinidos llamado UndefinedBehaviorSanitizer. Cabe destacar las siguientes opciones:

OpciónConsulte

-fsanitize=float-divide-by-zero

Detecta la división por cero en coma flotante.

-fsanitize=float-cast-overflow

Comprueba que el resultado de las conversiones de tipo punto flotante a entero no se desborda.

-fsanitize=bounds

Habilitar la instrumentación de los límites de la matriz y detectar los accesos fuera de los límites.

-fsanitize=alignment

Habilita la comprobación de la alineación y detecta varios objetos desalineados.

-fsanitize=object-size

Habilitar la comprobación del tamaño de los objetos y detectar varios accesos fuera de los límites.

-fsanitize=vptr

Permitir la comprobación de las llamadas a funciones miembro de C, los accesos a miembros y algunas conversiones entre punteros a clases base y derivadas. Además, detecta cuando los objetos referenciados no tienen el tipo dinámico correcto.

-fsanitize=bounds-strict

Habilitar la comprobación estricta de los límites de los arrays. Esto permite -fsanitize=bounds y la instrumentación de matrices flexibles similares a los miembros del array.

-fsanitize=signed-integer-overflow

Diagnosticar desbordamientos aritméticos incluso en operaciones aritméticas con vectores genéricos.

-fsanitize=builtin

Diagnostica en tiempo de ejecución los argumentos no válidos de los buildins prefijados en __builtin_clz o __builtin_ctz. Incluye comprobaciones de -fsanitize=undefined.

-fsanitize=pointer-overflow

Realiza pruebas baratas en tiempo de ejecución para la envoltura de punteros. Incluye comprobaciones de -fsanitize=undefined.

Nuevas opciones para AddressSanitizer

Estas opciones se han añadido a AddressSanitizer:

OpciónConsulte

-fsanitize=pointer-compare

Advierte sobre la comparación de punteros que apuntan a un objeto de memoria diferente.

-fsanitize=pointer-subtract

Advierte sobre la sustracción de punteros que apuntan a un objeto de memoria diferente.

-fsanitize-address-use-after-scope

Sanear las variables cuya dirección se toma y se utiliza después de un ámbito donde se define la variable.

Otros desinfectantes e instrumentos

  • Se ha añadido la opción -fstack-clash-protection para insertar sondas cuando el espacio de la pila se asigna de forma estática o dinámica para detectar de forma fiable los desbordamientos de la pila y así mitigar el vector de ataque que se basa en el salto de una página de guarda de la pila proporcionada por el sistema operativo.
  • Se ha añadido una nueva opción -fcf-protection=[full|branch|return|none] para realizar la instrumentación del código y aumentar la seguridad del programa comprobando que las direcciones de destino de las instrucciones de transferencia de flujo de control (como la llamada indirecta a una función, el retorno de una función o el salto indirecto) son válidas.

Recursos adicionales

  • Para más detalles y explicación de los valores suministrados a algunas de las opciones anteriores, consulte la página del manual gcc(1):

    $ man gcc