/guard
(Habilitar protección de flujo de control)
Habilite la generación del compilador de comprobaciones de seguridad de Protección de flujo de control.
Sintaxis
/guard:cf
/guard:cf-
Comentarios
La /guard:cf
opción hace que el compilador analice el flujo de control de los destinos de llamadas indirectas en tiempo de compilación y, a continuación, inserte código para comprobar los destinos en tiempo de ejecución. La opción /guard:cf
está desactivada de forma predeterminada y debe habilitarse explícitamente. Para deshabilitar explícitamente esta opción, utilice /guard:cf-
.
Visual Studio 2017 y versiones posteriores: Esta opción agrega restricciones para las instrucciones switch
que generan las tablas de salto.
Cuando se especifica la /guard:cf
opción Protección de flujo de control (CFG), el compilador y el enlazador insertan comprobaciones de seguridad adicionales en tiempo de ejecución para detectar intentos de poner en peligro el código. Durante la compilación y vinculación, se analizan todas las llamadas indirectas en el código para encontrar todas las ubicaciones que puede alcanzar el código cuando se ejecuta correctamente. Esta información se almacena en estructuras adicionales en los encabezados de los archivos binarios. El compilador también inserta una comprobación antes de cada llamada indirecta en el código, que garantiza que el destino sea una de las ubicaciones comprobadas. Si se produce un error en la comprobación en tiempo de ejecución en un sistema operativo compatible con CFG, el sistema operativo cierra el programa.
Un ataque habitual al software aprovecha los errores en el control de entradas extremas o inesperadas. Una entrada cuidadosamente implementada en la aplicación podría sobrescribir una ubicación que contenga un puntero a código ejecutable. Esta técnica se puede usar para redirigir el flujo de control al código controlado por el atacante. Las comprobaciones en tiempo de ejecución de CFG no corrigen los errores de daños en los datos en el archivo ejecutable. En su lugar, hacen que sea más difícil para los atacantes utilizarlos para ejecutar código arbitrario. CFG es una herramienta de mitigación que evita llamadas a otras ubicaciones que no sean puntos de entrada de función en el código. Es similar a cómo la prevención de ejecución de datos (DEP), las comprobaciones de pila /GS y /DYNAMICBASE
/HIGHENTROPYVA de diseño aleatorio del espacio de direcciones (ASLR) reducen las posibilidades de que el código se convierta en un vector de vulnerabilidad.
La /guard:cf
opción debe pasarse tanto al compilador como al enlazador para compilar código que use la técnica de mitigación de vulnerabilidades de seguridad de CFG. Si el archivo binario se compila mediante un único comando cl
, el compilador pasa la opción al vinculador. Si compila y vincula por separado, la opción debe establecerse tanto en los comandos del compilador como del vinculador. También se requiere la opción del vinculador /DYNAMICBASE. Para comprobar que su binario tenga datos CFG, use el comando dumpbin /headers /loadconfig
. Los binarios con CFG tienen Guard
en la lista de características EXE o DLL y los indicadores de protección incluyen CF Instrumented
y FID table present
.
La /guard:cf
opción no es compatible con /ZI
(Editar y continuar la información de depuración) o /clr
(Compilación de Common Language Runtime).
El código compilado mediante /guard:cf
se puede vincular a bibliotecas y archivos de objetos que no se compilan mediante la opción . Solo este código, cuando también se vincula mediante la /guard:cf
opción y se ejecuta en un sistema operativo compatible con CFG, tiene protección CFG. Dado que el código compilado sin la opción no detendrá un ataque, se recomienda usar la opción en todo el código que compile. Hay un pequeño costo en tiempo de ejecución para las comprobaciones de CFG, pero el análisis del compilador intenta optimizar las comprobaciones en saltos indirectos que se pueden demostrar que son seguros.
Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio
Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento de las propiedades del compilador y la compilación.
Seleccione la página de propiedades Propiedades de configuración>C/C++>Generación de código.
Seleccione la propiedad Protección de flujo de control .
En el control desplegable, elija Sí para habilitar la Protección de flujo de control o No para deshabilitarla.
Consulte también
Opciones del compilador de MSVC
Sintaxis de línea de comandos del compilador de MSVC