Delen via


/Qspectre

Hiermee geeft u het genereren van instructies voor het genereren van compileren om bepaalde beveiligingsproblemen in Spectre variant 1 te beperken.

Syntaxis

/Qspectre

Opmerkingen

De /Qspectre optie zorgt ervoor dat de compiler instructies invoegt om bepaalde beveiligingsproblemen met Spectre te beperken. Deze beveiligingsproblemen worden speculatieve aanvallen aan de zijkant van het kanaal genoemd. Ze zijn van invloed op veel besturingssystemen en moderne processors, waaronder processors van Intel, AMD en ARM.

De /Qspectre optie is beschikbaar vanaf Visual Studio 2017 versie 15.5.5 en alle latere versies. Het is beschikbaar in Visual Studio 2015 Update 3 tot en met KB 4338871.

De /Qspectre optie is standaard uitgeschakeld.

In de eerste release werkte de /Qspectre optie alleen aan geoptimaliseerde code. Vanaf Visual Studio 2017 versie 15.7 wordt de /Qspectre optie ondersteund op alle optimalisatieniveaus.

Er zijn ook verschillende Microsoft C++-bibliotheken beschikbaar in versies met Spectre-beperking. De bibliotheken die met Spectre zijn beperkt voor Visual Studio, kunnen worden gedownload in het installatieprogramma van Visual Studio. Ze zijn te vinden op het tabblad Afzonderlijke onderdelen onder Compilers, buildhulpprogramma's en runtimes, en hebben 'Bibliotheken voor spectre' in de naam. Zowel DLL- als statische runtimebibliotheken waarvoor beperking is ingeschakeld, zijn beschikbaar voor een subset van de Visual C++-runtimes: VC++ opstartcode, vcruntime140, msvcp140, concrt140 en vcamp140. De DLL's worden alleen ondersteund voor toepassings-lokale implementatie. De inhoud van de Visual C++ Runtime-bibliotheken die herdistribueerbaar zijn, zijn ongewijzigd.

U kunt ook met Spectre beperkt bibliotheken voor MFC en ATL installeren. Deze zijn te vinden op het tabblad Afzonderlijke onderdelen onder SDK's, bibliotheken en frameworks.

Opmerking

Er zijn geen versies van door Spectre beperkt bibliotheken voor UWP-apps (Universal Windows) of onderdelen. App-lokale implementatie van dergelijke bibliotheken is niet mogelijk.

Toepasselijkheid

Als uw code werkt op gegevens die een vertrouwensgrens overschrijden, raden we u aan de /Qspectre optie te gebruiken om uw code opnieuw te bouwen en opnieuw te implementeren om dit probleem zo snel mogelijk te verhelpen. Een voorbeeld van een dergelijke code is code waarmee niet-vertrouwde invoer wordt geladen die van invloed kan zijn op de uitvoering. Code die bijvoorbeeld externe procedure-aanroepen maakt, niet-vertrouwde invoer of bestanden parseert of andere IPC-interfaces (Inter-Process Communication) gebruikt. Standaard sandboxingtechnieken zijn mogelijk niet voldoende. Onderzoek uw sandboxes zorgvuldig voordat u besluit dat uw code geen vertrouwensgrens overschrijdt.

Beschikbaarheid

De /Qspectre optie is beschikbaar vanaf Visual Studio 2017 versie 15.5.5 en in alle updates voor Microsoft C/C++-compilers (MSVC) die zijn gemaakt op of na 23 januari 2018. Gebruik het Installatieprogramma van Visual Studio om de compiler bij te werken en om de door Spectre beperkt bibliotheken als afzonderlijke onderdelen te installeren. De /Qspectre optie is ook beschikbaar in Visual Studio 2015 Update 3 via een patch. Zie KB-4338871 voor meer informatie.

Alle versies van Visual Studio 2017 versie 15.5 en alle previews van Visual Studio 2017 versie 15.6. neem een niet-gedocumenteerde optie op. /d2guardspecload Het is gelijk aan het initiële gedrag van /Qspectre. U kunt /d2guardspecload dezelfde oplossingen toepassen op uw code in deze versies van de compiler. U wordt aangeraden uw build bij te werken voor gebruik /Qspectre in compilers die ondersteuning bieden voor de optie. De /Qspectre optie biedt mogelijk ook ondersteuning voor nieuwe oplossingen in latere versies van de compiler.

Gevolg

De /Qspectre optie voert code uit om Specter variant 1, Bounds Check Bypass, CVE-2017-5753 te beperken. Het werkt door instructies in te voegen die fungeren als speculatieve codeuitvoeringsbarrière. De specifieke instructies die worden gebruikt om de speculatie van de processor te beperken, zijn afhankelijk van de processor en de microarchitectuur, en kunnen in toekomstige versies van de compiler veranderen.

Wanneer u de /Qspectre optie inschakelt, probeert de compiler exemplaren te identificeren waarbij speculatieve uitvoering afhankelijke controles kan omzeilen. Daar wordt de barrière-instructies ingevoegd. Het is belangrijk om rekening te houden met de limieten voor de analyse die een compiler kan doen om exemplaren van variant 1 te identificeren. Als zodanig is er geen garantie dat alle mogelijke exemplaren van variant 1 worden geïnstrueerd onder /Qspectre.

Invloed op de prestaties

Het effect van /Qspectre de prestaties leek te verwaarloosbaar in verschillende aanpasbare codebases. Er zijn echter geen garanties dat de prestaties van uw code onder /Qspectre invloed blijven. U moet uw code benchmarken om het effect van de optie op prestaties te bepalen. Als u weet dat de beperking niet is vereist in een prestatiekritiek blok of lus, kunt u de beperking selectief uitschakelen door gebruik te maken van een __declspec(spectre(nomitigation)) richtlijn. Deze richtlijn is niet beschikbaar in compilers die alleen de /d2guardspecload optie ondersteunen.

Vereiste bibliotheken

De /Qspectre compileroptie beperkt problemen in uw eigen code. Voor een betere beveiliging raden we u ten zeerste aan ook bibliotheken te gebruiken die zijn gebouwd om Spectre-oplossingen te bieden. Er zijn verschillende microsoft-runtimebibliotheken beschikbaar met Spectre-oplossingen.

Deze bibliotheken zijn optionele onderdelen die moeten worden geïnstalleerd met behulp van het Installatieprogramma van Visual Studio:

  • MSVC-versie version_numbers Bibliotheken for Spectre [(x86 en x64) | (ARM) | (ARM64)]
  • Visual C++ ATL voor [(x86/x64) | ARM | ARM64] met spectre-oplossingen
  • Visual C++ MFC voor [x86/x64 | ARM | ARM64] met spectre-oplossingen

Met het standaardprojectsysteem op basis van MSBuild in de Visual Studio IDE kunt u een eigenschap Spectre Mitigation voor uw projecten opgeven. Met deze eigenschap stelt u de /Qspectre compileroptie in en wijzigt u de bibliotheekpaden om de runtimebibliotheken met spectre-beperking te koppelen. Als deze bibliotheken niet zijn geïnstalleerd tijdens het bouwen van uw code, meldt het buildsysteem waarschuwing MSB8040. Als uw MFC- of ATL-code niet kan worden gebouwd en de linker een fout rapporteert, zoals 'fatale fout LNK1104: bestand 'oldnames.lib' kan niet worden geopend, kunnen deze ontbrekende bibliotheken de oorzaak zijn.

Met het standaardprojectsysteem op basis van MSBuild in de Visual Studio IDE kunt u een eigenschap Spectre Mitigation voor uw projecten opgeven. Met deze eigenschap stelt u de /Qspectre compileroptie in en wijzigt u de bibliotheekpaden om de runtimebibliotheken met spectre-beperking te koppelen. Als deze bibliotheken niet zijn geïnstalleerd wanneer u uw code bouwt, wordt de waarschuwing voor het buildsysteem gerapporteerd MSB8038: 'Spectre mitigation is enabled but Spectre mitigated libraries are not found'. Als uw MFC- of ATL-code niet kan worden gebouwd en de linker een fout rapporteert, zoals 'fatale fout LNK1104: bestand 'oldnames.lib' kan niet worden geopend, kunnen deze ontbrekende bibliotheken de oorzaak zijn.

Er zijn verschillende manieren om de door Spectre beperkt bibliotheken op te geven aan de build-opdrachtregel. U kunt het pad naar de door Spectre beperkt bibliotheken opgeven met behulp van de /LIBPATH linkeroptie om ze de standaardbibliotheken te maken. U kunt de /NODEFAULTLIB linkeroptie gebruiken en expliciet de bibliotheken koppelen die zijn beperkt met Spectre. U kunt ook instellen dat de LIBPATH omgevingsvariabele het pad naar de door Spectre beperkt bibliotheken voor uw doelplatform bevat. Een manier om dit pad in de omgeving in te stellen, is door een opdrachtprompt voor ontwikkelaars te gebruiken die is ingesteld met behulp van de spectre_mode optie. Zie De ontwikkelhulpprogramma's in een bestaand opdrachtvenster gebruiken voor meer informatie.

Bepaalde runtimebibliotheken voor x86-, x64- en ARM-platforms zijn beschikbaar als onderdeel van de patch die beschikbaar is via KB-4338871. Deze bibliotheken worden standaard geïnstalleerd in de volgende mappen:

  • 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

Er zijn verschillende manieren om de door Spectre beperkt bibliotheken op te geven aan de build-opdrachtregel. U kunt het pad naar de door Spectre beperkt bibliotheken opgeven met behulp van de /LIBPATH linkeroptie om ze de standaardbibliotheken te maken. U kunt de /NODEFAULTLIB linkeroptie gebruiken en expliciet de bibliotheken koppelen die zijn beperkt met Spectre. U kunt de LIBPATH omgevingsvariabele ook zo instellen dat het pad naar de door Spectre beperkt bibliotheken voor uw doelarchitectuur wordt opgenomen. Zie De Microsoft C++-toolset gebruiken vanaf de opdrachtregel voor meer informatie.

Aanvullende informatie

Zie de officiële Microsoft Security Advisory-ADV180002 voor meer informatie, richtlijnen voor het beperken van speculatieve beveiligingsproblemen aan de zijkant van het kanaal. Richtlijnen zijn ook beschikbaar via Intel, Speculatieve Uitvoering Side Channel Mitigations en ARM, Cache Speculatie Side-kanalen.

Zie Understanding the performance impact of Spectre and Meltdown mitigations on Windows Systems (Inzicht in de prestatieimpact van Spectre- en Meltdown-risicobeperking op Windows-systemen) voor een Windows-specifiek overzicht van risicobeperking voor Spectre en Meltdown.

Zie Spectre-oplossingen in MSVC op de C++-teamblog voor een overzicht van spectre-beveiligingsproblemen die worden aangepakt door de MSVC-oplossingen.

Deze compileroptie instellen in de Ontwikkelomgeving van Visual Studio

  1. Open het dialoogvenster eigenschappenpagina's van het project. Zie C++-compiler instellen en eigenschappen bouwen in Visual Studiovoor meer informatie.

  2. Selecteer de eigenschappenpagina Configuratie-eigenschappen>C/C++>codegeneratie.

  3. Selecteer een nieuwe waarde voor de eigenschap Spectre Mitigation . Kies OK om de wijziging toe te passen.

  1. Open het dialoogvenster eigenschappenpagina's van het project. Zie C++-compiler instellen en eigenschappen bouwen in Visual Studiovoor meer informatie.

  2. Selecteer de eigenschappenpagina configuratie-eigenschappen>C/C++>opdrachtregel.

  3. Voer de /Qspectre compileroptie in het vak Extra opties in. Kies Toepassen om de wijziging toe te passen.

  4. Selecteer de eigenschappenpaginaConfiguratie-eigenschappen> linker >algemeen.

  5. Bewerk voor elk platform in uw projecteigenschappen de eigenschap Aanvullende bibliotheekmappen . Stel het pad in op de runtimebibliotheekmap spectre-beperkt voor het doelplatform en kies Toepassen om de wijziging toe te passen. Wanneer u klaar bent, kiest u OK.

Deze compileroptie programmatisch instellen

Zie ook

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q opties (bewerkingen op laag niveau)
MSVC-compileropties
opdrachtregelsyntaxis van MSVC-compiler