/guard
(Abilitare La protezione del flusso di controllo)
Abilita la generazione dei controlli di sicurezza di Guard flusso di controllo nel compilatore.
Sintassi
/guard:cf
/guard:cf-
Osservazioni:
L'opzione /guard:cf
fa sì che il compilatore analizzi il flusso di controllo per le destinazioni di chiamata indirette in fase di compilazione e quindi inserisca il codice per verificare le destinazioni in fase di esecuzione. Per impostazione predefinita, /guard:cf
è disattivato e deve essere abilitato in modo esplicito. Per disabilitare in modo esplicito questa opzione, usare /guard:cf-
.
Visual Studio 2017 e versioni successive: questa opzione aggiunge guardie per switch
istruzioni che generano tabelle jump.
Quando si specifica l'opzione /guard:cf
Control Flow Guard (CFG), il compilatore e il linker inseriscono controlli di sicurezza di runtime aggiuntivi per rilevare i tentativi di compromissione del codice. Durante la compilazione e il collegamento tutte le chiamate indirette presenti nel codice vengono analizzate allo scopo di individuare tutte le posizioni raggiungibili dal codice quando viene eseguito correttamente. Queste informazioni vengono archiviate in strutture aggiuntive nelle intestazioni dei file binari. Il compilatore inserisce anche un controllo prima di ogni chiamata indiretta presente nel codice al fine di garantire che la destinazione corrisponde a una delle posizioni verificate. Se il controllo eseguito su un sistema operativo compatibile con Guard flusso di controllo non riesce in fase di esecuzione, il programma viene chiuso dal sistema operativo.
Un comune attacco al software sfrutta in genere bug che si riscontrano nella gestione di input imprevisti o particolari. Input appositamente creato e inviato a un'applicazione potrebbe ad esempio sovrascrivere una posizione che contiene un puntatore a codice eseguibile Questa tecnica può essere usata per reindirizzare il flusso di controllo al codice controllato dall'utente malintenzionato. I controlli del runtime cfg non consentono di correggere i bug di danneggiamento dei dati nel file eseguibile. ma possono contrastarne l'azione e impedire all'autore dell'attacco di usarli per eseguire codice arbitrario. Guard flusso di controllo è quindi uno strumento di prevenzione che impedisce chiamate a posizioni che non siano i punti di ingresso alle funzioni presenti nel codice. È simile al modo in cui La prevenzione dell'esecuzione dei dati (DEP), /GS stack controlla e /DYNAMICBASE
/HIGHENTROPYVA address space randomization (ASLR) riduce le probabilità che il codice diventi un vettore di exploit.
L'opzione /guard:cf
deve essere passata sia al compilatore che al linker per compilare il codice che usa la tecnica di mitigazione degli exploit cfg. Se il file binario viene compilato con un solo comando cl
, il compilatore passa l'opzione al linker. Se invece le operazioni di compilazione e collegamento vengono eseguite separatamente, l'opzione deve essere impostata nei comandi sia del compilatore che del linker. È richiesta anche l'opzione /DYNAMICBASE del linker. Per verificare che il file binario contenga i dati di Guard flusso di controllo, usare il comando dumpbin /headers /loadconfig
. I file binari abilitati per Guard flusso di controllo contengono Guard
nell'elenco delle caratteristiche dei file EXE o DLL, mentre i flag Guard includono CF Instrumented
e FID table present
.
L'opzione /guard:cf
non è compatibile con /ZI
(Modifica e continua informazioni di debug) o /clr
(Compilazione Common Language Runtime).
Il codice compilato tramite /guard:cf
può essere collegato a librerie e file oggetto non compilati usando l'opzione . Solo questo codice, se collegato anche tramite l'opzione /guard:cf
ed eseguito in un sistema operativo compatibile con CFG, dispone di protezione CFG. Poiché il codice compilato senza l'opzione non arresterà un attacco, è consigliabile usare l'opzione in tutto il codice compilato. È previsto un costo di runtime ridotto per i controlli cfg, ma l'analisi del compilatore tenta di ottimizzare i controlli sui salti indiretti che possono essere dimostrati sicuri.
Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio
Aprire la finestra di dialogo Pagine delle proprietà per il progetto. Per altre informazioni, vedere Impostare le proprietà del compilatore e della compilazione.
Selezionare la pagina delle proprietà Proprietà>di configurazione C/C++>Generazione codice.
Selezionare la proprietà Guard flusso di controllo .
Nel controllo a discesa scegliere Sì per abilitare Guard flusso di controllo oppure No per disabilitarlo.
Vedi anche
Opzioni del compilatore MSVC
Sintassi della riga di comando del compilatore MSVC