/Qspectre

Especifica a geração do compilador de instruções para atenuar algumas vulnerabilidades de segurança da variante 1 de Espectro.

Sintaxe

/Qspectre

Comentários

A opção /Qspectre faz com que o compilador insira instruções para atenuar algumas vulnerabilidades de segurança Spectre. Essas vulnerabilidades são chamadas ataques de temporização de execução especulativa. Elas afetam muitos sistemas operacionais e processadores modernos, incluindo processadores da Intel, da AMD e da ARM.

A opção /Qspectre está disponível a partir do Visual Studio 2017 versão 15.5.5 e todas as versões posteriores. Ela está disponível no Visual Studio 2015 Atualização 3 por meio do KB 4338871.

A opção /Qspectre é desativada por padrão.

Em sua versão inicial, a opção /Qspectre só funcionava no código otimizado. A partir do Visual Studio 2017 versão 15.7 há suporte para a opção /Qspectre em todos os níveis de otimização.

Várias bibliotecas do Microsoft C++ também estão disponíveis em versões com mitigação da Spectre. As bibliotecas para o Visual Studio com mitigação da Spectre podem ser baixadas no Instalador do Visual Studio. Elas são encontradas na guia Componentes Individuais em Compiladores, ferramentas de build e runtimes e têm "Libs for Spectre" no nome. As bibliotecas de runtime estático e de DLL com mitigação habilitada estão disponíveis para um subconjunto dos runtimes do Visual C++: código de inicialização do VC++, vcruntime140, msvcp140, concrt140 e vcamp140. As DLLs têm suporte somente para implantação local do aplicativo. O conteúdo do Visual C++ Runtime Libraries Redistributable não é modificado.

Instale também as bibliotecas com mitigação do Spectre para o MFC e a ATL. Elas são encontradas na guia Componentes Individuais em SDKs, bibliotecas e estruturas.

Observação

Não há versões de bibliotecas com mitigação do Spectre para aplicativos ou componentes da UWP (Universal do Windows). A implantação local do aplicativo dessas bibliotecas não é possível.

Aplicabilidade

Se o código opera em dados que cruzam um limite de confiança, recomendamos que você use a opção /Qspectre para recompilar e reimplantar o código a fim de atenuar esse problema o mais rápido possível. Um exemplo desse código é o código que carrega entradas não confiáveis que podem afetar a execução. Por exemplo, o código que faz chamadas de procedimento remoto, analisa uma entrada ou arquivos não confiáveis ou usa outras interfaces locais de IPC (comunicação entre processos). As técnicas padrão de área restrita podem não ser suficientes. Investigue as áreas restritas cuidadosamente para decidir se o código não cruza um limite de confiança.

Disponibilidade

A opção /Qspectre está disponível a partir do Visual Studio 2017 versão 15.5.5 e em todas as atualizações nos compiladores do Microsoft C/C++ (MSVC) feitas em 23 de janeiro de 2018 ou após essa data. Use o Instalador do Visual Studio para atualizar o compilador e instalar as bibliotecas atenuadas para Espectro como componentes individuais. A opção /Qspectre também está disponível no Visual Studio 2015 Atualização 3 por meio de um patch. Para obter mais informações, confira KB 4338871.

Todas as versões do Visual Studio 2017 versão 15.5 e todas as Versões prévias do Visual Studio 2017 versão 15.6. incluem uma opção não documentada, /d2guardspecload. Ela é equivalente ao comportamento inicial da /Qspectre. Use /d2guardspecload para aplicar as mesmas mitigações ao código nessas versões do compilador. Recomendamos que você atualize seu build para usar /Qspectre em compiladores que dão suporte à opção. A opção /Qspectre também pode dar suporte a novas mitigações em versões posteriores do compilador.

Efeito

A opção /Qspectre produz um código para atenuar a variante 1 da Spectre, Bypass de Verificação de Limites, CVE-2017-5753. Ela funciona pela inserção de instruções que funcionam como uma barreira para a execução especulativa de código. As instruções específicas usadas para atenuar a especulação do processador dependem do processador e de sua microarquitetura e podem ser alteradas em versões futuras do compilador.

Quando você habilita a opção /Qspectre, o compilador tenta identificar as instâncias em que a execução especulativa pode ignorar as verificações de limites. É aí que ele insere as instruções de barreira. É importante estar ciente dos limites da análise que um compilador pode fazer para identificar instâncias da variante 1. Dessa forma, não há nenhuma garantia de que todas as possíveis instâncias da variante 1 estejam instrumentadas em /Qspectre.

Impacto sobre o desempenho

O efeito da /Qspectre no desempenho pareceu ser insignificante em várias bases de código consideráveis. No entanto, não há garantias de que o desempenho do seu código sob /Qspectre permanecerá sem impacto. Você deve submeter o código a benchmark para determinar o efeito da opção no desempenho. Se você souber que a mitigação não será necessária em um bloco ou um loop crítico para o desempenho, você poderá desabilitar seletivamente a mitigação pelo uso de uma diretiva __declspec(spectre(nomitigation)). Essa diretiva não está disponível nos compiladores que só dão suporte à opção /d2guardspecload.

Bibliotecas necessárias

A opção do compilador /Qspectre atenua problemas em seu próprio código. Para maior proteção, é altamente recomendável que você também use bibliotecas criadas para fornecer mitigações do Spectre. Várias das bibliotecas do runtime da Microsoft estão disponíveis com mitigações do Spectre.

Essas bibliotecas são componentes opcionais que precisam ser instalados usando o Instalador do Visual Studio:

  • Bibliotecas do MSVC versão version_numbers para Spectre [(x86 e x64) | (ARM) | (ARM64)]
  • ATL do Visual C++ para [(x86/x64) | ARM | ARM64] com Mitigações para Spectre
  • MFC do Visual C++ para [x86/x64 | ARM | ARM64] com Mitigações para Spectre

O sistema de projeto baseado no MSBuild padrão no IDE do Visual Studio permite que você especifique uma propriedade de Mitigação de Spectre em seus projetos. Essa propriedade define a opção do compilador /Qspectre e altera os caminhos da biblioteca para vincular as bibliotecas de runtime com mitigação de Spectre. Se essas bibliotecas não estiverem instaladas quando você compilar o código, o sistema de build informará o aviso MSB8040. Se houver falha ao compilar o código da MFC ou da ATL e o vinculador informar um erro, como "erro fatal LNK1104: não é possível abrir o arquivo 'oldnames.lib'", essas bibliotecas ausentes poderão ser a causa.

O sistema de projeto baseado no MSBuild padrão no IDE do Visual Studio permite que você especifique uma propriedade de Mitigação de Spectre em seus projetos. Essa propriedade define a opção do compilador /Qspectre e altera os caminhos da biblioteca para vincular as bibliotecas de runtime com mitigação de Spectre. Se essas bibliotecas não estiverem instaladas quando você compilar seu código, o sistema de compilação relatará a MSB8038 de aviso: "A mitigação do Spectre está habilitada, mas as bibliotecas atenuadas do Spectre não foram encontradas". Se o código MFC ou ATL falhar ao compilar e o vinculador relatar um erro como "erro fatal LNK1104: não é possível abrir o arquivo 'oldnames.lib'", essas bibliotecas ausentes podem ser a causa.

Há várias maneiras de especificar as bibliotecas com mitigação do Spectre para a linha de comando de build. Você pode especificar o caminho para as bibliotecas com mitigação do Spectre usando a opção /LIBPATH do vinculador para torná-las as bibliotecas padrão. Você pode usar a opção /NODEFAULTLIB do vinculador e vincular explicitamente as bibliotecas com mitigação do Spectre. Ou, você pode definir a variável de ambiente LIBPATH para incluir o caminho para as bibliotecas com mitigação do Spectre para sua plataforma de destino. Uma forma de definir esse caminho no ambiente é usar um prompt de comando do desenvolvedor configurado com o uso da opção spectre_mode. Para obter mais informações, confira Usar as ferramentas para desenvolvedores em uma janela Comando existente.

Bibliotecas de runtime com mitigação do Spectre para plataformas x86, x64 e ARM estão disponíveis como parte do patch disponível por meio do KB 4338871. Por padrão, essas bibliotecas são instaladas nos seguintes diretórios:

  • 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

Há várias maneiras de especificar as bibliotecas com mitigação do Spectre para a linha de comando de build. Você pode especificar o caminho para as bibliotecas com mitigação do Spectre usando a opção /LIBPATH do vinculador para torná-las as bibliotecas padrão. Você pode usar a opção /NODEFAULTLIB do vinculador e vincular explicitamente as bibliotecas com mitigação do Spectre. Ou, você pode definir a variável de ambiente LIBPATH para incluir o caminho para as bibliotecas com mitigação do Spectre para sua arquitetura de destino. Para obter mais informações, confira Usar o conjunto de ferramentas do Microsoft C++ na linha de comando.

Informações adicionais

Para obter mais informações, confira o Microsoft Security Advisory ADV180002 oficial, Diretrizes para mitigação das vulnerabilidades de ataques de temporização de execução especulativa. As diretrizes também estão disponível na Intel, Mitigações de ataques de temporização de execução especulativa, e na ARM, Ataques de temporização de especulação de cache.

Para obter uma visão específica do Windows das mitigações do Spectre e Meltdown, confira Noções básicas sobre o impacto no desempenho das mitigações de Spectre e Meltdown em sistemas Windows.

Para obter uma visão geral das vulnerabilidades do Spectre resolvidas pelas mitigações do MSVC, confira Mitigações do Spectre no MSVC no blog da equipe do C++.

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.

  2. Selecione a página de propriedades Propriedades da Configuração>C/C++>Geração de Código.

  3. Selecione um novo valor para a propriedade Mitigação do Spectre. Escolha OK para aplicar a alteração.

  1. Abra a caixa de diálogo Páginas de Propriedades do projeto. Para obter detalhes, confira Definir as propriedades de build e do compilador do C++ no Visual Studio.

  2. Selecione a página de propriedades Propriedades de Configuração>C/C++>Linha de Comando.

  3. Digite a opção do compilador /Qspectre na caixa Opções Adicionais. Escolha Aplicar para aplicar as alterações.

  4. Selecione a página de propriedades Propriedades da Configuração>Vinculador>Geral.

  5. Para cada Plataforma nas propriedades do seu projeto, edite a propriedade Diretórios de Biblioteca Adicionais. Defina o caminho para o diretório da biblioteca de runtime com mitigação do Spectre para a plataforma de destino e, em seguida, escolha Aplicar para aplicar a alteração. Quando estiver concluído, escolha OK.

Para definir essa opção do compilador via programação

Confira também

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
Opções /Q (operações de baixo nível)
Opções do compilador MSVC
Sintaxe de linha de comando do compilador MSVC