/Qspectre
Gibt die Compilergenerierung von Anweisungen an, um bestimmte mit Spectre-Variante 1 zusammenhängende Sicherheitsrisiken abzumildern.
Syntax
/Qspectre
Hinweise
Die /Qspectre
Option bewirkt, dass der Compiler Anweisungen einfügt, um bestimmte Sicherheitsrisiken von Spectre zu mindern. Diese Sicherheitsrisiken werden als spekulative Ausführungs-Side-Channel-Angriffe bezeichnet. Sie wirken sich auf viele Betriebssysteme und moderne Prozessoren aus, darunter Prozessoren von Intel, AMD und ARM.
Die /Qspectre
Option ist ab Visual Studio 2017, Version 15.5.5, und allen höheren Versionen verfügbar. Es ist in Visual Studio 2015 Update 3 bis KB 4338871 verfügbar.
Die /Qspectre
Option ist standardmäßig deaktiviert.
In der ursprünglichen Version funktionierte die /Qspectre
Option nur für optimierten Code. Ab Visual Studio 2017, Version 15.7, wird die /Qspectre
Option auf allen Optimierungsebenen unterstützt.
Mehrere Microsoft C++-Bibliotheken sind auch in Versionen mit Spectre-Entschärfung verfügbar. Die spectre-gemilderten Bibliotheken für Visual Studio können im Visual Studio-Installer heruntergeladen werden. Sie befinden sich auf der Registerkarte "Einzelne Komponenten " unter "Compiler", "Buildtools und Laufzeiten", und weisen "Libs for Spectre" im Namen auf. Sowohl DLL- als auch statische Laufzeitbibliotheken mit aktivierter Entschärfung sind für eine Teilmenge der Visual C++-Laufzeiten verfügbar: VC++-Startcode, vcruntime140, msvcp140, concrt140 und vcamp140. Die DLLs werden nur für die anwendungslokale Bereitstellung unterstützt. Der Inhalt der Redistributable für Visual C++-Runtime-Bibliotheken ist unverändert.
Sie können spectre-abgemilderte Bibliotheken auch für MFC und ATL installieren. Sie befinden sich auf der Registerkarte "Einzelne Komponenten " unter SDKs, Bibliotheken und Frameworks.
Hinweis
Es gibt keine Versionen von Spectre-entschärften Bibliotheken für UWP-Apps (Universelle Windows-Apps) oder -Komponenten. App-lokale Bereitstellung solcher Bibliotheken ist nicht möglich.
Anwendbarkeit
Wenn Ihr Code daten verwendet, die eine Vertrauensgrenze überschreiten, empfiehlt es sich, den /Qspectre
Code so schnell wie möglich neu zu erstellen und erneut bereitzustellen, um dieses Problem so schnell wie möglich zu beheben. Ein Beispiel für einen solchen Code ist Code, der nicht vertrauenswürdige Eingaben lädt, die sich auf die Ausführung auswirken können. Beispielsweise Code, der Remoteprozeduraufrufe vorgibt, nicht vertrauenswürdige Eingaben oder Dateien analysiert oder andere lokale Interprozesskommunikationsschnittstellen (IPC) verwendet. Standardtechniken wie das Verwenden einer Sandbox sind möglicherweise nicht ausreichend. Untersuchen Sie Ihre Sandkasten sorgfältig, bevor Sie entscheiden, dass Ihr Code keine Vertrauensgrenze überschreitet.
Verfügbarkeit
Die /Qspectre
Option ist ab Visual Studio 2017, Version 15.5.5, und in allen Updates für Microsoft C/C++-Compiler (MSVC), die am oder nach dem 23. Januar 2018 vorgenommen wurden, verfügbar. Verwenden Sie den Visual Studio-Installer, um den Compiler zu aktualisieren und um die Spectre-entschärften Bibliotheken als einzelne Komponenten zu installieren. Die /Qspectre
Option ist auch in Visual Studio 2015 Update 3 über einen Patch verfügbar. Weitere Informationen finden Sie in KB 4338871.
Alle Versionen von Visual Studio 2017, Version 15.5, und alle Vorschauen von Visual Studio 2017, Version 15.6. schließen Sie eine nicht dokumentierte Option ein, /d2guardspecload
. Es entspricht dem anfänglichen Verhalten von /Qspectre
. Sie können /d2guardspecload
die gleichen Gegenmaßnahmen auf Ihren Code in diesen Versionen des Compilers anwenden. Es wird empfohlen, den Build so zu aktualisieren, dass er in Compilern verwendet /Qspectre
wird, die die Option unterstützen. Die /Qspectre
Option kann auch neue Gegenmaßnahmen in späteren Versionen des Compilers unterstützen.
Effekt
Die /Qspectre
Option gibt Code aus, um specter variant 1, Bounds Check Bypass, CVE-2017-5753 zu minimieren. Sie funktioniert durch Einfügen von Anwendungen, die als Sperre der spekulativen Codeausführung fungieren. Die spezifischen Anweisungen zur Entschärfung der Prozessorspekulation hängen vom Prozessor und seiner Mikroarchitektur ab und können sich in kommenden Versionen des Compilers ändern.
Wenn Sie die /Qspectre
Option aktivieren, versucht der Compiler, Instanzen zu identifizieren, in denen spekulative Ausführung Begrenzungsprüfungen umgehen kann. Dort werden die Barriereanweisungen eingefügt. Es ist wichtig, die Grenzwerte für die Analyse zu kennen, die ein Compiler tun kann, um Instanzen von Variante 1 zu identifizieren. Daher gibt es keine Garantie dafür, dass alle möglichen Instanzen von Variante 1 unter instrumentiert /Qspectre
werden.
Auswirkungen auf die Leistung
Die Auswirkung auf /Qspectre
die Leistung scheint in mehreren sizierbaren Codebasen zu vernachlässigen. Es gibt jedoch keine Garantien, dass die Leistung Ihres Codes unter /Qspectre
ihnen unberührt bleibt. Sie sollten Benchmarks Ihres Codes vornehmen, um die Auswirkungen der Option auf die Leistung zu bestimmen. Wenn Sie wissen, dass die Entschärfung in einem leistungskritischen Block oder einer Schleife nicht erforderlich ist, können Sie die Entschärfung selektiv mithilfe einer __declspec(spectre(nomitigation))
Direktive deaktivieren. Diese Direktive ist in Compilern nicht verfügbar, die nur die /d2guardspecload
Option unterstützen.
Erforderliche Bibliotheken
Die /Qspectre
Compileroption entschärft Probleme in Ihrem eigenen Code. Für einen größeren Schutz empfehlen wir Dringend, auch Bibliotheken zu verwenden, die erstellt wurden, um Spectre-Entschärfungen bereitzustellen. Einige der Microsoft-Laufzeitbibliotheken sind mit Spectre-Gegenmaßnahmen verfügbar.
Diese Bibliotheken stellen optionale Komponenten dar, die mithilfe des Visual Studio-Installers installiert werden müssen:
- MSVC-Version version_numbers Libs for Spectre [(x86 und x64) | (ARM) | (ARM64)]
- Visual C++ ATL für [(x86/x64) | ARM | ARM64] mit Spectre Mitigations
- Visual C++ MFC für [x86/x64 | ARM | ARM64] mit Spectre Mitigations
Mit dem standardmäßigen MSBuild-basierten Projektsystem in der Visual Studio-IDE können Sie eine Spectre Mitigation-Eigenschaft für Ihre Projekte angeben. Diese Eigenschaft legt die /Qspectre
Compileroption fest und ändert die Bibliothekspfade, um die spectre-entschärften Laufzeitbibliotheken zu verknüpfen. Wenn diese Bibliotheken beim Erstellen des Codes nicht installiert sind, meldet die Buildsystemwarnung MSB8040. Wenn Ihr MFC- oder ATL-Code nicht erstellt werden kann und der Linker einen Fehler wie "schwerwiegender Fehler LNK1104: Datei 'oldnames.lib'" nicht öffnen kann, können diese fehlenden Bibliotheken die Ursache sein.
Mit dem standardmäßigen MSBuild-basierten Projektsystem in der Visual Studio-IDE können Sie eine Spectre Mitigation-Eigenschaft für Ihre Projekte angeben. Diese Eigenschaft legt die /Qspectre
Compileroption fest und ändert die Bibliothekspfade, um die spectre-entschärften Laufzeitbibliotheken zu verknüpfen. Wenn diese Bibliotheken beim Erstellen des Codes nicht installiert sind, meldet das Buildsystem warnung MSB8038: "Spectre Mitigation is enabled but Spectre mitigationd libraries are not found." Wenn Ihr MFC- oder ATL-Code nicht erstellt werden kann und der Linker einen Fehler wie "schwerwiegender Fehler LNK1104: Datei 'oldnames.lib'" nicht öffnen kann, können diese fehlenden Bibliotheken die Ursache sein.
Es gibt mehrere Möglichkeiten, die spectre-entschärften Bibliotheken für die Build-Befehlszeile anzugeben. Sie können den Pfad zu den spectre-abgemilderten Bibliotheken angeben, indem Sie die /LIBPATH
Linkeroption verwenden, um sie zu den Standardbibliotheken zu machen. Sie können die /NODEFAULTLIB
Linkeroption verwenden und die spectre-entschärften Bibliotheken explizit verknüpfen. Sie können die LIBPATH
Umgebungsvariable auch so festlegen, dass sie den Pfad zu den Spectre-entschärften Bibliotheken für Ihre Zielplattform einschließt. Eine Möglichkeit zum Festlegen dieses Pfads in der Umgebung ist die Verwendung einer Entwickler-Eingabeaufforderung, die mithilfe der spectre_mode
Option eingerichtet wurde. Weitere Informationen finden Sie unter Verwenden der Entwicklertools in einem vorhandenen Befehlsfenster.
Spectre-gemilderte Laufzeitbibliotheken für x86-, x64- und ARM-Plattformen sind als Teil des Patches verfügbar, der über KB-4338871 verfügbar ist. Standardmäßig werden diese Bibliotheken in den folgenden Verzeichnissen installiert:
- 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
Es gibt mehrere Möglichkeiten, die spectre-entschärften Bibliotheken für die Build-Befehlszeile anzugeben. Sie können den Pfad zu den spectre-abgemilderten Bibliotheken angeben, indem Sie die /LIBPATH
Linkeroption verwenden, um sie zu den Standardbibliotheken zu machen. Sie können die /NODEFAULTLIB
Linkeroption verwenden und die spectre-entschärften Bibliotheken explizit verknüpfen. Sie können die LIBPATH
Umgebungsvariable auch so festlegen, dass sie den Pfad zu den Spectre-entschärften Bibliotheken für Ihre Zielarchitektur einschließt. Weitere Informationen finden Sie unter Verwenden des Microsoft C++-Toolsets über die Befehlszeile.
Weitere Informationen
Weitere Informationen finden Sie in der offiziellen Microsoft Security Advisory ADV180002, Anleitung zur Verringerung spekulativer Ausführungs-Side-Channel-Sicherheitslücken. Anweisungen sind außerdem von Intel, Speculative Execution Side Channel Mitigations, und ARM, Cache Speculation Side-channels, erhältlich.
Eine windowsspezifische Übersicht über Spectre- und Meltdown-Gegenmaßnahmen finden Sie unter Grundlegendes zu den Leistungseinbußen von Spectre und Meltdown-Gegenmaßnahmen auf Windows-Systemen.
Eine Übersicht über Speztre-Sicherheitsrisiken, die von den MSVC-Gegenmaßnahmen behoben werden, finden Sie im C++-Teamblog unter Spectre-Entschärfungen in MSVC .
So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).
Wählen Sie die Eigenschaftenseite Konfigurationseigenschaften>C/C++>Codegenerierung aus.
Wählen Sie einen neuen Wert für die Spectre Mitigation-Eigenschaft aus . Wählen Sie OK aus, um die Änderung zu übernehmen.
Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Weitere Informationen erhalten Sie unter Set C++ compiler and build properties in Visual Studio (Festlegen der Compiler- und Buildeigenschaften (C++) in Visual Studio).
Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.
Geben Sie die
/Qspectre
Compileroption im Feld "Zusätzliche Optionen " ein. Wählen Sie "Übernehmen" aus, um die Änderung anzuwenden.Wählen Sie die Seite "Konfigurationseigenschaften linker>Allgemein" aus.>
Bearbeiten Sie für jede Plattform in Ihren Projekteigenschaften die Eigenschaft "Zusätzliche Bibliotheksverzeichnisse" . Legen Sie den Pfad zum Spectre-entschärften Laufzeitbibliotheksverzeichnis für die Zielplattform fest, und wählen Sie dann "Übernehmen" aus, um die Änderung anzuwenden. Wenn Sie fertig sind, wählen Sie "OK" aus.
So legen Sie diese Compileroption programmgesteuert fest
- Siehe AdditionalOptions.
Siehe auch
/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q
Optionen (Vorgänge auf niedriger Ebene)
MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile