Condividi tramite


/guard:ehcont (Abilitare i metadati di continuazione EH)

Abilita la generazione di metadati EH Continuation (EHCONT) dal compilatore.

Sintassi

/guard:ehcont[-]

Osservazioni:

L'opzione /guard:ehcont fa sì che il compilatore generi un elenco ordinato degli indirizzi virtuali relativi di tutte le destinazioni di continuazione valide per la gestione delle eccezioni per un file binario. Viene usato durante il runtime per NtContinue la convalida del puntatore alle istruzioni e SetThreadContext . Per impostazione predefinita, /guard:ehcont è disattivato e deve essere abilitato in modo esplicito. Per disabilitare in modo esplicito questa opzione, usare /guard:ehcont-.

L'opzione /guard:ehcont è disponibile in Visual Studio 2019 versione 16.7 e successive. La funzionalità è supportata per i processi a 64 bit in un sistema operativo a 64 bit.

Control-flow Enforcement Technology (CET) è una funzionalità di sicurezza basata su hardware che protegge dagli attacchi basati su ROP (Return-Oriented Programming). Mantiene uno "stack shadow" per ogni stack di chiamate per applicare l'integrità del flusso di controllo.

Quando gli stack shadow sono disponibili per prevenire attacchi ROP, gli utenti malintenzionati passano all'uso di altre tecniche di exploit. Una tecnica che può essere usata consiste nel danneggiare il valore del puntatore dell'istruzione all'interno della struttura CONTEXT . Questa struttura viene passata nelle chiamate di sistema che reindirizzano l'esecuzione di un thread, ad esempio NtContinue, RtlRestoreContexte SetThreadContext. La CONTEXT struttura viene archiviata in memoria. Il danneggiamento del puntatore all'istruzione contenuto può causare il trasferimento dell'esecuzione da parte delle chiamate di sistema a un indirizzo controllato dall'utente malintenzionato. Attualmente, NTContinue può essere chiamato con qualsiasi punto di continuazione. Ecco perché è essenziale convalidare il puntatore all'istruzione quando gli stack shadow sono abilitati.

RtlRestoreContexte NtContinue vengono usati durante la rimozione delle eccezioni strutturate (edizione Standard H) per la rimozione nel frame di destinazione che contiene il __except blocco. Il puntatore all'istruzione del __except blocco non dovrebbe trovarsi nello stack di ombreggiature, perché non riuscirebbe la convalida del puntatore all'istruzione. L'opzione del /guard:ehcont compilatore genera una "Tabella continuazione EH". Contiene un elenco ordinato delle RVA di tutte le destinazioni di continuazione di gestione delle eccezioni valide nel file binario. NtContinue controlla innanzitutto lo stack di ombreggiature per il puntatore all'istruzione fornito dall'utente e, se il puntatore all'istruzione non è presente, procede per controllare la tabella di continuazione EH dal file binario che contiene il puntatore all'istruzione. Se il file binario contenitore non è stato compilato con la tabella, per garantire la compatibilità con i file binari legacy, NtContinue è consentito continuare. È importante distinguere tra file binari legacy senza dati EHCONT e file binari contenenti dati EHCONT, ma senza voci di tabella. Il primo consente tutti gli indirizzi all'interno del file binario come destinazioni di continuazione valide. Quest'ultimo non consente alcun indirizzo all'interno del file binario come destinazione di continuazione valida.

L'opzione /guard:ehcont deve essere passata sia al compilatore che al linker per generare RVA di destinazione della continuazione EH per un file binario. Se il file binario viene compilato con un solo comando cl , il compilatore passa l'opzione al linker. Il compilatore passa anche l'opzione /guard:cf al linker. Se si compila e si collega separatamente, queste opzioni devono essere impostate sui comandi del compilatore e del linker.

È possibile collegare il codice compilato usando /guard:ehcont le librerie e i file oggetto compilati senza di esso. Il linker restituisce un errore irreversibile in uno di questi scenari:

  • Una sezione di codice ha "rimozione locale". Per altre informazioni, vedere Terminazione anomala nell'istruzione try-finally.

  • Una sezione EH (xdata) contiene puntatori a una sezione di codice e non per edizione Standard H.

  • I puntatori sono per edizione Standard H, ma il file oggetto non è stato compilato usando il collegamento a livello di funzione (/Gy) per produrre COMDAT.

Il linker restituisce un errore irreversibile, perché non può generare metadati in questi scenari. Ciò significa che è probabile che la generazione di un'eccezione causi un arresto anomalo in fase di esecuzione.

Per informazioni sulla sezione edizione Standard H trovate in COMDAT, ma non compilate con /guard:ehcont, il linker genera un avviso LNK4291. In questo caso, il linker genera metadati corretti ma conservativi per la sezione. Per ignorare questo avviso, usare /IGNORE (Ignora avvisi specifici).To ignore this warning, use /IGNORE (Ignore Specific Warnings).

Se il linker non è in grado di generare metadati, genera uno degli errori seguenti:

  • 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.

Per verificare se un file binario contiene dati EHCONT, cercare gli elementi seguenti durante il dump della configurazione di caricamento del file binario:

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
...

Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio

  1. Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Impostare il compilatore e le proprietà di compilazione.

  2. Selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Generazione codice.

  3. Selezionare la proprietà Enable EH Continuation Metadata (Abilita metadati di continuazione EH).

  4. Nel controllo a discesa scegliere Sì (/guard:ehcont) per abilitare i metadati di continuazione EH o No (/guard:ehcont-) per disabilitarlo.

Vedi anche

/guard (abilita guard flusso di controllo)
Opzioni del compilatore MSVC
Sintassi della riga di comando del compilatore MSVC