/Qspectre

Specifica la generazione di istruzioni del compilatore per mitigare determinate vulnerabilità di sicurezza di Spectre variante 1.

Sintassi

/Qspectre

Osservazioni:

L'opzione /Qspectre fa sì che il compilatore inserisca istruzioni per attenuare determinate vulnerabilità di sicurezza Spectre. Queste vulnerabilità sono denominate attacchi di esecuzione speculativa sul canale laterale. Influiscono su molti sistemi operativi e processori moderni, inclusi processori di Intel, AMD e ARM.

L'opzione /Qspectre è disponibile a partire da Visual Studio 2017 versione 15.5.5 e tutte le versioni successive. È disponibile in Visual Studio 2015 Update 3 a KB 4338871.

L'opzione /Qspectre è disattivata per impostazione predefinita.

Nella versione iniziale, l'opzione /Qspectre ha funzionato solo sul codice ottimizzato. A partire da Visual Studio 2017 versione 15.7, l'opzione /Qspectre è supportata a tutti i livelli di ottimizzazione.

Diverse librerie Microsoft C++ sono disponibili anche nelle versioni con mitigazione Spectre. Le librerie con mitigazione Spectre per Visual Studio possono essere scaricate nella Programma di installazione di Visual Studio. Si trovano nella scheda Singoli componenti in Compilatori, strumenti di compilazione e runtime e hanno "Libs for Spectre" nel nome. Sia le librerie di runtime DLL che le librerie di runtime statiche con mitigazione abilitate sono disponibili per un subset dei runtime di Visual C++: codice di avvio di VC++, vcruntime140, msvcp140, concrt140 e vcamp140. Le DLL sono supportate solo per la distribuzione locale dell'applicazione. Il contenuto delle librerie di runtime di Visual C++ Redistributable non è modificato.

È anche possibile installare librerie con mitigazione Spectre per MFC e ATL. Sono disponibili nella scheda Singoli componenti in SDK, librerie e framework.

Nota

Non esistono versioni di librerie con mitigazione Spectre per app o componenti UWP (Universal Windows). La distribuzione locale dell'app di tali librerie non è possibile.

Applicabilità

Se il codice opera sui dati che superano un limite di attendibilità, è consigliabile usare l'opzione /Qspectre per ricompilare e ridistribuire il codice per attenuare il problema il prima possibile. Un esempio di codice di questo tipo è il codice che carica input non attendibile che può influire sull'esecuzione. Ad esempio, il codice che effettua chiamate di procedura remota, analizza file o input non attendibili o usa altre interfacce IPC (Local Inter-Process Communication). Le tecniche di sandboxing standard potrebbero non essere sufficienti. Esaminare attentamente le sandbox prima di decidere che il codice non supera un limite di attendibilità.

Disponibilità

L'opzione /Qspectre è disponibile a partire da Visual Studio 2017 versione 15.5.5 e in tutti gli aggiornamenti ai compilatori Microsoft C/C++ (MSVC) effettuati il 23 gennaio 2018. Usare il programma di installazione di Visual Studio per aggiornare il compilatore e per installare le librerie con mitigazione Spectre come singoli componenti. L'opzione /Qspectre è disponibile anche in Visual Studio 2015 Update 3 tramite una patch. Per altre informazioni, vedere KB 4338871.

Tutte le versioni di Visual Studio 2017 versione 15.5 e tutte le anteprime di Visual Studio 2017 versione 15.6. includere un'opzione non documentata, /d2guardspecload. Equivale al comportamento iniziale di /Qspectre. È possibile usare /d2guardspecload per applicare le stesse mitigazioni al codice in queste versioni del compilatore. È consigliabile aggiornare la compilazione da usare /Qspectre nei compilatori che supportano l'opzione . L'opzione /Qspectre può anche supportare nuove mitigazioni nelle versioni successive del compilatore.

Effetto

L'opzione /Qspectre restituisce il codice per attenuare specter variant 1, Bounds Check Bypass, CVE-2017-5753. Funziona tramite l'inserimento di istruzioni che agiscono da barriera per l'esecuzione speculativa di codice. Le istruzioni specifiche usate per mitigare la speculazione del processore dipendono dal processore e dalla relativa microarchitettura e possono cambiare nelle versioni future del compilatore.

Quando si abilita l'opzione /Qspectre , il compilatore tenta di identificare le istanze in cui l'esecuzione speculativa può ignorare i limiti. È qui che inserisce le istruzioni della barriera. È importante tenere presenti i limiti all'analisi che un compilatore può eseguire per identificare le istanze della variante 1. Di conseguenza, non esiste alcuna garanzia che tutte le possibili istanze della variante 1 siano instrumentate in /Qspectre.

Impatto sulle prestazioni

L'effetto delle /Qspectre prestazioni sembrava trascurabile in diverse codebase sizable. Tuttavia, non ci sono garanzie che le prestazioni del codice in /Qspectre rimangano invariate. È consigliabile eseguire un benchmark sul codice per determinare l'effetto dell'opzione sulle prestazioni. Se si sa che la mitigazione non è necessaria in un blocco o un ciclo critico per le prestazioni, è possibile disabilitare in modo selettivo la mitigazione usando una __declspec(spectre(nomitigation)) direttiva. Questa direttiva non è disponibile nei compilatori che supportano solo l'opzione /d2guardspecload .

Librerie obbligatorie

L'opzione /Qspectre del compilatore riduce i problemi nel proprio codice. Per una maggiore protezione, è consigliabile usare anche librerie create per fornire mitigazioni Spectre. Diverse librerie di runtime Di Microsoft sono disponibili con mitigazioni Spectre.

Queste librerie sono componenti facoltativi che è necessario installare con il programma di installazione di Visual Studio:

  • Versione MSVC version_numbers Libs per Spectre [(x86 e x64) | (ARM) | (ARM64)]
  • ATL di Visual C++ per [(x86/x64) | ARM | ARM64] con mitigazioni Spectre
  • MFC di Visual C++ per [x86/x64 | ARM | ARM64] con mitigazioni Spectre

Il sistema di progetto predefinito basato su MSBuild nell'IDE di Visual Studio consente di specificare una proprietà Spectre Mitigation per i progetti. Questa proprietà imposta l'opzione del /Qspectre compilatore e modifica i percorsi della libreria per collegare le librerie di runtime con mitigazione Spectre. Se queste librerie non vengono installate quando si compila il codice, il sistema di compilazione segnala l'avviso MSB8040. Se il codice MFC o ATL non riesce a compilare e il linker segnala un errore, ad esempio "errore irreversibile LNK1104: impossibile aprire il file 'oldnames.lib'", queste librerie mancanti potrebbero essere la causa.

Il sistema di progetto predefinito basato su MSBuild nell'IDE di Visual Studio consente di specificare una proprietà Spectre Mitigation per i progetti. Questa proprietà imposta l'opzione del /Qspectre compilatore e modifica i percorsi della libreria per collegare le librerie di runtime con mitigazione Spectre. Se queste librerie non vengono installate quando si compila il codice, il sistema di compilazione segnala l'avviso MSB8038: "La mitigazione Spectre è abilitata ma le librerie con mitigazione Spectre non vengono trovate". Se il codice MFC o ATL non riesce a compilare e il linker segnala un errore, ad esempio "errore irreversibile LNK1104: impossibile aprire il file 'oldnames.lib'", queste librerie mancanti potrebbero essere la causa.

Esistono diversi modi per specificare le librerie con mitigazione Spectre nella riga di comando di compilazione. È possibile specificare il percorso delle librerie con mitigazione Spectre usando l'opzione /LIBPATH del linker per renderle le librerie predefinite. È possibile usare l'opzione /NODEFAULTLIB del linker e collegare in modo esplicito le librerie con mitigazione Spectre. In alternativa, è possibile impostare la LIBPATH variabile di ambiente in modo da includere il percorso delle librerie con mitigazione Spectre per la piattaforma di destinazione. Un modo per impostare questo percorso nell'ambiente consiste nell'usare un prompt dei comandi per sviluppatori configurato usando l'opzione spectre_mode . Per altre informazioni, vedere Usare gli strumenti di sviluppo in una finestra di comando esistente.

Le librerie di runtime con mitigazione spectre per le piattaforme x86, x64 e ARM sono disponibili come parte della patch disponibile tramite kb 4338871. Per impostazione predefinita, queste librerie vengono installate nelle directory seguenti:

  • 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
  • BRACCIO: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm

Esistono diversi modi per specificare le librerie con mitigazione Spectre nella riga di comando di compilazione. È possibile specificare il percorso delle librerie con mitigazione Spectre usando l'opzione /LIBPATH del linker per renderle le librerie predefinite. È possibile usare l'opzione /NODEFAULTLIB del linker e collegare in modo esplicito le librerie con mitigazione Spectre. In alternativa, è possibile impostare la LIBPATH variabile di ambiente in modo da includere il percorso delle librerie con mitigazione Spectre per l'architettura di destinazione. Per altre informazioni, vedere Usare il set di strumenti Microsoft C++ dalla riga di comando.

Informazioni aggiuntive

Per altre informazioni, vedere l'ADV180002 ufficiale dell'avviso sulla sicurezza Microsoft, Linee guida per attenuare le vulnerabilità del canale laterale dell'esecuzione speculativa. Sono inoltre disponibili istruzioni di Intel, Speculative Execution Side Channel Mitigations, e di ARM, Cache Speculation Side-channels.

Per una panoramica specifica di Windows sulle mitigazioni Spectre e Meltdown, vedere Informazioni sull'impatto sulle prestazioni delle mitigazioni Spectre e Meltdown nei sistemi Windows.

Per una panoramica delle vulnerabilità spectre risolte dalle mitigazioni MSVC, vedere Spectre mitigations in MSVC (Mitigazioni Spectre in MSVC ) nel blog del team C++.

Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Generazione codice.

  3. Selezionare un nuovo valore per la proprietà Spectre Mitigation . Scegliere OK per applicare la modifica.

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà di configurazione>C/C++>Riga di comando.

  3. Immettere l'opzione /Qspectre del compilatore nella casella Opzioni aggiuntive. Scegliere Applica per applicare la modifica.

  4. Selezionare la pagina delle>proprietà Proprietà di configurazione Linker>Generale.

  5. Per ogni piattaforma nelle proprietà del progetto, modificare la proprietà Directory librerie aggiuntive . Impostare il percorso della directory della libreria di runtime con mitigazione Spectre per la piattaforma di destinazione e quindi scegliere Applica per applicare la modifica. Al termine, scegliere OK.

Per impostare l'opzione del compilatore a livello di codice

Vedi anche

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q opzioni (operazioni di basso livello)
Opzioni del compilatore MSVC
Sintassi della riga di comando del compilatore MSVC