/Qspectre
Określa generowanie instrukcji kompilatora w celu ograniczenia niektórych luk w zabezpieczeniach spectre variant 1.
Składnia
/Qspectre
Uwagi
Opcja /Qspectre
powoduje, że kompilator wstawia instrukcje w celu ograniczenia niektórych luk w zabezpieczeniach spectre. Te luki w zabezpieczeniach są nazywane atakami typu side-channel wykonywania spekulatywnego. Mają one wpływ na wiele systemów operacyjnych i nowoczesnych procesorów, w tym procesorów firmy Intel, AMD i ARM.
Opcja /Qspectre
jest dostępna od wersji 15.5.5 i wszystkich nowszych wersji programu Visual Studio 2017. Jest ona dostępna w programie Visual Studio 2015 Update 3 za pośrednictwem 4338871 KB.
Opcja /Qspectre
jest domyślnie wyłączona.
W początkowej /Qspectre
wersji opcja działała tylko na zoptymalizowanym kodzie. Począwszy od programu Visual Studio 2017 w wersji 15.7, /Qspectre
opcja jest obsługiwana na wszystkich poziomach optymalizacji.
Kilka bibliotek języka Microsoft C++ jest również dostępnych w wersjach z ograniczeniem ryzyka spectre. Biblioteki z ograniczeniem ryzyka spectre dla programu Visual Studio można pobrać w Instalator programu Visual Studio. Znajdują się one na karcie Poszczególne składniki w obszarze Kompilatory, narzędzia kompilacji i środowiska uruchomieniowe oraz mają ciąg "Libs for Spectre" w nazwie. Biblioteki DLL i statyczne biblioteki środowiska uruchomieniowego z włączonym ograniczeniem ryzyka są dostępne dla podzbioru środowisk uruchomieniowych Visual C++: kod startowy VC++, vcruntime140, msvcp140, concrt140 i vcamp140. Biblioteki DLL są obsługiwane tylko w przypadku wdrożenia lokalnego aplikacji. Zawartość pakietu redystrybucyjnego bibliotek środowiska uruchomieniowego Visual C++ jest niezmodyfikowana.
Można również zainstalować biblioteki spectre-mitigated dla MFC i ATL. Znajdują się one na karcie Poszczególne składniki w obszarze Zestawy SDK, biblioteki i struktury.
Uwaga
W przypadku aplikacji lub składników systemu Uniwersalnego systemu Windows (UWP) nie ma żadnych wersji bibliotek z ograniczeniem specyfikacji. Wdrożenie takich bibliotek w środowisku lokalnym aplikacji nie jest możliwe.
Możliwość stosowania
Jeśli kod działa na danych, które przekraczają granicę zaufania, zalecamy użycie /Qspectre
opcji ponownego kompilowania i ponownego wdrażania kodu, aby rozwiązać ten problem tak szybko, jak to możliwe. Przykładem takiego kodu jest kod, który ładuje niezaufane dane wejściowe, które mogą mieć wpływ na wykonywanie. Na przykład kod, który wykonuje zdalne wywołania procedur, analizuje niezaufane dane wejściowe lub pliki albo używa innych lokalnych interfejsów komunikacji międzyprocesowej (IPC). Standardowe techniki piaskownicy mogą nie być wystarczające. Dokładnie zbadaj piaskownice przed podjęciem decyzji, że kod nie przekracza granicy zaufania.
Dostępność
Ta /Qspectre
opcja jest dostępna począwszy od programu Visual Studio 2017 w wersji 15.5.5 oraz we wszystkich aktualizacjach kompilatorów Microsoft C/C++ (MSVC) wykonanych 23 stycznia 2018 r. Użyj Instalator programu Visual Studio, aby zaktualizować kompilator i zainstalować biblioteki ograniczone przez specyfikację jako poszczególne składniki. Opcja /Qspectre
jest również dostępna w programie Visual Studio 2015 Update 3 za pośrednictwem poprawki. Aby uzyskać więcej informacji, zobacz kb 4338871.
Wszystkie wersje programu Visual Studio 2017 w wersji 15.5 i wszystkie wersje zapoznawcze programu Visual Studio 2017 w wersji 15.6. uwzględnij opcję nieudokumentowaną, /d2guardspecload
. Jest to równoważne początkowemu zachowaniu elementu /Qspectre
. Możesz użyć /d2guardspecload
polecenia , aby zastosować te same środki zaradcze do kodu w tych wersjach kompilatora. Zalecamy zaktualizowanie kompilacji do użycia /Qspectre
w kompilatorach, które obsługują tę opcję. Opcja /Qspectre
może również obsługiwać nowe środki zaradcze w nowszych wersjach kompilatora.
Efekt
Opcja /Qspectre
zwraca kod, aby wyeliminować problem z wariantem Specter 1, Obejście sprawdzania granic, CVE-2017-5753. Działa przez wstawienie instrukcji, które działają jako spekulatywne bariery wykonywania kodu. Konkretne instrukcje używane do łagodzenia spekulacji procesora zależą od procesora i jego mikro architektury i mogą ulec zmianie w przyszłych wersjach kompilatora.
Po włączeniu /Qspectre
tej opcji kompilator próbuje zidentyfikować wystąpienia, w których wykonywanie spekulacyjne może pominąć kontrole granic. W tym miejscu wstawia instrukcje bariery. Ważne jest, aby pamiętać o limitach analizy, które może wykonać kompilator w celu zidentyfikowania wystąpień wariantu 1. W związku z tym nie ma gwarancji, że wszystkie możliwe wystąpienia wariantu 1 są instrumentowane w ramach programu /Qspectre
.
Wpływ na wydajność
Wpływ /Qspectre
wydajności wydaje się być niewielki w kilku sporadnych bazach kodu. Nie ma jednak gwarancji, że wydajność kodu w obszarze /Qspectre
pozostaje nienaruszona. Należy przeprowadzić test porównawczy kodu, aby określić wpływ opcji na wydajność. Jeśli wiesz, że ograniczenie ryzyka nie jest wymagane w bloku lub pętli krytycznej dla wydajności, możesz selektywnie wyłączyć środki zaradcze przy użyciu __declspec(spectre(nomitigation))
dyrektywy. Ta dyrektywa nie jest dostępna w kompilatorach, które obsługują /d2guardspecload
tylko tę opcję.
Wymagane biblioteki
Opcja kompilatora /Qspectre
ogranicza problemy we własnym kodzie. W celu zapewnienia większej ochrony zdecydowanie zalecamy również używanie bibliotek utworzonych w celu zapewnienia środków zaradczych spectre. Kilka bibliotek środowiska uruchomieniowego firmy Microsoft jest dostępnych za pomocą środków zaradczych spectre.
Te biblioteki są opcjonalnymi składnikami, które należy zainstalować przy użyciu Instalator programu Visual Studio:
- Wersja MSVC version_numbers Libs for Spectre [(x86 i x64) | (ARM) | (ARM64)]
- Visual C++ ATL for [(x86/x64) | ARM | ARM64] z środki zaradcze spectre
- Visual C++ MFC dla [x86/x64 | ARM | ARM64] z środki zaradcze spectre
Domyślny system projektu oparty na programie MSBuild w środowisku IDE programu Visual Studio umożliwia określenie właściwości Spectre Mitigation dla projektów. Ta właściwość ustawia opcję kompilatora /Qspectre
i zmienia ścieżki biblioteki, aby połączyć biblioteki środowiska uruchomieniowego z ograniczeniem specyfikacji. Jeśli te biblioteki nie są zainstalowane podczas tworzenia kodu, system kompilacji zgłasza ostrzeżenie MSB8040. Jeśli nie można skompilować kodu MFC lub ATL, a konsolidator zgłasza błąd, taki jak "błąd krytyczny LNK1104: nie można otworzyć pliku "oldnames.lib", te brakujące biblioteki mogą być przyczyną.
Domyślny system projektu oparty na programie MSBuild w środowisku IDE programu Visual Studio umożliwia określenie właściwości Spectre Mitigation dla projektów. Ta właściwość ustawia opcję kompilatora /Qspectre
i zmienia ścieżki biblioteki, aby połączyć biblioteki środowiska uruchomieniowego z ograniczeniem specyfikacji. Jeśli te biblioteki nie są instalowane podczas tworzenia kodu, system kompilacji zgłasza ostrzeżenie MSB8038: "Ograniczenie ryzyka spectre jest włączone, ale nie można odnaleźć bibliotek z ograniczeniem ryzyka spectre". Jeśli nie można skompilować kodu MFC lub ATL, a konsolidator zgłasza błąd, taki jak "błąd krytyczny LNK1104: nie można otworzyć pliku "oldnames.lib", te brakujące biblioteki mogą być przyczyną.
Istnieje kilka sposobów określania bibliotek z ograniczeniem specyfikacji do wiersza polecenia kompilacji. Możesz określić ścieżkę do bibliotek objętych ograniczeniem specyfikacji przy użyciu /LIBPATH
opcji konsolidatora, aby ustawić je jako biblioteki domyślne. Możesz użyć opcji konsolidatora /NODEFAULTLIB
i jawnie połączyć biblioteki z ograniczeniem specyfikacji. Możesz też ustawić zmienną LIBPATH
środowiskową tak, aby zawierała ścieżkę do bibliotek z ograniczeniem ryzyka spectre dla platformy docelowej. Jednym ze sposobów ustawienia tej ścieżki w środowisku jest użycie wiersza polecenia dewelopera skonfigurowanego spectre_mode
przy użyciu opcji . Aby uzyskać więcej informacji, zobacz Use the developer tools in an existing command window (Używanie narzędzi deweloperskich w istniejącym oknie poleceń).
Biblioteki środowiska uruchomieniowego ograniczone przez specyfikację dla platform x86, x64 i ARM są dostępne w ramach poprawki dostępnej za pośrednictwem 4338871 KB. Domyślnie te biblioteki są instalowane w następujących katalogach:
- 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
- RAMIĘ:
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\spectre\arm
Istnieje kilka sposobów określania bibliotek z ograniczeniem specyfikacji do wiersza polecenia kompilacji. Możesz określić ścieżkę do bibliotek objętych ograniczeniem specyfikacji przy użyciu /LIBPATH
opcji konsolidatora, aby ustawić je jako biblioteki domyślne. Możesz użyć opcji konsolidatora /NODEFAULTLIB
i jawnie połączyć biblioteki z ograniczeniem specyfikacji. Możesz też ustawić zmienną LIBPATH
środowiskową tak, aby zawierała ścieżkę do bibliotek z ograniczeniem ryzyka spectre dla architektury docelowej. Aby uzyskać więcej informacji, zobacz Use the Microsoft C++ toolset from the command line (Używanie zestawu narzędzi języka Microsoft C++ z wiersza polecenia).
Dodatkowe informacje
Aby uzyskać więcej informacji, zobacz oficjalny ADV180002 biuletynu zabezpieczeń firmy Microsoft, wskazówki dotyczące ograniczania luk w zabezpieczeniach kanału bocznego wykonywania spekulatywnego. Wskazówki są również dostępne na stronie Intel, Speculative Execution Side Channel Mitigations i ARM, Cache Speculation Side-channel.
Aby zapoznać się z omówieniem ograniczania ryzyka spectre i Meltdown dla systemu Windows, zobacz Omówienie wpływu wydajności środków zaradczych spectre i Meltdown w systemach Windows.
Aby zapoznać się z omówieniem luk w zabezpieczeniach spectre rozwiązanych przez środki zaradcze MSVC, zobacz Spectre mitigations in MSVC (Ograniczenia ryzyka spectre w środowisku MSVC ) w blogu zespołu języka C++.
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Code Generation.
Wybierz nową wartość właściwości Środki zaradcze Spectre. Wybierz przycisk OK , aby zastosować zmianę.
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
Wybierz stronę Właściwości>konfiguracji C/C++>Wiersza polecenia.
Wprowadź opcję kompilatora
/Qspectre
w polu Dodatkowe opcje . Wybierz pozycję Zastosuj , aby zastosować zmianę.Wybierz stronę właściwości Ogólne konsolidatora>właściwości>konfiguracji.
Dla każdej platformy we właściwościach projektu zmodyfikuj właściwość Dodatkowe katalogi biblioteki. Ustaw ścieżkę do katalogu biblioteki środowiska uruchomieniowego z ograniczeniem specyfikacji dla platformy docelowej, a następnie wybierz pozycję Zastosuj , aby zastosować zmianę. Po zakończeniu wybierz przycisk OK.
Aby programowo ustawić tę opcję kompilatora
- Zobacz: AdditionalOptions.
Zobacz też
/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q
opcje (operacje niskiego poziomu)
Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC