Ablaufsteuerungsschutz
Was ist Control Flow Guard?
Control Flow Guard (CFG) ist ein hochoptimiertes Plattformsicherheitsfeature, das erstellt wurde, um Sicherheitsrisiken durch Speicherbeschädigungen zu beseitigen. Durch die Strengung von Einschränkungen, von wo aus eine Anwendung Code ausführen kann, ist es für Exploits wesentlich schwieriger, beliebigen Code durch Sicherheitsrisiken wie Pufferüberläufe auszuführen. CFG erweitert frühere Exploit-Entschärfungstechnologien wie /GS, DEPund ASLR.
Dieses Feature ist in Microsoft Visual Studio 2015 verfügbar und wird unter CFG-orientierte Versionen von Windows ausgeführt– den x86- und x64-Releases für Desktop und Server von Windows 10 und Windows 8.1 Update (KB3000850).
Wir empfehlen Entwicklern dringend, CFG für ihre Anwendungen zu aktivieren. Sie müssen CFG nicht für jeden Teil Ihres Codes aktivieren, da eine Mischung aus CFG-fähigem und nicht CFG-fähigem Code einwandfrei ausgeführt wird. Wenn CFG jedoch nicht für den ganzen Code aktiviert wird, können Lücken im Schutz geöffnet werden. Darüber hinaus funktioniert CFG-fähiger Code gut für CFG-nicht fähige Versionen von Windows und ist daher vollständig kompatibel mit ihnen.
Wie kann ich CFG aktivieren?
In den meisten Fällen ist es nicht notwendig, den Quellcode zu ändern. Sie müssen ihrem Visual Studio 2015-Projekt nur eine Option hinzufügen, und der Compiler und der Linker aktivieren CFG.
Die einfachste Methode besteht in der Navigation zu Project Eigenschaftenkonfigurationseigenschaften | | | C/C++-Codegenerierung, | und wählen Sie ja (/guard:cf) für Control Flow Guard aus.

Fügen Sie alternativ "/guard:cf" zu Project Properties Configuration Properties Configuration Properties | | | C/C++ | Command Line Additional | Options (für den Compiler) und /guard:cf zu Project Properties Configuration Properties | | | Linker | | Command Line Additional Options (für den Linker) hinzu.


Weitere Informationen finden Sie unter /guard (Control Flow Guard aktivieren).
Wenn Sie Ihr Projekt über die Befehlszeile erstellen, können Sie die gleichen Optionen hinzufügen. Wenn Sie beispielsweise ein Projekt namens test.cpp kompilieren, verwenden Sie cl /guard:cf test.cpp /link /guard:cf.
Sie haben auch die Möglichkeit, den Satz von icall-Zieladressen, die von CFG als gültig angesehen werden, dynamisch zu steuern, indem Sie SetProcessValidCallTargets aus der Memory-Verwaltungs-API. Dieselbe API kann verwendet werden, um anzugeben, ob Seiten ungültige oder gültige Ziele für CFG sind. Die Funktionen VirtualProtect und VirtualAlloc behandeln standardmäßig einen angegebenen Bereich von ausführbaren Und-Committed-Seiten als gültige indirekte Aufrufziele. Es ist möglich, dieses Verhalten zu überschreiben, z. B. beim Implementieren eines Just-in-Time-Compilers, indem PAGE _ TARGETS _ INVALID beim Aufruf von VirtualAlloc oder PAGE TARGETS NO _ _ _ UPDATE beim Aufrufen von VirtualProtect angegeben wird, wie unter Memory Protection Constantsbeschrieben.
Wie erzähle ich, dass eine Binärdatei unter Control Flow Guard steht?
Führen Sie das Tool dumpbin (in der Installation von Visual Studio 2015 enthalten) über die Visual Studio-Eingabeaufforderung mit den Optionen /headers und /loadconfig aus: dumpbin /headers /loadconfig test.exe. Die Ausgabe für eine Binärdatei unter CFG sollte zeigen, dass die Headerwerte "Guard" enthalten und dass die Werte für die Ladekonfiguration "CF Instrumented" und "FID table present" enthalten.


Wie funktioniert CFG wirklich?
Softwareschwachstellen werden häufig ausgenutzt, indem unwahrscheinliche, ungewöhnliche oder extreme Daten für ein ausgeführtes Programm zur Verfügung stehen. Beispielsweise kann ein Angreifer ein Pufferüberlauf-Sicherheitsrisiko ausnutzen, indem er mehr Eingaben für ein Programm als erwartet liefert, wodurch der vom Programm reservierte Bereich für eine Antwort überlaufen wird. Dies könnte angrenzenden Arbeitsspeicher beschädigt, der einen Funktionszeiger halten kann. Wenn das Programm diese Funktion aufruft, kann es zu einem unbeabsichtigten Speicherort springen, der vom Angreifer angegeben wird.
Eine kombination aus Kompilier- und Laufzeitunterstützung von CFG implementiert jedoch die Ablaufsteuerungsintegrität, die eng einschränkt, wo Anweisungen für indirekte Aufrufe ausgeführt werden können.
Der Compiler führt folgende Schritte aus:
- Fügt dem kompilierten Code einfache Sicherheitsüberprüfungen hinzu.
- Identifiziert den Satz von Funktionen in der Anwendung, die gültige Ziele für indirekte Aufrufe sind.
Die Laufzeitunterstützung, die vom Windows-Kernel bereitgestellt wird:
- Verwaltet effizient den Zustand, der gültige indirekte Aufrufziele identifiziert.
- Implementiert die Logik, die überprüft, ob ein indirektes Aufrufziel gültig ist.
Zur Veranschaulichung:

Wenn eine CFG-Überprüfung zur Laufzeit fehlschlägt, beendet Windows das Programm sofort und unterbricht somit alle Exploits, die versuchen, indirekt eine ungültige Adresse aufrufen.