/guard (Włącz funkcję Control Flow Guard)

Włącz generowanie kompilatora kontroli zabezpieczeń funkcji Control Flow Guard.

Składnia

/guard:cf
/guard:cf-

Uwagi

Opcja /guard:cf powoduje, że kompilator analizuje przepływ sterowania dla celów wywołań pośrednich w czasie kompilacji, a następnie wstawia kod w celu zweryfikowania obiektów docelowych w czasie wykonywania. Domyślnie /guard:cf jest wyłączona i musi być jawnie włączona. Aby jawnie wyłączyć tę opcję, użyj polecenia /guard:cf-.

Program Visual Studio 2017 lub nowszy: ta opcja dodaje strażników dla switch instrukcji generujących tabele skokowe.

Po określeniu /guard:cf opcji Control Flow Guard (CFG) kompilator i konsolidator wstaw dodatkowe testy zabezpieczeń środowiska uruchomieniowego w celu wykrycia prób naruszenia kodu. Podczas kompilowania i łączenia wszystkie wywołania pośrednie w kodzie są analizowane, aby znaleźć każdą lokalizację, z którą kod może uzyskać dostęp po jego prawidłowym uruchomieniu. Te informacje są przechowywane w dodatkowych strukturach w nagłówkach plików binarnych. Kompilator wprowadza również sprawdzanie przed każdym wywołaniem pośrednim w kodzie, które gwarantuje, że element docelowy jest jedną z zweryfikowanych lokalizacji. Jeśli sprawdzanie kończy się niepowodzeniem w czasie wykonywania w systemie operacyjnym obsługującym usługę CFG, system operacyjny zamyka program.

Typowy atak na oprogramowanie wykorzystuje błędy w obsłudze ekstremalnych lub nieoczekiwanych danych wejściowych. Starannie spreparowane dane wejściowe do aplikacji mogą zastąpić lokalizację zawierającą wskaźnik do kodu wykonywalnego. Ta technika może służyć do przekierowywania przepływu sterowania do kodu kontrolowanego przez osobę atakującą. Testy środowiska uruchomieniowego CFG nie usuwają usterek uszkodzenia danych w pliku wykonywalnego. Zamiast tego utrudniają atakującemu użycie ich do wykonywania dowolnego kodu. CFG to narzędzie do ograniczania ryzyka, które uniemożliwia wywołania do lokalizacji innych niż punkty wejścia funkcji w kodzie. Podobnie jak w przypadku sprawdzania /DYNAMICBASE stosu /GS oraz /HIGHENTROPYVA losowania układu przestrzeni adresowej (ASLR) mniejsze prawdopodobieństwo, że kod stanie się wektorem wykorzystującym luki w zabezpieczeniach.

Opcja /guard:cf musi zostać przekazana zarówno do kompilatora, jak i konsolidatora w celu skompilowania kodu korzystającego z techniki ograniczania ryzyka wykorzystującego luki CFG. Jeśli plik binarny jest kompilowany przy użyciu jednego cl polecenia, kompilator przekazuje opcję konsolidatorowi. Jeśli kompilujesz i łączysz oddzielnie, opcja musi być ustawiona zarówno w poleceniach kompilatora, jak i konsolidatora. Wymagana jest również opcja konsolidatora /DYNAMICBASE. Aby sprawdzić, czy plik binarny ma dane CFG, użyj dumpbin /headers /loadconfig polecenia . Pliki binarne z włączoną usługą CFG znajdują się Guard na liście cech PLIKU EXE lub DLL, a flagi funkcji Guard obejmują CF Instrumented i FID table present.

Opcja jest niezgodna /guard:cf z /ZI (Edytuj i kontynuuj informacje debugowania) lub /clr (kompilacja środowiska uruchomieniowego języka wspólnego).

Kod kompilowany za pomocą polecenia /guard:cf może być połączony z bibliotekami i plikami obiektów, które nie są kompilowane przy użyciu opcji . Tylko ten kod, jeśli jest również połączony za pomocą /guard:cf opcji i uruchamiany w systemie operacyjnym obsługującym usługę CFG, ma ochronę CFG. Ponieważ kod skompilowany bez opcji nie zatrzyma ataku, zalecamy użycie opcji we wszystkich skompilowanych kodzie. Istnieje niewielki koszt środowiska uruchomieniowego dla kontroli CFG, ale analiza kompilatora próbuje zoptymalizować kontrole skoków pośrednich, które mogą być bezpieczne.

Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio

  1. Otwórz okno dialogowe Strony właściwości dla projektu. Aby uzyskać więcej informacji, zobacz Ustawianie właściwości kompilatora i kompilacji.

  2. Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Code Generation.

  3. Wybierz właściwość Control Flow Guard.

  4. W kontrolce listy rozwijanej wybierz pozycję Tak , aby włączyć funkcję Control Flow Guard lub Nie , aby ją wyłączyć.

Zobacz też

Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC