/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
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.
Seleccione la página de propiedades Propiedades de configuración>C/C++>Generación de código.
Seleccione un nuevo valor para la propiedad Mitigación de Spectre. Seleccione Aceptar para aplicar el cambio.
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.
Seleccione la página de propiedades Propiedades de configuración>C/C++>Línea de comandos.
Escriba la opción del compilador
/Qspectre
en el cuadro Opciones adicionales. Elija Aplicar para aplicar los cambios.Seleccione la página de propiedades Propiedades de configuración>Enlazador>General.
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
- Vea AdditionalOptions.
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