/Qspectre

Especifica la generación de instrucciones del compilador para mitigar determinadas vulnerabilidades de seguridad de la variante 1 de Spectre.

Sintaxis

/Qspectre

Comentarios

La opción /Qspectre hace que el compilador inserte instrucciones para mitigar determinadas vulnerabilidades de seguridad de Spectre. Estas vulnerabilidades se denominan ataques de canal lateral de ejecución especulativa. Afectan a muchos sistemas operativos y a procesadores modernos, incluyendo procesadores de Intel, AMD y ARM.

La opción /Qspectre está disponible a partir de Visual Studio 2017 versión 15.5.5 y todas las versiones posteriores. Está disponible en Visual Studio 2015 Update 3 mediante KB 4338871.

De forma predeterminada, la opción /Qspectre está desactivada.

En su versión inicial, la opción /Qspectre solo funcionaba en código optimizado. A partir de la versión 15.7 de Visual Studio 2017, la opción /Qspectre se admite en todos los niveles de optimización.

También hay varias versiones con mitigación de Spectre de bibliotecas de Microsoft Visual C++. Las bibliotecas de Spectre mitigadas para Visual Studio 2017 y versiones posteriores se pueden descargar en el instalador de Visual Studio. Se encuentran en la pestaña Componentes individuales, bajo Compiladores, herramientas de compilación y entornos de ejecución, e incluyen "Libs for Spectre" (Bibliotecas para Spectre) en el nombre. Tanto las bibliotecas DLL como las bibliotecas en tiempo de ejecución estáticas con mitigación habilitadas están disponibles para un subconjunto de los entornos de ejecución de Visual C++: código de inicio de VC++, vcruntime140, msvcp140, concrt140 y vcamp140. Los archivos DLL solo se admiten para la implementación local de la aplicación. El contenido de las bibliotecas en tiempo de ejecución de Visual C++ Redistributable no se modifica.

También puede instalar bibliotecas mitigadas por Spectre para MFC y ATL. También se encuentran en la pestaña Componentes individuales, en SDK, bibliotecas y marcos.

Nota:

No hay versiones de bibliotecas mitigadas por Spectre para aplicaciones o componentes universales de Windows (UWP). La implementación local de aplicaciones de estas bibliotecas no es posible.

Aplicabilidad

Si el código funciona en datos que cruzan un límite de confianza, se recomienda usar la opción /Qspectre para volver a compilar e implementar el código con el fin de mitigar este problema lo antes posible. Un ejemplo de este código es código que carga entradas que no son de confianza que pueden afectar a la ejecución. Por ejemplo, el código que hace llamadas a procedimientos remotos, analiza entradas o archivos no confiables, o utiliza otras interfaces locales de comunicación entre procesos (IPC). Es posible que las técnicas estándar de espacio aislado no sean suficientes. Investigue con atención los espacios aislados antes de decidir que el código no cruza un límite de confianza.

Disponibilidad

La opción /Qspectre está disponible en la versión 15.5.5 de Visual Studio 2017 y en todas las actualizaciones de los compiladores MSVC de Microsoft (MSVC) realizadas el 23 de enero de 2018 o después. Use el instalador de Visual Studio para actualizar el compilador y para instalar las bibliotecas de Spectre mitigadas como componentes individuales. La opción /Qspectre también está disponible en Visual Studio 2015 Update 3 a través de una revisión. Para más información, vea KB 4338871.

Todas las versiones de Visual Studio 2017, versión 15.5, y todas las versiones preliminares de Visual Studio 2017, versión 15.6. incluya una opción no documentada, /d2guardspecload. Es equivalente al comportamiento inicial de /Qspectre. Puede usar /d2guardspecload para aplicar la mismas mitigaciones al código en estas versiones del compilador. Se recomienda actualizar la compilación para usar /Qspectre en compiladores que admitan la opción . La opción /Qspectre también puede admitir nuevas mitigaciones en versiones posteriores del compilador.

Efecto

La opción /Qspectre genera código para mitigar la variante 1 de Spectre, Derivación de comprobación de límites, CVE-2017-5753. Funciona mediante la inserción de instrucciones que actúan como una barrera de ejecución de código especulativo. Las instrucciones específicas que se usan para mitigar la especulación de procesador dependen del procesador y su microarquitectura, y pueden cambiar en versiones futuras del compilador.

Cuando habilita la opción /Qspectre, el compilador intenta identificar instancias donde la ejecución especulativa puede omitir las comprobaciones de límites. Ahí es donde inserta las instrucciones de barrera. Es importante tener en cuenta los límites del análisis que un compilador puede hacer para identificar las instancias de la variante 1. Por tanto, no hay ninguna garantía de que todos los posibles casos de la variante 1 se instrumenten bajo /Qspectre.

Impacto en el rendimiento

El efecto de /Qspectre en el rendimiento parecía insignificante en varias bases de código considerables. Sin embargo, no hay ninguna garantía de que el rendimiento del código bajo /Qspectre no se vea afectado. Debe realizar pruebas comparativas del código para determinar el efecto de la opción en el rendimiento. Si sabe que la mitigación no es necesaria en un bloque o bucle de rendimiento crítico, puede desactivar selectivamente la mitigación mediante una directiva __declspec(spectre(nomitigation)). Esta directiva no está disponible en los compiladores que solo admiten la opción /d2guardspecload.

Bibliotecas necesarias

La opción /Qspectre del compilador mitiga los problemas en su propio código. Para una mayor protección, se recomienda encarecidamente usar también bibliotecas creadas para proporcionar mitigaciones de Spectre. Hay varias bibliotecas en tiempo de ejecución de Microsoft disponibles con mitigaciones de Spectre.

Estas bibliotecas son componentes opcionales que se deben instalar mediante el instalador de Visual Studio:

  • Versión de MSVC version_numbers Bibliotecas para Spectre [(x86 y x64) | (ARM) | (ARM64)]
  • Visual C++ ATL para [(x86/x64) | ARM | ARM64] con mitigaciones de Spectre
  • MFC de Visual C++ para [x86/x64 | ARM | ARM64] con mitigaciones de Spectre

El sistema de proyectos predeterminado basado en MSBuild en el IDE de Visual Studio permite especificar una propiedad de mitigación de Spectre para sus proyectos. Esta propiedad establece la opción /Qspectre del compilador y cambia las rutas de acceso de la biblioteca para vincular las bibliotecas en tiempo de ejecución mitigadas por Spectre. Si estas bibliotecas no se instalan al compilar el código, el sistema de compilación notifica la advertencia MSB8040. Si se produce un error en la compilación del código de MFC o ATL, y el enlazador informa de un error como error irrecuperable LNK1104: no se puede abrir el archivo "oldnames.lib", estas bibliotecas que faltan pueden ser la causa.

El sistema de proyectos predeterminado basado en MSBuild en el IDE de Visual Studio permite especificar una propiedad de mitigación de Spectre para sus proyectos. Esta propiedad establece la opción /Qspectre del compilador y cambia las rutas de acceso de la biblioteca para vincular las bibliotecas en tiempo de ejecución mitigadas por Spectre. Si estas bibliotecas no se instalan al compilar el código, el sistema de compilación notifica la advertencia MSB8038: "La mitigación de Spectre está habilitada, pero no se encuentran las bibliotecas mitigadas de Spectre". Si el código MFC o ATL no se puede compilar y el enlazador notifica un error como "error irrecuperable LNK1104: no se puede abrir el archivo 'oldnames.lib'", estas bibliotecas que faltan pueden ser la causa.

Hay varias maneras de especificar las bibliotecas mitigadas por Spectre en la línea de comandos de compilación. Puede especificar la ruta de acceso a las bibliotecas mitigadas por Spectre mediante la opción /LIBPATH del enlazador para convertirlos en las bibliotecas predeterminadas. Puede usar la opción /NODEFAULTLIB del enlazador y vincular explícitamente las bibliotecas mitigadas por Spectre. O bien, puede establecer la variable de entorno LIBPATH para incluir la ruta de acceso a las bibliotecas mitigadas por Spectre para la plataforma de destino. Una manera de establecer esta ruta de acceso en el entorno es usar un símbolo del sistema para desarrolladores configurado mediante la opción spectre_mode. Para obtener más información, consulte Usar las herramientas de desarrollo en una ventana de comandos existente.

Las bibliotecas en tiempo de ejecución mitigadas por Spectre para las plataformas x86, x64 y ARM están disponibles como parte de la revisión disponible a través de KB 4338871. De forma predeterminada, estas bibliotecas se instalan en los directorios siguientes:

  • x86: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre
  • x64: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\amd64
  • ARM: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm

Hay varias maneras de especificar las bibliotecas mitigadas por Spectre en la línea de comandos de compilación. Puede especificar la ruta de acceso a las bibliotecas mitigadas por Spectre mediante la opción /LIBPATH del enlazador para convertirlos en las bibliotecas predeterminadas. Puede usar la opción /NODEFAULTLIB del enlazador y vincular explícitamente las bibliotecas mitigadas por Spectre. O bien, puede establecer la variable de entorno LIBPATH para incluir la ruta de acceso a las bibliotecas mitigadas por Spectre para la arquitectura de destino. Para más información, vea Usar el conjunto de herramientas de Microsoft C++ desde la línea de comandos.

Información adicional

Para más información, consulte el sitio oficial Microsoft Security Advisory ADV180002, Guidance to mitigate speculative execution side-channel vulnerabilities (Instrucciones para mitigar los ataques de canal lateral de ejecución especulativa). También hay instrucciones de Intel, Speculative Execution Side Channel Mitigations (Mitigaciones de canal lateral de ejecución especulativa) y ARM, Cache Speculation Side-channels (Almacenamiento en caché de canales de ejecución especulativa).

Para obtener información específica de Windows sobre las mitigaciones de Spectre y Meltdown, vea Understanding the performance impact of Spectre and Meltdown mitigations on Windows Systems (Descripción del impacto de rendimiento de las mitigaciones de Spectre y Meltdown en sistemas Windows).

Para obtener información general de las vulnerabilidades de Spectre solucionadas por las mitigaciones de MSVC, vea Spectre mitigations in MSVC (Mitigaciones de Spectre en MSVC) en el blog del equipo de Visual C++.

Para establecer esta opción del compilador en el entorno de desarrollo de Visual Studio

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Generación de código.

  3. Seleccione un nuevo valor para la propiedad Mitigación de Spectre. Seleccione Aceptar para aplicar el cambio.

  1. Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para más información, vea Establecimiento del compilador de C++ y de propiedades de compilación en Visual Studio.

  2. Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.

  3. Escriba la opción del compilador /Qspectre en el cuadro Opciones adicionales. Elija Aplicar para aplicar los cambios.

  4. Seleccione la página de propiedades Propiedades de configuración>Enlazador>General.

  5. Para cada plataforma de las propiedades del proyecto, edite la propiedad Directorios de biblioteca adicionales. Establezca la ruta de acceso al directorio de la biblioteca en tiempo de ejecución mitigada por Spectre para la plataforma de destino y, a continuación, elija Aplicar para aplicar el cambio. Elija Aceptar cuando haya terminado.

Para establecer esta opción del compilador mediante programación

Consulte también

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q opciones (Operaciones de bajo nivel)
Opciones del compilador de MSVC
Sintaxis de línea de comandos del compilador de MSVC