Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Especifica a geração de instruções do compilador para mitigar determinadas vulnerabilidades de segurança da variante 1 do Spectre.
Sintaxe
/Qspectre
Observações
A /Qspectre opção faz com que o compilador insira instruções para mitigar certas vulnerabilidades de segurança do Spectre. Essas vulnerabilidades são chamadas de ataques de canal lateral de execução especulativa. Eles afetam muitos sistemas operacionais e processadores modernos, incluindo processadores da Intel, AMD e ARM.
A /Qspectre opção está disponível a partir da versão 15.5.5 do Visual Studio 2017 e de todas as versões posteriores. Está disponível na Atualização 3 do Visual Studio 2015 através da 4338871 KB.
A /Qspectre opção está desativada por padrão.
Em sua versão inicial, a /Qspectre opção só funcionava em código otimizado. A partir do Visual Studio 2017 versão 15.7, a opção é suportada /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 Spectre. As bibliotecas mitigadas pelo Spectre para Visual Studio podem ser baixadas no Visual Studio Installer. Eles são encontrados na guia Componentes individuais em Compiladores, ferramentas de compilação e tempos de execução, e têm "Libs for Spectre" no nome. Bibliotecas de DLL e de tempo de execução estático com mitigação habilitada estão disponíveis para um subconjunto dos tempos de execução do Visual C++: código de inicialização VC++, vcruntime140, msvcp140, concrt140 e vcamp140. As DLLs são suportadas apenas para implantação local de aplicativo. O conteúdo do Visual C++ Runtime Libraries Redistributable não é modificado.
Você também pode instalar bibliotecas mitigadas pelo Spectre para MFC e ATL. Eles são encontrados na guia Componentes individuais em SDKs, bibliotecas e estruturas.
Observação
Não há versões de bibliotecas mitigadas pelo Spectre para aplicativos ou componentes do Universal Windows (UWP). A implantação local de aplicativos dessas bibliotecas não é possível.
Aplicabilidade
Se seu código opera em dados que cruzam um limite de confiança, recomendamos que você use a /Qspectre opção para reconstruir e reimplantar seu código para mitigar 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 entradas ou arquivos não confiáveis ou usa outras interfaces de comunicação entre processos (IPC) locais. As técnicas padrão de sandboxing podem não ser suficientes. Investigue suas sandboxes cuidadosamente antes de decidir que seu código não ultrapassa um limite de confiança.
Disponibilidade
A /Qspectre opção está disponível a partir do Visual Studio 2017 versão 15.5.5 e em todas as atualizações para compiladores Microsoft C/C++ (MSVC) feitas em ou após 23 de janeiro de 2018. Use o Visual Studio Installer para atualizar o compilador e instalar as bibliotecas atenuadas pelo Spectre como componentes individuais. A /Qspectre opção também está disponível no Visual Studio 2015 Atualização 3 por meio de um patch. Para obter mais informações, consulte KB 4338871.
Todas as versões do Visual Studio 2017 versão 15.5 e todas as visualizações do Visual Studio 2017 versão 15.6. incluir uma opção não documentada, /d2guardspecload. É equivalente ao comportamento inicial do /Qspectre. Você pode usar /d2guardspecload para aplicar as mesmas atenuações ao seu código nessas versões do compilador. Recomendamos que você atualize sua compilação para usar /Qspectre em compiladores que suportam a opção. A /Qspectre opção também pode suportar novas atenuações em versões posteriores do compilador.
Efeito
A /Qspectre opção produz código para mitigar a variante Specter 1, Bounds Check Bypass, CVE-2017-5753. Funciona através da inserção de instruções que atuam como uma barreira especulativa de execução de código. As instruções específicas usadas para mitigar a especulação do processador dependem do processador e de sua microarquitetura, e podem mudar em versões futuras do compilador.
Quando você habilita a /Qspectre opção, o compilador tenta identificar instâncias em que a execução especulativa pode ignorar 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. Como tal, não há garantia de que todas as instâncias possíveis da variante 1 sejam instrumentadas em /Qspectre.
Impacto no desempenho
O efeito de sobre o desempenho pareceu ser negligenciável em várias bases de /Qspectre código consideráveis. No entanto, não há garantias de que o desempenho do seu código em /Qspectre permaneça inalterado. Você deve comparar seu código para determinar o efeito da opção no desempenho. Se você souber que a mitigação não é necessária em um bloco ou loop crítico de desempenho, poderá desativá-la seletivamente usando uma __declspec(spectre(nomitigation)) diretiva. Esta diretiva não está disponível em compiladores que suportam apenas a /d2guardspecload opção.
Bibliotecas necessárias
A /Qspectre opção do compilador atenua problemas em seu próprio código. Para maior proteção, recomendamos que você também use bibliotecas criadas para fornecer mitigações do Spectre. Várias das bibliotecas de tempo de execução da Microsoft estão disponíveis com mitigações do Spectre.
Essas bibliotecas são componentes opcionais que devem ser instalados usando o Visual Studio Installer:
- Versão MSVC version_numbers Libs for Spectre [(x86 e x64) | (BRAÇO) | (ARM64)]
- Visual C++ ATL para [(x86/x64) | BRAÇO | ARM64] com mitigações Spectre
- Visual C++ MFC para [x86/x64 | BRAÇO | ARM64] com mitigações Spectre
O sistema de projeto baseado em MSBuild padrão no IDE do Visual Studio permite especificar uma propriedade Spectre Mitigation para seus projetos. Esta propriedade define a opção do /Qspectre compilador e altera os caminhos da biblioteca para vincular as bibliotecas de tempo de execução mitigadas pelo Spectre. Se essas bibliotecas não forem instaladas quando você criar seu código, o sistema de compilação informará MSB8040 de aviso. Se o seu 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.
O sistema de projeto baseado em MSBuild padrão no IDE do Visual Studio permite especificar uma propriedade Spectre Mitigation para seus projetos. Esta propriedade define a opção do /Qspectre compilador e altera os caminhos da biblioteca para vincular as bibliotecas de tempo de execução mitigadas pelo Spectre. Se essas bibliotecas não forem instaladas quando você criar seu código, o sistema de compilação informará MSB8038 aviso: "A mitigação do Spectre está ativada, mas as bibliotecas mitigadas do Spectre não são encontradas." Se o seu 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 atenuadas pelo Spectre para a linha de comando da compilação. Você pode especificar o caminho para as bibliotecas atenuadas pelo Spectre usando a /LIBPATH opção de vinculador para torná-las as bibliotecas padrão. Você pode usar a /NODEFAULTLIB opção vinculador e vincular explicitamente as bibliotecas mitigadas pelo Spectre. Ou, você pode definir a LIBPATH variável de ambiente para incluir o caminho para as bibliotecas mitigadas pelo Spectre para sua plataforma de destino. Uma maneira de definir esse caminho no ambiente é usar um prompt de comando do desenvolvedor configurado usando a spectre_mode opção. Para obter mais informações, consulte Usar as ferramentas de desenvolvedor em uma janela de comando existente.
As bibliotecas de tempo de execução mitigadas pelo 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 - BRAÇO:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm
Há várias maneiras de especificar as bibliotecas atenuadas pelo Spectre para a linha de comando da compilação. Você pode especificar o caminho para as bibliotecas atenuadas pelo Spectre usando a /LIBPATH opção de vinculador para torná-las as bibliotecas padrão. Você pode usar a /NODEFAULTLIB opção vinculador e vincular explicitamente as bibliotecas mitigadas pelo Spectre. Ou, você pode definir a LIBPATH variável de ambiente para incluir o caminho para as bibliotecas mitigadas pelo Spectre para sua arquitetura de destino. Para obter mais informações, consulte Usar o conjunto de ferramentas do Microsoft C++ na linha de comando.
Informações adicionais
Para obter mais informações, consulte o ADV180002 oficial do Comunicado de Segurança da Microsoft, Orientação para mitigar vulnerabilidades de canal lateral de execução especulativa. A orientação também está disponível na Intel, Speculative Execution Side Channel Mitigations, e ARM, Cache Speculation Side-channels.
Para obter uma visão geral específica do Windows das mitigações Spectre e Meltdown, consulte Compreendendo o impacto no desempenho das mitigações Spectre e Meltdown em sistemas Windows.
Para obter uma visão geral das vulnerabilidades do Spectre abordadas pelas mitigações do MSVC, consulte Mitigações do Spectre no MSVC no Blog da equipe C++.
Para definir essa opção de compilador no ambiente de desenvolvimento do Visual Studio
Abra a caixa de diálogo Property Pages do projeto. Para obter detalhes, consulte Definir compilador C++ e criar propriedades no Visual Studio.
Selecione a página de propriedades Configuration Properties>C/C++>Code Generation página de propriedades.
Selecione um novo valor para a propriedade Spectre Mitigation . Escolha OK para aplicar a alteração.
Abra a caixa de diálogo Property Pages do projeto. Para obter detalhes, consulte Definir compilador C++ e criar propriedades no Visual Studio.
Selecione a Configuration Properties>C/C++>Command Line página de propriedades.
Insira a opção do
/Qspectrecompilador na caixa Opções adicionais . Escolha Aplicar para aplicar a alteração.Selecione a página de propriedades Configuration Properties>Linker>General .
Para cada plataforma nas propriedades do projeto, edite a propriedade Diretórios de biblioteca adicionais . Defina o caminho para o diretório da biblioteca de tempo de execução mitigada pelo Spectre para a plataforma de destino e escolha Aplicar para aplicar a alteração. Quando terminar, escolha OK.
Para definir essa opção do compilador programaticamente
- Consulte AdditionalOptions.
Ver também
/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q opções (operações de baixo nível)
opções do compilador MSVC
de sintaxe de linha de comando do compilador MSVC