/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.

Wirkung

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 /Qspectrewerden.

Auswirkungen auf die Leistung

Die Auswirkung auf /Qspectre die Leistung scheint in mehreren sizierbaren Codebasen zu vernachlässigen. Es gibt jedoch keine Garantien dafür, dass die Leistung Ihres Codes nicht /Qspectre betroffen ist Standard. 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

  1. Ö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).

  2. Wählen Sie die Eigenschaftenseite Konfigurationseigenschaften>C/C++>Codegenerierung aus.

  3. Wählen Sie einen neuen Wert für die Spectre Mitigation-Eigenschaft aus . Wählen Sie OK aus, um die Änderung zu übernehmen.

  1. Ö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).

  2. Klicken Sie auf der Eigenschaftenseite auf Konfigurationseigenschaften>C/C++>Befehlszeile.

  3. Geben Sie die /Qspectre Compileroption im Feld "Zusätzliche Optionen " ein. Wählen Sie "Übernehmen" aus, um die Änderung anzuwenden.

  4. Wählen Sie die Seite "Konfigurationseigenschaften linker>Allgemein" aus.>

  5. 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 auch

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q Optionen (Vorgänge auf niedriger Ebene)
MSVC-Compileroptionen
MSVC-Compiler-Befehlszeilensyntax