/guard:ehcont
(Włącz metadane kontynuacji EH)
Umożliwia generowanie metadanych kontynuacji EH (EHCONT) przez kompilator.
Składnia
/guard:ehcont
[-
]
Uwagi
Opcja /guard:ehcont
powoduje, że kompilator generuje posortowaną listę względnych adresów wirtualnych (RVA) wszystkich prawidłowych elementów docelowych kontynuacji wyjątków dla pliku binarnego. Jest on używany w czasie wykonywania do NtContinue
sprawdzania poprawności wskaźnika instrukcji i SetThreadContext
. Domyślnie /guard:ehcont
jest wyłączona i musi być jawnie włączona. Aby jawnie wyłączyć tę opcję, użyj polecenia /guard:ehcont-
.
Opcja /guard:ehcont
jest dostępna w programie Visual Studio 2019 w wersji 16.7 lub nowszej. Ta funkcja jest obsługiwana w przypadku procesów 64-bitowych w 64-bitowym systemie operacyjnym.
Control-flow Enforcement Technology (CET) to funkcja zabezpieczeń oparta na sprzęcie, która chroni przed atakami opartymi na programowania zwrotnego (ROP). Utrzymuje on "stos w tle" dla każdego stosu wywołań w celu wymuszania integralności przepływu sterowania.
Gdy stosy w tle są dostępne w celu zapobiegania atakom ROP, osoby atakujące przechodzą do korzystania z innych technik wykorzystujących luki w zabezpieczeniach. Jedną z technik, których mogą używać, jest uszkodzenie wartości wskaźnika instrukcji wewnątrz struktury CONTEXT . Ta struktura jest przekazywana do wywołań systemowych, które przekierowuje wykonywanie wątku, takiego jak NtContinue
, RtlRestoreContext
i SetThreadContext
. Struktura CONTEXT
jest przechowywana w pamięci. Uszkodzenie wskaźnika instrukcji, który zawiera, może spowodować wywołania systemu w celu przeniesienia wykonania na adres kontrolowany przez osobę atakującą. NTContinue
Obecnie można wywołać metodę z dowolnym punktem kontynuacji. Dlatego ważne jest zweryfikowanie wskaźnika instrukcji po włączeniu stosów w tle.
RtlRestoreContext
i NtContinue
są używane podczas obsługi wyjątków strukturalnych (SEH) odwijania się do ramki docelowej, która zawiera __except
blok. Wskaźnik instrukcji __except
bloku nie powinien znajdować się w stosie w tle, ponieważ walidacja wskaźnika instrukcji zakończy się niepowodzeniem. Przełącznik kompilatora /guard:ehcont
generuje tabelę kontynuacji EH. Zawiera posortowaną listę obiektów RVA wszystkich prawidłowych obiektów docelowych kontynuacji wyjątków w pliku binarnym. NtContinue
Najpierw sprawdza stos w tle dla wskaźnika instrukcji dostarczonej przez użytkownika, a jeśli wskaźnik instrukcji nie zostanie tam znaleziony, przejdzie do sprawdzenia tabeli kontynuacji EH z pliku binarnego zawierającego wskaźnik instrukcji. Jeśli plik binarny zawierający nie został skompilowany z tabelą, w celu zachowania zgodności ze starszymi plikami binarnymi NtContinue
można kontynuować. Ważne jest, aby odróżnić starsze pliki binarne, które nie mają danych EHCONT, a pliki binarne zawierające dane EHCONT, ale bez wpisów tabeli. Pierwsza zezwala na wszystkie adresy wewnątrz pliku binarnego jako prawidłowe obiekty docelowe kontynuacji. Ten ostatni nie zezwala na żaden adres wewnątrz pliku binarnego jako prawidłowy element docelowy kontynuacji.
Opcja /guard:ehcont
musi zostać przekazana zarówno do kompilatora, jak i konsolidatora, aby wygenerować docelowe RVA kontynuacji EH dla pliku binarnego. Jeśli plik binarny jest kompilowany przy użyciu jednego cl
polecenia, kompilator przekazuje opcję konsolidatorowi. Kompilator przekazuje /guard:cf
również opcję konsolidatorowi. Jeśli kompilujesz i łączysz oddzielnie, te opcje muszą być ustawione zarówno w poleceniach kompilatora, jak i konsolidatora.
Kod skompilowany za pomocą polecenia można połączyć z /guard:ehcont
bibliotekami i plikami obiektów skompilowanymi bez niego. Konsolidator zwraca błąd krytyczny w dowolnym z tych scenariuszy:
Sekcja kodu zawiera "lokalne odwijaj się". Aby uzyskać więcej informacji, zobacz Nieprawidłowe zakończenie w instrukcji try-finally.
Sekcja EH (xdata) zawiera wskaźniki do sekcji kodu i nie są przeznaczone dla protokołu SEH.
Wskaźniki są przeznaczone dla SEH, ale plik obiektu nie został skompilowany przy użyciu łączenia na poziomie funkcji (/Gy) do tworzenia comDATs.
Konsolidator zwraca błąd krytyczny, ponieważ nie może wygenerować metadanych w tych scenariuszach. Oznacza to, że zgłoszenie wyjątku może spowodować awarię w czasie wykonywania.
W przypadku informacji o sekcji SEH znalezionych w comDATs, ale nie skompilowanych przy użyciu polecenia /guard:ehcont
, konsolidator emituje ostrzeżenie LNK4291. W takim przypadku konsolidator generuje poprawne, ale konserwatywne metadane sekcji. Aby zignorować to ostrzeżenie, użyj / IGNORE (Ignoruj określone ostrzeżenia).
Jeśli konsolidator nie może wygenerować metadanych, emituje jeden z następujących błędów:
LNK2046: module contains _local_unwind but was not compiled with /guard:ehcont
LNK2047: module contains C++ EH or complex EH metadata but was not compiled with /guard:ehcont.
Aby sprawdzić, czy plik binarny zawiera dane EHCONT, poszukaj następujących elementów podczas dumpingu konfiguracji obciążenia pliku binarnego:
e:\>link /dump /loadconfig CETTest.exe
...
10417500 Guard Flags
...
EH Continuation table present // EHCONT guard flag present
...
0000000180018640 Guard EH continuation table
37 Guard EH continuation count // May be 0 if no exception handling is used in the binary. Still counts has having EHCONT data.
...
Guard EH Continuation Table // List of RVAs
Address
--------
0000000180002CF5
0000000180002F03
0000000180002F0A
...
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
Wybierz stronę właściwości Właściwości>konfiguracji C/C++>Code Generation.
Wybierz właściwość Włącz metadane kontynuacji EH.
W kontrolce listy rozwijanej wybierz pozycję Tak (/guard:ehcont), aby włączyć metadane kontynuacji EH lub nie (/guard:ehcont-), aby ją wyłączyć.
Zobacz też
/guard (Włącz ochronę przepływu sterowania)
Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC