/guard
(Povolení ochrany toku řízení)
Povolte generování kompilátoru kontrol zabezpečení Ochrany toku řízení.
Syntaxe
/guard:cf
/guard:cf-
Poznámky
Tato /guard:cf
možnost způsobí, že kompilátor analyzuje tok řízení pro nepřímé cíle volání v době kompilace a potom vloží kód pro ověření cílů za běhu. Ve výchozím nastavení /guard:cf
je vypnutá a musí být explicitně povolená. Pokud chcete tuto možnost explicitně zakázat, použijte /guard:cf-
.
Visual Studio 2017 a novější: Tato možnost přidá ochranu pro switch
příkazy, které generují tabulky přeskakování.
Pokud je zadána /guard:cf
možnost Ochrana toku řízení (CFG), kompilátor a linker vloží dodatečné kontroly zabezpečení za běhu, aby zjistil pokusy o ohrožení vašeho kódu. Při kompilaci a propojování se všechna nepřímá volání v kódu analyzují a vyhledávají všechna místa, na která může kód dosáhnout, když se správně spustí. Tyto informace jsou uloženy v dalších strukturách v hlavicích binárních souborů. Kompilátor také vloží kontrolu před každé nepřímé volání v kódu, které zajistí, že cíl je jedním z ověřených umístění. Pokud kontrola selže za běhu v operačním systému s podporou CFG, operační systém program zavře.
Běžný útok na software využívá chyby při zpracování extrémních nebo neočekávaných vstupů. Pečlivě vytvořený vstup do aplikace může přepsat umístění, které obsahuje ukazatel na spustitelný kód. Tuto techniku lze použít k přesměrování toku řízení na kód řízený útočníkem. Kontroly modulu runtime CFG neopravují chyby poškození dat ve vašem spustitelném souboru. Místo toho znesnadňuje útočníkovi, aby ho použil ke spuštění libovolného kódu. CFG je nástroj pro zmírnění rizik, který brání volání jiných míst než vstupních bodů funkce v kódu. Podobá se tomu, jak prevence spuštění dat (DEP), /GS stack kontroluje a /DYNAMICBASE
/HIGHENTROPYVA rozložení adresního prostoru (ASLR) snižuje pravděpodobnost, že se váš kód stane vektorem zneužití.
Možnost /guard:cf
musí být předána kompilátoru i linkeru pro sestavení kódu, který používá techniku zmírnění zneužití CFG. Pokud je binární soubor sestaven pomocí jednoho cl
příkazu, kompilátor předá možnost linkeru. Pokud kompilujete a propojitte samostatně, musí být tato možnost nastavená na příkazech kompilátoru i linkeru. Je také vyžadována možnost linkeru /DYNAMICBASE. Pokud chcete ověřit, že váš binární soubor obsahuje data CFG, použijte dumpbin /headers /loadconfig
příkaz. Binární soubory s podporou CFG mají Guard
v seznamu vlastností EXE nebo DLL a Guard Příznaky zahrnují CF Instrumented
a FID table present
.
Možnost /guard:cf
není kompatibilní s /ZI
(upravit a pokračovat v ladění) nebo /clr
(kompilace modulu Common Language Runtime).
Kód zkompilovaný pomocí /guard:cf
lze propojit s knihovnami a soubory objektů, které nejsou kompilovány pomocí této možnosti. Pouze tento kód, pokud je také propojen pomocí /guard:cf
možnosti a spustit v operačním systému s podporou CFG, má ochranu CFG. Vzhledem k tomu, že kód zkompilovaný bez možnosti nezastaví útok, doporučujeme použít možnost pro veškerý zkompilovaný kód. Pro kontroly CFG jsou malé náklady za běhu, ale analýza kompilátoru se pokusí optimalizovat kontroly nepřímých přeskakování, které se dají ověřit jako bezpečné.
Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio
Otevřete dialogové okno Stránky vlastností projektu. Další informace naleznete v tématu Nastavení vlastností kompilátoru a sestavení.
Vyberte stránku vlastností vlastnosti konfigurace>C/C++>Generování kódu.
Vyberte vlastnost Control Flow Guard.
V ovládacím prvku rozevíracího seznamu zvolte Ano , pokud chcete povolit ochranu Toku řízení, nebo ne , pokud ho chcete zakázat.
Viz také
Možnosti kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC