Sdílet prostřednictvím


/Qspectre

Určuje generování instrukcí kompilátoru pro zmírnění určitých ohrožení zabezpečení Spectre varianty 1.

Syntaxe

/Qspectre

Poznámky

Tato /Qspectre možnost způsobí, že kompilátor vloží pokyny ke zmírnění určitých ohrožení zabezpečení Spectre. Tato ohrožení zabezpečení se nazývají spekulativní útoky na spuštění na straně kanálu. Ovlivňují mnoho operačních systémů a moderních procesorů, včetně procesorů Intel, AMD a ARM.

Tato /Qspectre možnost je dostupná od sady Visual Studio 2017 verze 15.5.5 a všech novějších verzí. Je k dispozici v sadě Visual Studio 2015 Update 3 až kB 4338871.

Možnost /Qspectre je ve výchozím nastavení vypnutá.

V počáteční verzi tato /Qspectre možnost fungovala pouze na optimalizovaném kódu. Počínaje sadou Visual Studio 2017 verze 15.7 /Qspectre je tato možnost podporována na všech úrovních optimalizace.

Několik knihoven Microsoft C++ je také k dispozici ve verzích se zmírněním rizik Spectre. V Instalační program pro Visual Studio je možné stáhnout knihovny Spectre pro Visual Studio. Najdete je na kartě Jednotlivé komponenty v části Kompilátory, nástroje sestavení a moduly runtime a v názvu mají "Libs for Spectre". Knihovny DLL i statické moduly runtime s povoleným zmírněním rizik jsou k dispozici pro podmnožinu modulů runtime Visual C++: spouštěcí kód VC++, vcruntime140, msvcp140, concrt140 a vcamp140. Knihovny DLL jsou podporovány pouze pro místní nasazení aplikací. Obsah redistribuovatelných knihoven modulu runtime Visual C++ není možné upravovat.

Můžete také nainstalovat knihovny Spectre zmírněné pro knihovny MFC a ATL. Najdete je na kartě Jednotlivé komponenty v sadách SDK, knihovnách a architekturách.

Poznámka:

Pro aplikace nebo komponenty univerzálních aplikací pro Windows (UPW) neexistují žádné verze knihoven Spectre. Místní nasazení těchto knihoven není možné.

Použitelnost

Pokud váš kód pracuje s daty, která překračují hranici důvěryhodnosti, doporučujeme použít /Qspectre možnost opětovného sestavení a opětovného nasazení kódu, abyste tento problém co nejdříve zmírňovali. Příkladem takového kódu je kód, který načte nedůvěryhodný vstup, který může ovlivnit provádění. Například kód, který provádí vzdálená volání procedur, analyzuje nedůvěryhodný vstup nebo soubory nebo používá jiná místní rozhraní komunikace mezi procesy (IPC). Standardní techniky sandboxu nemusí být dostatečné. Pečlivě prozkoumejte sandboxy, než se rozhodnete, že váš kód nepřekračuje hranici důvěryhodnosti.

Dostupnost

Tato /Qspectre možnost je dostupná od sady Visual Studio 2017 verze 15.5.5 a ve všech aktualizacích kompilátorů Microsoft C/C++ (MSVC) provedených dne nebo po 23. lednu 2018. Pomocí Instalační program pro Visual Studio aktualizujte kompilátor a nainstalujte knihovny Spectre zmírněné jako jednotlivé komponenty. Tato /Qspectre možnost je dostupná také v sadě Visual Studio 2015 Update 3 prostřednictvím opravy. Další informace naleznete v článku znalostní báze 4338871.

Všechny verze sady Visual Studio 2017 verze 15.5 a všechny verze Preview sady Visual Studio 2017 verze 15.6. zahrnout nezdokumentovanou možnost , /d2guardspecload. Je ekvivalentní počátečnímu /Qspectrechování . Stejné omezení rizik můžete použít /d2guardspecload u kódu v těchto verzích kompilátoru. Doporučujeme aktualizovat sestavení tak, aby se používalo /Qspectre v kompilátorech, které tuto možnost podporují. Tato /Qspectre možnost může také podporovat nová omezení rizik v novějších verzích kompilátoru.

Účinnost

Možnost /Qspectre vypíše kód pro zmírnění varianty Specter 1, Bounds Check Bypass, CVE-2017-5753. Funguje vložením instrukcí, které fungují jako spekulativní bariéra pro spuštění kódu. Konkrétní pokyny používané ke zmírnění spekulací procesoru závisí na procesoru a jeho mikro-architektuře a mohou se změnit v budoucích verzích kompilátoru.

Když tuto /Qspectre možnost povolíte, kompilátor se pokusí identifikovat instance, ve kterých může spekulativní spuštění obejít kontroly hranic. To je místo, kde vloží pokyny bariéry. Je důležité si uvědomit omezení analýzy, kterou může kompilátor provést k identifikaci instancí varianty 1. Proto neexistuje žádná záruka, že všechny možné instance varianty 1 jsou instrumentovány v rámci /Qspectre.

Dopad na výkon

/Qspectre Účinek na výkon se zdá být zanedbatelný v několika sizable základech kódu. Není však zaručeno, že výkon vašeho kódu /Qspectre zůstane nedotčený. Měli byste provést srovnávací test kódu, abyste určili vliv možnosti na výkon. Pokud víte, že zmírnění rizik není vyžadováno v kritickém bloku nebo smyčce výkonu, můžete omezení rizik selektivně zakázat použitím direktivy __declspec(spectre(nomitigation)) . Tato direktiva není k dispozici v kompilátorech, které tuto možnost podporují /d2guardspecload .

Požadované knihovny

Možnost kompilátoru /Qspectre zmírní problémy ve vašem vlastním kódu. Pro větší ochranu důrazně doporučujeme používat také knihovny vytvořené k zajištění zmírnění rizik Spectre. Pro zmírnění rizik spectre je k dispozici několik knihoven modulu runtime Microsoftu.

Tyto knihovny jsou volitelné součásti, které je potřeba nainstalovat pomocí Instalační program pro Visual Studio:

  • MSVC verze version_numbers Libs pro Spectre [(x86 a x64) | (ARM) | (ARM64)]
  • AtL jazyka Visual C++ pro [(x86/x64) | ARM | ARM64] se zmírněním rizik spectre
  • Visual C++ MFC pro [x86/x64 | ARM | ARM64] se zmírněním rizik spectre

Výchozí systém projektů založený na nástroji MSBuild v integrovaném vývojovém prostředí sady Visual Studio umožňuje zadat vlastnost Zmírnění rizik Spectre pro vaše projekty. Tato vlastnost nastaví možnost kompilátoru /Qspectre a změní cesty knihovny tak, aby propojily knihovny modulu runtime se zmírněním spectre. Pokud se tyto knihovny při sestavování kódu nenainstalují, systém sestavení oznámí upozornění MSB8040. Pokud se váš kód MFC nebo ATL nepodaří sestavit a linker hlásí chybu, jako je závažná chyba LNK1104: soubor oldnames.lib nejde otevřít, můžou to být příčinou těchto chybějících knihoven.

Výchozí systém projektů založený na nástroji MSBuild v integrovaném vývojovém prostředí sady Visual Studio umožňuje zadat vlastnost Zmírnění rizik Spectre pro vaše projekty. Tato vlastnost nastaví možnost kompilátoru /Qspectre a změní cesty knihovny tak, aby propojily knihovny modulu runtime se zmírněním spectre. Pokud se tyto knihovny při sestavování kódu nenainstalují, zobrazí se upozornění systému sestavení MSB8038: "Zmírnění rizik Spectre je povolené, ale knihovny Spectre se nezjistit." Pokud se váš kód MFC nebo ATL nepodaří sestavit a linker hlásí chybu, jako je závažná chyba LNK1104: soubor oldnames.lib nejde otevřít, můžou to být příčinou těchto chybějících knihoven.

Existuje několik způsobů, jak určit knihovny spectre-zmírnění na příkazový řádek sestavení. Pomocí možnosti linkeru můžete určit cestu ke knihovnám /LIBPATH spectre, které jsou určené pro výchozí knihovny. Můžete použít možnost linkeru /NODEFAULTLIB a explicitně propojit knihovny se zmírněním spectre. Nebo můžete nastavit proměnnou LIBPATH prostředí tak, aby zahrnovala cestu ke knihovnám zmírnit spectre pro vaši cílovou platformu. Jedním ze způsobů, jak tuto cestu nastavit v prostředí, je použít příkazový řádek pro vývojáře nastavený pomocí spectre_mode této možnosti. Další informace najdete v tématu Použití vývojářských nástrojů v existujícím příkazovém okně.

Jako součást opravy dostupné prostřednictvím kb 4338871 jsou dostupné knihovny modulu runtime spectre pro platformy x86, x64 a ARM. Ve výchozím nastavení jsou tyto knihovny nainstalované v následujících adresářích:

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

Existuje několik způsobů, jak určit knihovny spectre-zmírnění na příkazový řádek sestavení. Pomocí možnosti linkeru můžete určit cestu ke knihovnám /LIBPATH spectre, které jsou určené pro výchozí knihovny. Můžete použít možnost linkeru /NODEFAULTLIB a explicitně propojit knihovny se zmírněním spectre. Nebo můžete nastavit proměnnou LIBPATH prostředí tak, aby zahrnovala cestu ke knihovnám zmírnit spectre pro vaši cílovou architekturu. Další informace naleznete v tématu Použití sady nástrojů Microsoft C++ z příkazového řádku.

Další informace

Další informace najdete v oficiálním informačním zpravodaji zabezpečení společnosti Microsoft ADV180002, pokyny ke zmírnění spekulativních ohrožení zabezpečení na straně kanálu. Pokyny jsou k dispozici také od intel, spekulativního zmírnění rizik na straně spuštění a ARM, mezipaměti spekulací na straně kanálů.

Přehled zmírnění rizik spectre a roztavení specifických pro Windows najdete v tématu Vysvětlení dopadu omezení výkonu spectre a roztavení v systémech Windows.

Přehled chyb zabezpečení Spectre, které řeší zmírnění rizik MSVC, najdete v tématu Zmírnění rizik Spectre v MSVC na blogu týmu C++.

Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte stránku vlastností vlastnosti konfigurace>C/C++>Generování kódu.

  3. Vyberte novou hodnotu vlastnosti Spectre Mitigation . Pokud chcete změnu použít, zvolte OK .

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Vyberte stránku vlastností příkazového řádku C/C++>Vlastnosti>konfigurace.

  3. /Qspectre Do pole Další možnosti zadejte možnost kompilátoru. Chcete-li použít změnu, zvolte Použít .

  4. Vyberte stránku vlastností linkeru>Obecné vlastnosti konfigurace>.

  5. Pro každou platformu ve vlastnostech projektu upravte vlastnost Další adresáře knihovny. Nastavte cestu k adresáři knihovny modulu runtime Spectre pro cílovou platformu a pak zvolte Použít , aby se změna použila. Až to budete hotovi, zvolte OK.

Programové nastavení tohoto parametru kompilátoru

Viz také

/Qspectre-jmp
/Qspectre-load
/Qspectre-load-cf
/Q možnosti (operace nízké úrovně)
Možnosti kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC