Freigeben über


/guard (Steuerungsflussschutz aktivieren)

Aktivieren der Compilergenerierung von Ablaufsteuerungsschutz-Sicherheitsüberprüfungen.

Syntax

/guard:cf
/guard:cf-

Hinweise

Die /guard:cf Option bewirkt, dass der Compiler den Kontrollfluss für indirekte Aufrufziele zur Kompilierungszeit analysiert und anschließend Code einfügt, um die Ziele zur Laufzeit zu überprüfen. Ist standardmäßig /guard:cf deaktiviert und muss explizit aktiviert sein. Um diese Option explizit zu deaktivieren, verwenden Sie /guard:cf-.

Visual Studio 2017 und höher: Mit dieser Option werden Schutzvorrichtungen für switch Anweisungen hinzugefügt, die Sprungtabellen generieren.

Wenn die /guard:cf Option Control Flow Guard (CFG) angegeben ist, fügen der Compiler und der Linker zusätzliche Laufzeitsicherheitsprüfungen ein, um Versuche zu erkennen, Ihren Code zu kompromittieren. Beim Kompilieren und Verknüpfen werden alle indirekten Aufrufe im Code analysiert, um jede Stelle zu finden, die der Code erreichen kann, wenn er ordnungsgemäß ausgeführt wird. Diese Informationen werden in zusätzlichen Strukturen in den Headern der Binärdateien gespeichert. Der Compiler fügt auch eine Überprüfung vor jedem indirekten Aufruf in Ihren Code ein, um sicherzustellen, dass das Ziel eine der überprüften Positionen ist. Wenn die Überprüfung zur Laufzeit auf einem CFG-fähigen Betriebssystem fehlschlägt, schließt das Betriebssystem das Programm.

Eine häufige Form des Angriffs auf Software nutzt die Vorteile von Fehlern bei der Verarbeitung extremer oder unerwarteter Eingaben. Sorgfältig ausgearbeitete Eingaben in die Anwendung können eine Position mit einem Zeiger auf den ausführbaren Code überschreiben. Diese Technik kann verwendet werden, um den Steuerungsfluss an den vom Angreifer gesteuerten Code umzuleiten. Die CFG-Laufzeitüberprüfungen beheben die Datenbeschädigungsfehler in Ihrer ausführbaren Datei nicht. Sie erschweren stattdessen einem Angreifer das Verwenden dieser Überprüfungen, um beliebigen Code auszuführen. CFG ist ein Minimierungstool, das Aufrufe an andere Positionen als Funktionseinstiegspunkte in Ihrem Code verhindert. Es ist ähnlich wie die Datenausführungsverhinderung (Data Execution Prevention, DEP), /GS-Stapelüberprüfungen und /DYNAMICBASE /HIGHENTROPYVA-Adressraum-Zufallsvarianzen (ASLR) verringern die Wahrscheinlichkeit, dass Ihr Code zu einem Exploit-Vektor wird.

Die /guard:cf Option muss sowohl an den Compiler als auch an den Linker übergeben werden, um Code zu erstellen, der die CFG-Exploit-Entschärfungstechnik verwendet. Wenn die Binärdatei mit einem einzigen cl -Befehl erstellt wird, übergibt der Compiler die Option an den Linker. Wenn Sie separat kompilieren und verknüpfen, muss die Option für die Compiler- und Linkerbefehle festgelegt werden. Die Linkeroption /DYNAMICBASE ist ebenfalls erforderlich. Um zu überprüfen, ob die Binärdatei CFG-Daten enthält, verwenden Sie den Befehl dumpbin /headers /loadconfig . CFG-fähige Binärdateien haben Guard in der Liste der EXE- oder DLL-Merkmale, und Wächterflags enthalten CF Instrumented sowie FID table present.

Die /guard:cf Option ist nicht kompatibel mit /ZI (Debuginformationen bearbeiten und fortfahren) oder /clr (Kompilierung der Common Language Runtime).

Code, der mithilfe von "Kompiliert /guard:cf " kompiliert wird, kann mit Bibliotheken und Objektdateien verknüpft werden, die nicht mithilfe der Option kompiliert werden. Nur dieser Code, wenn auch mithilfe der /guard:cf Option verknüpft und auf einem CFG-fähigen Betriebssystem ausgeführt wird, verfügt über CFG-Schutz. Da Code, der ohne die Option kompiliert wurde, keinen Angriff beenden kann, empfiehlt es sich, die Option für den gesamten kompilierten Code zu verwenden. Es gibt eine geringe Laufzeitkosten für CFG-Prüfungen, aber die Compileranalyse versucht, die Überprüfungen auf indirekte Sprünge zu optimieren, die als sicher erwiesen werden können.

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten für das Projekt. Weitere Informationen finden Sie unter Festlegen von Compiler- und Buildeigenschaften.

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

  3. Wählen Sie die Ablaufsteuerungsschutz -Eigenschaft aus.

  4. Wählen Sie im Dropdown-Steuerelement Ja aus, um den Ablaufsteuerungsschutz zu aktivieren, oder Nein , um ihn zu deaktivieren.

Siehe auch

MSVC-Compileroptionen
Syntax für die MSVC-Compilerbefehlszeile